Commit cfa7709d authored by Paul B Mahol's avatar Paul B Mahol

avcodec/wavpack: fix decoding of files with many channels

Fixes decoding of Run_The_Race_-_3rd_Order_Ambisonic_SN3D.wv
parent 1a6cca19
...@@ -940,13 +940,23 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -940,13 +940,23 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
case 3: case 3:
chmask = bytestream2_get_le32(&gb); chmask = bytestream2_get_le32(&gb);
break; break;
case 5: case 4:
size = bytestream2_get_byte(&gb); size = bytestream2_get_byte(&gb);
if (avctx->channels != size) chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
chan += 1;
if (avctx->channels != chan)
av_log(avctx, AV_LOG_WARNING, "%i channels signalled" av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
" instead of %i.\n", size, avctx->channels); " instead of %i.\n", chan, avctx->channels);
chmask = bytestream2_get_le24(&gb);
break;
case 5:
size = bytestream2_get_byte(&gb);
chan |= (bytestream2_get_byte(&gb) & 0xF) << 8; chan |= (bytestream2_get_byte(&gb) & 0xF) << 8;
chmask = bytestream2_get_le16(&gb); chan += 1;
if (avctx->channels != chan)
av_log(avctx, AV_LOG_WARNING, "%i channels signalled"
" instead of %i.\n", chan, avctx->channels);
chmask = bytestream2_get_le32(&gb);
break; break;
default: default:
av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n", av_log(avctx, AV_LOG_ERROR, "Invalid channel info size %d\n",
......
...@@ -153,11 +153,18 @@ static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb) ...@@ -153,11 +153,18 @@ static int wv_read_block_header(AVFormatContext *ctx, AVIOContext *pb)
case 3: case 3:
chmask = avio_rl32(pb); chmask = avio_rl32(pb);
break; break;
case 5: case 4:
avio_skip(pb, 1); avio_skip(pb, 1);
chan |= (avio_r8(pb) & 0xF) << 8; chan |= (avio_r8(pb) & 0xF) << 8;
chan += 1;
chmask = avio_rl24(pb); chmask = avio_rl24(pb);
break; break;
case 5:
avio_skip(pb, 1);
chan |= (avio_r8(pb) & 0xF) << 8;
chan += 1;
chmask = avio_rl32(pb);
break;
default: default:
av_log(ctx, AV_LOG_ERROR, av_log(ctx, AV_LOG_ERROR,
"Invalid channel info size %d\n", size); "Invalid channel info size %d\n", size);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment