[FFmpeg-devel] [PATCH] avformat/ivf: Change the length field to 32 bits

James Almer jamrial at gmail.com
Tue Oct 1 20:25:17 EEST 2019


On 10/1/2019 2:05 PM, Raphaël Zumer wrote:
> Signed-off-by: Raphaël Zumer <rzumer at tebako.net>
> ---
>  libavformat/ivfdec.c | 3 ++-
>  libavformat/ivfenc.c | 5 +++--
>  2 files changed, 5 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/ivfdec.c b/libavformat/ivfdec.c
> index 40ae464b76..2fdb6f5a04 100644
> --- a/libavformat/ivfdec.c
> +++ b/libavformat/ivfdec.c
> @@ -53,7 +53,8 @@ static int read_header(AVFormatContext *s)
>      st->codecpar->height     = avio_rl16(s->pb);
>      time_base.den         = avio_rl32(s->pb);
>      time_base.num         = avio_rl32(s->pb);
> -    st->duration          = avio_rl64(s->pb);
> +    st->duration          = avio_rl32(s->pb);
> +    avio_rl32(s->pb); // unused

avio_skip(s->pb, 4);

This part is good either way.

>  
>      st->need_parsing      = AVSTREAM_PARSE_HEADERS;
>  
> diff --git a/libavformat/ivfenc.c b/libavformat/ivfenc.c
> index adf72117e9..e135a78213 100644
> --- a/libavformat/ivfenc.c
> +++ b/libavformat/ivfenc.c
> @@ -53,7 +53,7 @@ static int ivf_write_header(AVFormatContext *s)
>      avio_wl16(pb, par->height);
>      avio_wl32(pb, s->streams[0]->time_base.den);
>      avio_wl32(pb, s->streams[0]->time_base.num);
> -    avio_wl64(pb, 0xFFFFFFFFFFFFFFFFULL);
> +    avio_wl64(pb, 0xFFFFFFFFFFFFFFFFULL); // length is overwritten at the end of muxing
>  
>      return 0;
>  }
> @@ -83,7 +83,8 @@ static int ivf_write_trailer(AVFormatContext *s)
>          size_t end = avio_tell(pb);
>  
>          avio_seek(pb, 24, SEEK_SET);
> -        avio_wl64(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));
> +        // overwrite the "length" field (duration)
> +        avio_wl32(pb, ctx->frame_cnt * ctx->sum_delta_pts / (ctx->frame_cnt - 1));

The value in the unused field will be 0xFFFFFFFF after this change
instead of 0, since you're writing 32 bits as duration instead of 64
where the high 32 bits (corresponding to the unused field) are zeroed.
That means the ivf demuxer prior to this patch will read bogus duration
values from ivf files created after this patch.

Just leave the muxer as is.

>          avio_seek(pb, end, SEEK_SET);
>      }
>  
> 



More information about the ffmpeg-devel mailing list