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

Andreas Rheinhardt andreas.rheinhardt at gmail.com
Sat Apr 18 03:24:50 EEST 2020


Andreas Rheinhardt:
> 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
> 
Applied.

- Andreas


More information about the ffmpeg-devel mailing list