[FFmpeg-cvslog] mpeg4videodec: move mpeg4-specific post-frame-decode code from h264dec to mpeg4videodec

Anton Khirnov git at videolan.org
Sat Nov 30 02:50:03 CET 2013


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Tue Nov 26 14:22:10 2013 +0100| [e2ceb17642f374a7df8f1f5d3d2b2446525bc7fb] | committer: Anton Khirnov

mpeg4videodec: move mpeg4-specific post-frame-decode code from h264dec to mpeg4videodec

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e2ceb17642f374a7df8f1f5d3d2b2446525bc7fb
---

 libavcodec/h263dec.c       |   35 ++---------------------------------
 libavcodec/mpeg4video.h    |    1 +
 libavcodec/mpeg4videodec.c |   43 +++++++++++++++++++++++++++++++++++++++++++
 3 files changed, 46 insertions(+), 33 deletions(-)

diff --git a/libavcodec/h263dec.c b/libavcodec/h263dec.c
index 9c8d355..6c2f322 100644
--- a/libavcodec/h263dec.c
+++ b/libavcodec/h263dec.c
@@ -593,40 +593,9 @@ int ff_h263_decode_frame(AVCodecContext *avctx, void *data, int *got_frame,
             s->er.error_status_table[s->mb_num - 1] = ER_MB_ERROR;
 
     assert(s->bitstream_buffer_size == 0);
-    /* divx 5.01+ bistream reorder stuff */
-    if (s->codec_id == AV_CODEC_ID_MPEG4 && 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;
-        }
-    }
+    if (CONFIG_MPEG4_DECODER && avctx->codec_id == AV_CODEC_ID_MPEG4)
+        ff_mpeg4_frame_end(avctx, buf, buf_size);
 
 intrax8_decoded:
     ff_er_frame_end(&s->er);
diff --git a/libavcodec/mpeg4video.h b/libavcodec/mpeg4video.h
index 1bdae38..046ef51 100644
--- a/libavcodec/mpeg4video.h
+++ b/libavcodec/mpeg4video.h
@@ -118,6 +118,7 @@ int ff_mpeg4_decode_partitions(Mpeg4DecContext *ctx);
 int ff_mpeg4_get_video_packet_prefix_length(MpegEncContext *s);
 int ff_mpeg4_decode_video_packet_header(Mpeg4DecContext *ctx);
 void ff_mpeg4_init_direct_mv(MpegEncContext *s);
+int ff_mpeg4_frame_end(AVCodecContext *avctx, const uint8_t *buf, int buf_size);
 
 /**
  *
diff --git a/libavcodec/mpeg4videodec.c b/libavcodec/mpeg4videodec.c
index c42da7f..9a5a3b6 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)
 {



More information about the ffmpeg-cvslog mailing list