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

Reply via email to