[FFmpeg-devel] [PATCH 1/4] avformat/nutenc: don't use header_count to store different variables

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Mon Nov 9 01:04:26 EET 2020


Andriy Gelman:
> From: Andriy Gelman <andriy.gelman at gmail.com>
> 
> Currently, header_count is used to store both the elision header count
> and the header repetition count (number of times headers have been written
> to output). Fix this by using a separate variable to store repetition
> count.
> 
> Signed-off-by: Andriy Gelman <andriy.gelman at gmail.com>
> ---
>  libavformat/nut.h    | 3 ++-
>  libavformat/nutenc.c | 4 ++--
>  2 files changed, 4 insertions(+), 3 deletions(-)
> 
> diff --git a/libavformat/nut.h b/libavformat/nut.h
> index a4409ee23d..a990d3832e 100644
> --- a/libavformat/nut.h
> +++ b/libavformat/nut.h
> @@ -103,7 +103,8 @@ typedef struct NUTContext {
>      unsigned int time_base_count;
>      int64_t last_syncpoint_pos;
>      int64_t last_resync_pos;
> -    int header_count;
> +    int header_count;           // elision header count
> +    int header_rep_count;       // number of times headers written
>      AVRational *time_base;
>      struct AVTreeNode *syncpoints;
>      int sp_count;
> diff --git a/libavformat/nutenc.c b/libavformat/nutenc.c
> index 1dcb2be1b1..87adef6f7e 100644
> --- a/libavformat/nutenc.c
> +++ b/libavformat/nutenc.c
> @@ -684,7 +684,7 @@ static int write_headers(AVFormatContext *avctx, AVIOContext *bc)
>      }
>  
>      nut->last_syncpoint_pos = INT_MIN;
> -    nut->header_count++;
> +    nut->header_rep_count++;
>  
>      ret = 0;
>  fail:
> @@ -988,7 +988,7 @@ static int nut_write_packet(AVFormatContext *s, AVPacket *pkt)
>          data_size += sm_size;
>      }
>  
> -    if (1LL << (20 + 3 * nut->header_count) <= avio_tell(bc))
> +    if (1LL << (20 + 3 * nut->header_rep_count) <= avio_tell(bc))
>          write_headers(s, bc);
>  
>      if (key_frame && !(nus->last_flags & FLAG_KEY))
> 
1. You are not the first to notice this:
https://patchwork.ffmpeg.org/project/ffmpeg/patch/20200505141657.10787-2-andreas.rheinhardt@gmail.com/
2. Your patch is incomplete: header_count is also used in write_trailer.
If you use the correct value there, you will have to update lots of
fate-tests (see the above commit). (The fate updates of that old patch
need to be updated (and were incomplete anyway because I did not ran
tests for gpl-components*).
3. The reason the above patch (or rather patchset) has not been applied
is that there is actually a subtle bug with chapters: Users are allowed
to add new chapters after writing the header (some muxer then write the
chapters when writing the trailer). Yet this doesn't work with nut right
now: See the commit message of the preceding patch
(https://patchwork.ffmpeg.org/project/ffmpeg/patch/20200505141657.10787-1-andreas.rheinhardt@gmail.com/)
for details.

- Andreas

*: I only noticed this through patchwork, so thank you again for this.


More information about the ffmpeg-devel mailing list