[FFmpeg-cvslog] mpegvideo_enc: switch to encode2().

Anton Khirnov git at videolan.org
Mon Feb 20 01:42:26 CET 2012


ffmpeg | branch: master | Anton Khirnov <anton at khirnov.net> | Fri Feb 10 10:30:05 2012 +0100| [445a7d48b13c8c6607b69156233fc8d5fed3b396] | committer: Anton Khirnov

mpegvideo_enc: switch to encode2().

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

 libavcodec/flvenc.c        |    2 +-
 libavcodec/h261enc.c       |    2 +-
 libavcodec/mjpegenc.c      |    2 +-
 libavcodec/mpeg12enc.c     |    4 ++--
 libavcodec/mpeg4videoenc.c |    2 +-
 libavcodec/mpegvideo.h     |   11 ++++++++++-
 libavcodec/mpegvideo_enc.c |   44 ++++++++++++++++++++++++++++++++------------
 libavcodec/rv10enc.c       |    2 +-
 libavcodec/rv20enc.c       |    2 +-
 libavcodec/wmv2enc.c       |    2 +-
 10 files changed, 51 insertions(+), 22 deletions(-)

diff --git a/libavcodec/flvenc.c b/libavcodec/flvenc.c
index 822dba9..332592d 100644
--- a/libavcodec/flvenc.c
+++ b/libavcodec/flvenc.c
@@ -90,7 +90,7 @@ AVCodec ff_flv_encoder = {
     .id             = CODEC_ID_FLV1,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("Flash Video (FLV) / Sorenson Spark / Sorenson H.263"),
diff --git a/libavcodec/h261enc.c b/libavcodec/h261enc.c
index d33c724..0ae48ca 100644
--- a/libavcodec/h261enc.c
+++ b/libavcodec/h261enc.c
@@ -327,7 +327,7 @@ AVCodec ff_h261_encoder = {
     .id             = CODEC_ID_H261,
     .priv_data_size = sizeof(H261Context),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("H.261"),
diff --git a/libavcodec/mjpegenc.c b/libavcodec/mjpegenc.c
index ef47cea..bb036ef 100644
--- a/libavcodec/mjpegenc.c
+++ b/libavcodec/mjpegenc.c
@@ -451,7 +451,7 @@ AVCodec ff_mjpeg_encoder = {
     .id             = CODEC_ID_MJPEG,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUVJ420P, PIX_FMT_YUVJ422P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("MJPEG (Motion JPEG)"),
diff --git a/libavcodec/mpeg12enc.c b/libavcodec/mpeg12enc.c
index be2f1e9..c53d99b 100644
--- a/libavcodec/mpeg12enc.c
+++ b/libavcodec/mpeg12enc.c
@@ -954,7 +954,7 @@ AVCodec ff_mpeg1video_encoder = {
     .id             = CODEC_ID_MPEG1VIDEO,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .supported_framerates= avpriv_frame_rate_tab+1,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
@@ -969,7 +969,7 @@ AVCodec ff_mpeg2video_encoder = {
     .id             = CODEC_ID_MPEG2VIDEO,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .supported_framerates= avpriv_frame_rate_tab+1,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_YUV422P, PIX_FMT_NONE},
diff --git a/libavcodec/mpeg4videoenc.c b/libavcodec/mpeg4videoenc.c
index 633c8d2..d512daa 100644
--- a/libavcodec/mpeg4videoenc.c
+++ b/libavcodec/mpeg4videoenc.c
@@ -1336,7 +1336,7 @@ AVCodec ff_mpeg4_encoder = {
     .id             = CODEC_ID_MPEG4,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .capabilities= CODEC_CAP_DELAY | CODEC_CAP_SLICE_THREADS,
diff --git a/libavcodec/mpegvideo.h b/libavcodec/mpegvideo.h
index e542369..9753d10 100644
--- a/libavcodec/mpegvideo.h
+++ b/libavcodec/mpegvideo.h
@@ -261,6 +261,14 @@ typedef struct MpegEncContext {
      *          offsets used in asm. */
 
     int64_t user_specified_pts;///< last non zero pts from AVFrame which was passed into avcodec_encode_video()
+    /**
+     * pts difference between the first and second input frame, used for
+     * calculating dts of the first frame when there's a delay */
+    int64_t dts_delta;
+    /**
+     * reordered pts to be used as dts for the next output frame when there's
+     * a delay */
+    int64_t reordered_pts;
 
     /** bit output */
     PutBitContext pb;
@@ -694,7 +702,8 @@ int ff_MPV_frame_start(MpegEncContext *s, AVCodecContext *avctx);
 void ff_MPV_frame_end(MpegEncContext *s);
 int ff_MPV_encode_init(AVCodecContext *avctx);
 int ff_MPV_encode_end(AVCodecContext *avctx);
-int ff_MPV_encode_picture(AVCodecContext *avctx, unsigned char *buf, int buf_size, void *data);
+int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
+                          const AVFrame *frame, int *got_packet);
 void ff_MPV_common_init_mmx(MpegEncContext *s);
 void ff_MPV_common_init_axp(MpegEncContext *s);
 void ff_MPV_common_init_mmi(MpegEncContext *s);
diff --git a/libavcodec/mpegvideo_enc.c b/libavcodec/mpegvideo_enc.c
index d8a7c70..68adef7 100644
--- a/libavcodec/mpegvideo_enc.c
+++ b/libavcodec/mpegvideo_enc.c
@@ -909,6 +909,9 @@ static int load_input_picture(MpegEncContext *s, AVFrame *pic_arg)
                            "last=%"PRId64"\n", pts, s->user_specified_pts);
                     return -1;
                 }
+
+                if (!s->low_delay && pic_arg->display_picture_number == 1)
+                    s->dts_delta = time - last;
             }
             s->user_specified_pts = pts;
         } else {
@@ -1374,20 +1377,23 @@ no_output_pic:
     return 0;
 }
 
-int ff_MPV_encode_picture(AVCodecContext *avctx,
-                          unsigned char *buf, int buf_size, void *data)
+int ff_MPV_encode_picture(AVCodecContext *avctx, AVPacket *pkt,
+                          const AVFrame *pic_arg, int *got_packet)
 {
     MpegEncContext *s = avctx->priv_data;
-    AVFrame *pic_arg  = data;
-    int i, stuffing_count;
+    int i, stuffing_count, ret;
     int context_count = s->slice_context_count;
 
+    if (!pkt->data &&
+        (ret = ff_alloc_packet(pkt, s->mb_width*s->mb_height*MAX_MB_BYTES)) < 0)
+        return ret;
+
     for (i = 0; i < context_count; i++) {
         int start_y = s->thread_context[i]->start_mb_y;
         int   end_y = s->thread_context[i]->  end_mb_y;
         int h       = s->mb_height;
-        uint8_t *start = buf + (size_t)(((int64_t) buf_size) * start_y / h);
-        uint8_t *end   = buf + (size_t)(((int64_t) buf_size) *   end_y / h);
+        uint8_t *start = pkt->data + (size_t)(((int64_t) pkt->size) * start_y / h);
+        uint8_t *end   = pkt->data + (size_t)(((int64_t) pkt->size) *   end_y / h);
 
         init_put_bits(&s->thread_context[i]->pb, start, end - start);
     }
@@ -1547,13 +1553,27 @@ vbv_retry:
         }
         s->total_bits     += s->frame_bits;
         avctx->frame_bits  = s->frame_bits;
+
+        pkt->pts = s->current_picture.f.pts;
+        if (!s->low_delay) {
+            if (!s->current_picture.f.coded_picture_number)
+                pkt->dts = pkt->pts - s->dts_delta;
+            else
+                pkt->dts = s->reordered_pts;
+            s->reordered_pts = s->input_picture[0]->f.pts;
+        } else
+            pkt->dts = pkt->pts;
+        if (s->current_picture.f.key_frame)
+            pkt->flags |= AV_PKT_FLAG_KEY;
     } else {
         assert((put_bits_ptr(&s->pb) == s->pb.buf));
         s->frame_bits = 0;
     }
     assert((s->frame_bits & 7) == 0);
 
