On Tue, Sep 8, 2015 at 7:42 PM, wm4 <[email protected]> wrote: > 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; > --
The commit message doesn't match the patch, ie. AV_CODEC_CAP_DECODER_SETS_PKT_DTS vs FF_CODEC_CAP_SETS_PKT_DTS _______________________________________________ libav-devel mailing list [email protected] https://lists.libav.org/mailman/listinfo/libav-devel
