X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=libavcodec%2Fwmaprodec.c;h=4d530264dfd98cb3bb8750ca2e1c04778cecb230;hb=ce79410bba776d4121685654056f2b4e39bbd3f7;hp=55a48078dbd2b7c09595b6f6fe42e9f3139318e2;hpb=45f4bf94afb8b70d99fb7b5760fd65f5c3ad8b88;p=ffmpeg diff --git a/libavcodec/wmaprodec.c b/libavcodec/wmaprodec.c index 55a48078dbd..4d530264dfd 100644 --- a/libavcodec/wmaprodec.c +++ b/libavcodec/wmaprodec.c @@ -1755,8 +1755,9 @@ static int xma_decode_packet(AVCodecContext *avctx, void *data, if (got_stream_frame_ptr) { memcpy(&s->samples[s->current_stream * 2 + 0][s->offset[s->current_stream] * 512], s->frames[s->current_stream]->extended_data[0], 512 * 4); - memcpy(&s->samples[s->current_stream * 2 + 1][s->offset[s->current_stream] * 512], - s->frames[s->current_stream]->extended_data[1], 512 * 4); + if (avctx->channels > 1) + memcpy(&s->samples[s->current_stream * 2 + 1][s->offset[s->current_stream] * 512], + s->frames[s->current_stream]->extended_data[1], 512 * 4); s->offset[s->current_stream]++; } @@ -1794,7 +1795,7 @@ static int xma_decode_packet(AVCodecContext *avctx, void *data, s->xma[i].skip_packets = FFMAX(0, s->xma[i].skip_packets - 1); } - for (i = 0; i < avctx->channels / 2; i++) { + for (i = 0; i < (avctx->channels + 1) / 2; i++) { offset = FFMIN(offset, s->offset[i]); } @@ -1803,13 +1804,15 @@ static int xma_decode_packet(AVCodecContext *avctx, void *data, if ((bret = ff_get_buffer(avctx, frame, 0)) < 0) return bret; - for (i = 0; i < avctx->channels / 2; i++) { + for (i = 0; i < (avctx->channels + 1) / 2; i++) { memcpy(frame->extended_data[i * 2 + 0], s->samples[i * 2 + 0], frame->nb_samples * 4); - memcpy(frame->extended_data[i * 2 + 1], s->samples[i * 2 + 1], frame->nb_samples * 4); + if (avctx->channels > 1) + memcpy(frame->extended_data[i * 2 + 1], s->samples[i * 2 + 1], frame->nb_samples * 4); s->offset[i] -= offset; if (s->offset[i]) { memmove(s->samples[i * 2 + 0], s->samples[i * 2 + 0] + frame->nb_samples, s->offset[i] * 4 * 512); - memmove(s->samples[i * 2 + 1], s->samples[i * 2 + 1] + frame->nb_samples, s->offset[i] * 4 * 512); + if (avctx->channels > 1) + memmove(s->samples[i * 2 + 1], s->samples[i * 2 + 1] + frame->nb_samples, s->offset[i] * 4 * 512); } } @@ -1858,13 +1861,8 @@ static av_cold int xma_decode_end(AVCodecContext *avctx) return 0; } -/** - *@brief Clear decoder buffers (for seeking). - *@param avctx codec context - */ -static void flush(AVCodecContext *avctx) +static void flush(WMAProDecodeCtx *s) { - WMAProDecodeCtx *s = avctx->priv_data; int i; /** reset output buffer as a part of it is used during the windowing of a new frame */ @@ -1872,6 +1870,30 @@ static void flush(AVCodecContext *avctx) memset(s->channel[i].out, 0, s->samples_per_frame * sizeof(*s->channel[i].out)); s->packet_loss = 1; + s->skip_packets = 0; +} + + +/** + *@brief Clear decoder buffers (for seeking). + *@param avctx codec context + */ +static void wmapro_flush(AVCodecContext *avctx) +{ + WMAProDecodeCtx *s = avctx->priv_data; + + flush(s); +} + +static void xma_flush(AVCodecContext *avctx) +{ + XMADecodeCtx *s = avctx->priv_data; + int i; + for (i = 0; i < (avctx->channels + 1) / 2; i++) + flush(&s->xma[i]); + + memset(s->offset, 0, sizeof(s->offset)); + s->current_stream = 0; } @@ -1888,7 +1910,7 @@ AVCodec ff_wmapro_decoder = { .close = wmapro_decode_end, .decode = wmapro_decode_packet, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, - .flush = flush, + .flush = wmapro_flush, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE }, }; @@ -1916,6 +1938,7 @@ AVCodec ff_xma2_decoder = { .init = xma_decode_init, .close = xma_decode_end, .decode = xma_decode_packet, + .flush = xma_flush, .capabilities = AV_CODEC_CAP_SUBFRAMES | AV_CODEC_CAP_DR1, .sample_fmts = (const enum AVSampleFormat[]) { AV_SAMPLE_FMT_FLTP, AV_SAMPLE_FMT_NONE },