[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