OSDN Git Service

mpeg4videodec: move mpeg4-specific post-frame-decode code from h264dec to mpeg4videodec
authorAnton Khirnov <anton@khirnov.net>
Tue, 26 Nov 2013 13:22:10 +0000 (14:22 +0100)
committerAnton Khirnov <anton@khirnov.net>
Fri, 29 Nov 2013 13:19:47 +0000 (14:19 +0100)
libavcodec/h263dec.c
libavcodec/mpeg4video.h
libavcodec/mpeg4videodec.c

index 9c8d355..6c2f322 100644 (file)
@@ -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);
index 1bdae38..046ef51 100644 (file)
@@ -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);
 
 /**
  *
index c42da7f..9a5a3b6 100644 (file)
@@ -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)
 {