From e2ceb17642f374a7df8f1f5d3d2b2446525bc7fb Mon Sep 17 00:00:00 2001 From: Anton Khirnov Date: Tue, 26 Nov 2013 14:22:10 +0100 Subject: mpeg4videodec: move mpeg4-specific post-frame-decode code from h264dec to mpeg4videodec --- libavcodec/mpeg4videodec.c | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) (limited to 'libavcodec/mpeg4videodec.c') diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c index c42da7f11c..9a5a3b6ac6 100644 --- a/libavcodec/mpeg4videodec.c +++ b/libavcodec/mpeg4videodec.c @@ -2492,6 +2492,49 @@ end: return decode_vop_header(ctx, gb); } +int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size) +{ + Mpeg4DecContext *ctx = avctx->priv_data; + MpegEncContext *s = &ctx->m; + + /* divx 5.01+ bistream reorder stuff */ + if (s->divx_packed) { + int current_pos = get_bits_count(&s->gb) >> 3; + int startcode_found = 0; + + if (buf_size - current_pos > 5) { + int i; + for (i = current_pos; i < buf_size - 3; i++) + if (buf[i] == 0 && + buf[i + 1] == 0 && + buf[i + 2] == 1 && + buf[i + 3] == 0xB6) { + startcode_found = 1; + break; + } + } + if (s->gb.buffer == s->bitstream_buffer && buf_size > 7 && + s->xvid_build >= 0) { // xvid style + startcode_found = 1; + current_pos = 0; + } + + if (startcode_found) { + av_fast_malloc(&s->bitstream_buffer, + &s->allocated_bitstream_buffer_size, + buf_size - current_pos + + FF_INPUT_BUFFER_PADDING_SIZE); + if (!s->bitstream_buffer) + return AVERROR(ENOMEM); + memcpy(s->bitstream_buffer, buf + current_pos, + buf_size - current_pos); + s->bitstream_buffer_size = buf_size - current_pos; + } + } + + return 0; +} + static int mpeg4_update_thread_context(AVCodecContext *dst, const AVCodecContext *src) { -- cgit v1.2.3