[FFmpeg-devel] [PATCH 1/2] avformat/flacenc: Only update streaminfo if it has changed

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Fri Apr 17 03:18:13 EEST 2020


Andreas Rheinhardt:
> An AVStream's codecpar is supposed to be filled by the caller before
> avformat_write_header(); if the CodecParameters change, the caller
> should signal this via packet side data, but not touch the AVStream's
> codecpar.
> 
> The FLAC muxer checks for packet side data containing updated extradata,
> yet if nothing has arrived by the time the trailer is written, the
> already written extradata is overwritten by the very same extradata
> again, unless the output is unseekable, in which case a warning that the
> FLAC header can't be rewritten is emitted.
> 
> This commit changes this by only trying to rewrite the extradata if a
> new streaminfo arrived via packet side data. Only then is a warning
> emitted in case the output is unseekable.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at gmail.com>
> ---
>  libavformat/flacenc.c | 6 ++----
>  1 file changed, 2 insertions(+), 4 deletions(-)
> 
> diff --git a/libavformat/flacenc.c b/libavformat/flacenc.c
> index 1aae0c97e0..42c1efec54 100644
> --- a/libavformat/flacenc.c
> +++ b/libavformat/flacenc.c
> @@ -331,8 +331,6 @@ static int flac_write_trailer(struct AVFormatContext *s)
>      AVIOContext *pb = s->pb;
>      int64_t file_size;
>      FlacMuxerContext *c = s->priv_data;
> -    uint8_t *streaminfo = c->streaminfo ? c->streaminfo :
> -                                          s->streams[c->audio_stream_idx]->codecpar->extradata;
>  
>      if (c->waiting_pics) {
>          av_log(s, AV_LOG_WARNING, "No packets were sent for some of the "
> @@ -340,14 +338,14 @@ static int flac_write_trailer(struct AVFormatContext *s)
>          flac_queue_flush(s);
>      }
>  
> -    if (!c->write_header || !streaminfo)
> +    if (!c->write_header || !c->streaminfo)
>          return 0;
>  
>      if (pb->seekable & AVIO_SEEKABLE_NORMAL) {
>          /* rewrite the STREAMINFO header block data */
>          file_size = avio_tell(pb);
>          avio_seek(pb, 8, SEEK_SET);
> -        avio_write(pb, streaminfo, FLAC_STREAMINFO_SIZE);
> +        avio_write(pb, c->streaminfo, FLAC_STREAMINFO_SIZE);
>          avio_seek(pb, file_size, SEEK_SET);
>      } else {
>          av_log(s, AV_LOG_WARNING, "unable to rewrite FLAC header.\n");
> 
Will apply this tomorrow if there are no objections.

- Andreas


More information about the ffmpeg-devel mailing list