-    return s->frame_bits / 8;
+    pkt->size = s->frame_bits / 8;
+    *got_packet = !!pkt->size;
+    return 0;
 }
 
 static inline void dct_single_coeff_elimination(MpegEncContext *s,
@@ -4042,7 +4062,7 @@ AVCodec ff_h263_encoder = {
     .id             = CODEC_ID_H263,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("H.263 / H.263-1996"),
@@ -4069,7 +4089,7 @@ AVCodec ff_h263p_encoder = {
     .id             = CODEC_ID_H263P,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .capabilities = CODEC_CAP_SLICE_THREADS,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
@@ -4083,7 +4103,7 @@ AVCodec ff_msmpeg4v2_encoder = {
     .id             = CODEC_ID_MSMPEG4V2,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 2"),
@@ -4095,7 +4115,7 @@ AVCodec ff_msmpeg4v3_encoder = {
     .id             = CODEC_ID_MSMPEG4V3,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("MPEG-4 part 2 Microsoft variant version 3"),
@@ -4107,7 +4127,7 @@ AVCodec ff_wmv1_encoder = {
     .id             = CODEC_ID_WMV1,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 7"),
diff --git a/libavcodec/rv10enc.c b/libavcodec/rv10enc.c
index 0591cec..47fb222 100644
--- a/libavcodec/rv10enc.c
+++ b/libavcodec/rv10enc.c
@@ -62,7 +62,7 @@ AVCodec ff_rv10_encoder = {
     .id             = CODEC_ID_RV10,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("RealVideo 1.0"),
diff --git a/libavcodec/rv20enc.c b/libavcodec/rv20enc.c
index bd80c15..ace70d1 100644
--- a/libavcodec/rv20enc.c
+++ b/libavcodec/rv20enc.c
@@ -63,7 +63,7 @@ AVCodec ff_rv20_encoder = {
     .id             = CODEC_ID_RV20,
     .priv_data_size = sizeof(MpegEncContext),
     .init           = ff_MPV_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("RealVideo 2.0"),
diff --git a/libavcodec/wmv2enc.c b/libavcodec/wmv2enc.c
index 5ef8d8c..4948a29 100644
--- a/libavcodec/wmv2enc.c
+++ b/libavcodec/wmv2enc.c
@@ -217,7 +217,7 @@ AVCodec ff_wmv2_encoder = {
     .id             = CODEC_ID_WMV2,
     .priv_data_size = sizeof(Wmv2Context),
     .init           = wmv2_encode_init,
-    .encode         = ff_MPV_encode_picture,
+    .encode2        = ff_MPV_encode_picture,
     .close          = ff_MPV_encode_end,
     .pix_fmts= (const enum PixelFormat[]){PIX_FMT_YUV420P, PIX_FMT_NONE},
     .long_name= NULL_IF_CONFIG_SMALL("Windows Media Video 8"),



More information about the ffmpeg-cvslog mailing list