diff mbox series

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

Message ID 20200412164427.31811-1-andreas.rheinhardt@gmail.com
State Accepted
Commit 9311ece7d30f846b8f61398321f0d48c19ae2f50
Headers show
Series [FFmpeg-devel,1/2] avformat/flacenc: Only update streaminfo if it has changed | expand

Checks

Context Check Description
andriy/default pending
andriy/make success Make finished
andriy/make_fate success Make fate finished

Commit Message

Andreas Rheinhardt April 12, 2020, 4:44 p.m. UTC
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@gmail.com>
---
 libavformat/flacenc.c | 6 ++----
 1 file changed, 2 insertions(+), 4 deletions(-)

Comments

Andreas Rheinhardt April 17, 2020, 12:18 a.m. UTC | #1
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@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
Andreas Rheinhardt April 18, 2020, 12:24 a.m. UTC | #2
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@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
diff mbox series

Patch

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");