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 AV_CODEC_CAP_DECODER_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).

The new codec cap is not useful to API users, and exists only to work
around internal libavcodec issues. Declare it private API. I've still
put it into the public header to avoid that the constant is
accidentally used twice.
---
Now uses internal caps.
---
 libavcodec/internal.h | 5 ++++-
 libavcodec/mmaldec.c  | 1 +
 libavcodec/utils.c    | 3 ++-
 3 files changed, 7 insertions(+), 2 deletions(-)

diff --git a/libavcodec/internal.h b/libavcodec/internal.h
index fc90632..3ef70b7 100644
--- a/libavcodec/internal.h
+++ b/libavcodec/internal.h
@@ -46,7 +46,10 @@
  * all.
  */
 #define FF_CODEC_CAP_INIT_CLEANUP           (1 << 1)
-
+/**
+ * whether the decoder sets AVFrame.pkt_dts itself
+ */
+#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;
-- 
2.5.1

_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel

Reply via email to