Commit 187c4273 authored by Paul B Mahol's avatar Paul B Mahol

avcodec/on2avc: add 0x500 stereo support and improve 0x500 mono support

0x500 can be stereo.
0x500 mono can use extended window types.
Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 257fbc3a
...@@ -685,11 +685,11 @@ static void wtf_44(On2AVCContext *c, float *out, float *src, int size) ...@@ -685,11 +685,11 @@ static void wtf_44(On2AVCContext *c, float *out, float *src, int size)
} }
} }
static int on2avc_reconstruct_stereo(On2AVCContext *c, AVFrame *dst, int offset) static int on2avc_reconstruct_channel_ext(On2AVCContext *c, AVFrame *dst, int offset)
{ {
int ch, i; int ch, i;
for (ch = 0; ch < 2; ch++) { for (ch = 0; ch < c->avctx->channels; ch++) {
float *out = (float*)dst->extended_data[ch] + offset; float *out = (float*)dst->extended_data[ch] + offset;
float *in = c->coeffs[ch]; float *in = c->coeffs[ch];
float *saved = c->delay[ch]; float *saved = c->delay[ch];
...@@ -810,10 +810,6 @@ static int on2avc_decode_subframe(On2AVCContext *c, const uint8_t *buf, ...@@ -810,10 +810,6 @@ static int on2avc_decode_subframe(On2AVCContext *c, const uint8_t *buf,
} }
c->prev_window_type = c->window_type; c->prev_window_type = c->window_type;
c->window_type = get_bits(&gb, 3); c->window_type = get_bits(&gb, 3);
if (c->window_type >= WINDOW_TYPE_EXT4 && c->avctx->channels == 1) {
av_log(c->avctx, AV_LOG_ERROR, "stereo mode window for mono audio\n");
return AVERROR_INVALIDDATA;
}
c->band_start = c->modes[c->window_type].band_start; c->band_start = c->modes[c->window_type].band_start;
c->num_windows = c->modes[c->window_type].num_windows; c->num_windows = c->modes[c->window_type].num_windows;
...@@ -834,7 +830,7 @@ static int on2avc_decode_subframe(On2AVCContext *c, const uint8_t *buf, ...@@ -834,7 +830,7 @@ static int on2avc_decode_subframe(On2AVCContext *c, const uint8_t *buf,
for (i = 0; i < c->avctx->channels; i++) for (i = 0; i < c->avctx->channels; i++)
on2avc_reconstruct_channel(c, i, dst, offset); on2avc_reconstruct_channel(c, i, dst, offset);
} else { } else {
on2avc_reconstruct_stereo(c, dst, offset); on2avc_reconstruct_channel_ext(c, dst, offset);
} }
return 0; return 0;
...@@ -923,10 +919,6 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx) ...@@ -923,10 +919,6 @@ static av_cold int on2avc_decode_init(AVCodecContext *avctx)
: AV_CH_LAYOUT_MONO; : AV_CH_LAYOUT_MONO;
c->is_av500 = (avctx->codec_tag == 0x500); c->is_av500 = (avctx->codec_tag == 0x500);
if (c->is_av500 && avctx->channels == 2) {
av_log(avctx, AV_LOG_ERROR, "0x500 version should be mono\n");
return AVERROR_INVALIDDATA;
}
if (avctx->channels == 2) if (avctx->channels == 2)
av_log(avctx, AV_LOG_WARNING, av_log(avctx, AV_LOG_WARNING,
......
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