Commit 4d2825a3 authored by Michael Niedermayer's avatar Michael Niedermayer

Merge commit '7d039e70'

* commit '7d039e70':
  wavpack: extract channel information from the bitstream
Merged-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parents 8543575c 7d039e70
...@@ -43,6 +43,10 @@ ...@@ -43,6 +43,10 @@
#define WV_HYBRID_SHAPE 0x00000008 #define WV_HYBRID_SHAPE 0x00000008
#define WV_HYBRID_BITRATE 0x00000200 #define WV_HYBRID_BITRATE 0x00000200
#define WV_HYBRID_BALANCE 0x00000400 #define WV_HYBRID_BALANCE 0x00000400
#define WV_INITIAL_BLOCK 0x00000800
#define WV_FINAL_BLOCK 0x00001000
#define WV_SINGLE_BLOCK (WV_INITIAL_BLOCK | WV_FINAL_BLOCK)
#define WV_FLT_SHIFT_ONES 0x01 #define WV_FLT_SHIFT_ONES 0x01
#define WV_FLT_SHIFT_SAME 0x02 #define WV_FLT_SHIFT_SAME 0x02
...@@ -137,7 +141,6 @@ typedef struct WavpackContext { ...@@ -137,7 +141,6 @@ typedef struct WavpackContext {
WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS]; WavpackFrameContext *fdec[WV_MAX_FRAME_DECODERS];
int fdec_num; int fdec_num;
int multichannel;
int block; int block;
int samples; int samples;
int ch_offset; int ch_offset;
...@@ -730,12 +733,6 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx) ...@@ -730,12 +733,6 @@ static av_cold int wavpack_decode_init(AVCodecContext *avctx)
s->avctx = avctx; s->avctx = avctx;
if (avctx->channels <= 2 && !avctx->channel_layout)
avctx->channel_layout = (avctx->channels == 2) ? AV_CH_LAYOUT_STEREO
: AV_CH_LAYOUT_MONO;
s->multichannel = avctx->channels > 2;
s->fdec_num = 0; s->fdec_num = 0;
return 0; return 0;
...@@ -764,7 +761,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -764,7 +761,8 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
int got_terms = 0, got_weights = 0, got_samples = 0, int got_terms = 0, got_weights = 0, got_samples = 0,
got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0; got_entropy = 0, got_bs = 0, got_float = 0, got_hybrid = 0;
int i, j, id, size, ssize, weights, t; int i, j, id, size, ssize, weights, t;
int bpp, chan, chmask, orig_bpp, sample_rate = 0; int bpp, chan = 0, chmask = 0, orig_bpp, sample_rate = 0;
int multiblock;
if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) { if (block_no >= wc->fdec_num && wv_alloc_frame_context(wc) < 0) {
av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n"); av_log(avctx, AV_LOG_ERROR, "Error creating frame decode context\n");
...@@ -795,6 +793,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -795,6 +793,7 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
s->frame_flags = bytestream2_get_le32(&gb); s->frame_flags = bytestream2_get_le32(&gb);
bpp = av_get_bytes_per_sample(avctx->sample_fmt); bpp = av_get_bytes_per_sample(avctx->sample_fmt);
orig_bpp = ((s->frame_flags & 0x03) + 1) << 3; orig_bpp = ((s->frame_flags & 0x03) + 1) << 3;
multiblock = (s->frame_flags & WV_SINGLE_BLOCK) != WV_SINGLE_BLOCK;
s->stereo = !(s->frame_flags & WV_MONO); s->stereo = !(s->frame_flags & WV_MONO);
s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo; s->stereo_in = (s->frame_flags & WV_FALSE_STEREO) ? 0 : s->stereo;
...@@ -1050,15 +1049,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -1050,15 +1049,6 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
chan = avctx->channels; chan = avctx->channels;
chmask = avctx->channel_layout; chmask = avctx->channel_layout;
} }
if (chan != avctx->channels) {
av_log(avctx, AV_LOG_ERROR,
"Block reports total %d channels, "
"decoder believes it's %d channels\n",
chan, avctx->channels);
return AVERROR_INVALIDDATA;
}
if (!avctx->channel_layout)
avctx->channel_layout = chmask;
break; break;
case WP_ID_SAMPLE_RATE: case WP_ID_SAMPLE_RATE:
if (size != 3) { if (size != 3) {
...@@ -1122,6 +1112,17 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no, ...@@ -1122,6 +1112,17 @@ static int wavpack_decode_block(AVCodecContext *avctx, int block_no,
} else } else
avctx->sample_rate = wv_rates[sr]; avctx->sample_rate = wv_rates[sr];
if (multiblock) {
if (chan)
avctx->channels = chan;
if (chmask)
avctx->channel_layout = chmask;
} else {
avctx->channels = s->stereo ? 2 : 1;
avctx->channel_layout = s->stereo ? AV_CH_LAYOUT_STEREO :
AV_CH_LAYOUT_MONO;
}
/* get output buffer */ /* get output buffer */
frame->nb_samples = s->samples + 1; frame->nb_samples = s->samples + 1;
if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) { if ((ret = ff_get_buffer(avctx, frame, 0)) < 0) {
......
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