[FFmpeg-devel] [PATCH] vp9: assign PTS to visible instead of invisible frames

Ronald S. Bultje rsbultje at gmail.com
Thu Feb 5 19:22:09 CET 2015


Hi,

On Thu, Feb 5, 2015 at 10:43 AM, wm4 <nfxjfg at googlemail.com> wrote:

> All the webm/vp9 files I have seen so far can have packets that contain
> 1 invisible and 1 visible frame. The vp9 parser separates them. Since
> the invisible frame is always (?) the first sub-packet, the new packet
> is assigned the PTS of the original packet, while the packet containing
> the visible frame has no PTS.
>
> This patch essentially reassigns the PTS from the invisible to the
> visible frame.
> ---
> Not sure if DTS needs adjustment.
> ---
>  libavcodec/vp9_parser.c | 12 ++++++++++++
>  1 file changed, 12 insertions(+)
>
> diff --git a/libavcodec/vp9_parser.c b/libavcodec/vp9_parser.c
> index b188785..220290f 100644
> --- a/libavcodec/vp9_parser.c
> +++ b/libavcodec/vp9_parser.c
> @@ -24,10 +24,13 @@
>  typedef struct VP9ParseContext {
>      int n_frames; // 1-8
>      int size[8];
> +    int64_t pts;
>  } VP9ParseContext;
>
>  static void parse_frame(AVCodecParserContext *ctx, const uint8_t *buf,
> int size)
>  {
> +    VP9ParseContext *s = ctx->priv_data;
> +
>      if (buf[0] & 0x4) {
>          ctx->pict_type = AV_PICTURE_TYPE_P;
>          ctx->key_frame = 0;
> @@ -35,6 +38,15 @@ static void parse_frame(AVCodecParserContext *ctx,
> const uint8_t *buf, int size)
>          ctx->pict_type = AV_PICTURE_TYPE_I;
>          ctx->key_frame = 1;
>      }
> +
> +    if (buf[0] & 0x2) {
> +        if (ctx->pts == AV_NOPTS_VALUE)
> +            ctx->pts = s->pts;
> +        s->pts = AV_NOPTS_VALUE;
> +    } else {
> +        s->pts = ctx->pts;
> +        ctx->pts = AV_NOPTS_VALUE;
> +    }
>  }
>
>  static int parse(AVCodecParserContext *ctx,
> --
> 2.1.4


lgtm.

Ronald


More information about the ffmpeg-devel mailing list