[FFmpeg-cvslog] lavc: allow asynchronous decoders to return correct pkt_dts values

wm4 git at videolan.org
Sat Sep 12 13:30:55 CEST 2015


ffmpeg | branch: master | wm4 <nfxjfg at googlemail.com> | Fri Sep 11 18:36:56 2015 +0200| [87a051f97633010f71dfc1d23d806856499bf231] | committer: Luca Barbato

lavc: allow asynchronous decoders to return correct pkt_dts values

The generic code in utils.c sets the AVFrame.pkt_dts field from the
packet it was supposedly decoded. This does not have to be true for a
fully asynchronous decoder like mmaldec. It could be overwritten with an
incorrect value. Even if the decoder doesn't determine the DTS (but sets
it to AV_NOPTS_VALUE), it's impossible to determine a correct value in
utils.c.

Decoders can now be marked with FF_CODEC_CAP_SETS_PKT_DTS, in which case
utils.c won't overwrite the field. The decoders are expected to set this
field (even if they only set it to AV_NOPTS_VALUE).

Signed-off-by: Luca Barbato <lu_zero at gentoo.org>

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

 libavcodec/internal.h |    8 +++++++-
 libavcodec/mmaldec.c  |    1 +
 libavcodec/utils.c    |    3 ++-
 3 files changed, 10 insertions(+), 2 deletions(-)

diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index fc90632..500511d 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -46,7 +46,13 @@
  * all.
  */
 #define FF_CODEC_CAP_INIT_CLEANUP           (1 << 1)
-
+/**
+ * Decoders marked with FF_CODEC_CAP_SETS_PKT_DTS want to set
+ * AVFrame.pkt_dts manually. If the flag is set, utils.c won't overwrite
+ * this field. If it's unset, utils.c tries to guess the pkt_dts field
+ * from the input AVPacket.
+ */
+#define FF_CODEC_CAP_SETS_PKT_DTS           (1 << 2)
 
 #ifdef DEBUG
 #   define ff_dlog(ctx, ...) av_log(ctx, AV_LOG_DEBUG, __VA_ARGS__)
diff --git a/libavcodec/mmaldec.c b/libavcodec/mmaldec.c
index f4bf921..a23a97f 100644
--- a/libavcodec/mmaldec.c
+++ b/libavcodec/mmaldec.c
@@ -792,6 +792,7 @@ AVCodec ff_h264_mmal_decoder = {
     .flush          = ffmmal_flush,
     .priv_class     = &ffmmaldec_class,
     .capabilities   = AV_CODEC_CAP_DELAY,
+    .caps_internal  = FF_CODEC_CAP_SETS_PKT_DTS,
     .pix_fmts       = (const enum AVPixelFormat[]) { AV_PIX_FMT_MMAL,
                                                      AV_PIX_FMT_YUV420P,
                                                      AV_PIX_FMT_NONE},
diff --git a/libavcodec/utils.c b/libavcodec/utils.c
index 1d718b2..a94e4a6 100644
--- a/libavcodec/utils.c
+++ b/libavcodec/utils.c
@@ -1482,7 +1482,8 @@ int attribute_align_arg avcodec_decode_video2(AVCodecContext *avctx, AVFrame *pi
         else {
             ret = avctx->codec->decode(avctx, picture, got_picture_ptr,
                                        avpkt);
-            picture->pkt_dts = avpkt->dts;
+            if (!(avctx->codec->caps_internal & FF_CODEC_CAP_SETS_PKT_DTS))
+                picture->pkt_dts = avpkt->dts;
             /* get_buffer is supposed to set frame parameters */
             if (!(avctx->codec->capabilities & AV_CODEC_CAP_DR1)) {
                 picture->sample_aspect_ratio = avctx->sample_aspect_ratio;



More information about the ffmpeg-cvslog mailing list