[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