[FFmpeg-devel] dump_extra: Don't add extradata if it already exists

Submitted by Andreas Rheinhardt on July 13, 2019, 2:55 a.m.

Details

Message ID 20190713025550.39846-1-andreas.rheinhardt@gmail.com
State Accepted
Commit 3469cfab4adb242fa2116f4858f0768cec400afa
Headers show

Commit Message

Andreas Rheinhardt July 13, 2019, 2:55 a.m.
The dump_extra bitstream filter currently simply adds the extradata to
the packets indicated by the user without checking whether said
extradata already exists in the packets. Besides wasting space
duplicated extradata in the same packet/access unit is also forbidden
for some codecs, e.g. MPEG-2.

This check has been added to be able to use the mpeg2_qsv encoder (which
only adds the sequence headers to the first packet) in broadcast
scenarios where repeating sequence headers are required.

The check used here is not perfect: E.g. dump_extra would add the
extradata to a H.264 access unit consisting of an access unit delimiter,
SPS, PPS and slices.

Fixes #8007.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
---
 doc/bitstream_filters.texi      | 4 +++-
 libavcodec/dump_extradata_bsf.c | 4 +++-
 2 files changed, 6 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer July 14, 2019, 8:16 p.m.
On Sat, Jul 13, 2019 at 04:55:50AM +0200, Andreas Rheinhardt wrote:
> The dump_extra bitstream filter currently simply adds the extradata to
> the packets indicated by the user without checking whether said
> extradata already exists in the packets. Besides wasting space
> duplicated extradata in the same packet/access unit is also forbidden
> for some codecs, e.g. MPEG-2.
> 
> This check has been added to be able to use the mpeg2_qsv encoder (which
> only adds the sequence headers to the first packet) in broadcast
> scenarios where repeating sequence headers are required.
> 
> The check used here is not perfect: E.g. dump_extra would add the
> extradata to a H.264 access unit consisting of an access unit delimiter,
> SPS, PPS and slices.
> 
> Fixes #8007.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> ---
>  doc/bitstream_filters.texi      | 4 +++-
>  libavcodec/dump_extradata_bsf.c | 4 +++-
>  2 files changed, 6 insertions(+), 2 deletions(-)

will apply

thanks

[...]

Patch hide | download patch | download mbox

diff --git a/doc/bitstream_filters.texi b/doc/bitstream_filters.texi
index a6a5a331f5..14f35893d3 100644
--- a/doc/bitstream_filters.texi
+++ b/doc/bitstream_filters.texi
@@ -103,7 +103,9 @@  DTS-HD.
 
 @section dump_extra
 
-Add extradata to the beginning of the filtered packets.
+Add extradata to the beginning of the filtered packets except when
+said packets already exactly begin with the extradata that is intended
+to be added.
 
 @table @option
 @item freq
diff --git a/libavcodec/dump_extradata_bsf.c b/libavcodec/dump_extradata_bsf.c
index 7112cd6bd4..b641508234 100644
--- a/libavcodec/dump_extradata_bsf.c
+++ b/libavcodec/dump_extradata_bsf.c
@@ -50,7 +50,9 @@  static int dump_extradata(AVBSFContext *ctx, AVPacket *out)
 
     if (ctx->par_in->extradata &&
         (s->freq == DUMP_FREQ_ALL ||
-         (s->freq == DUMP_FREQ_KEYFRAME && in->flags & AV_PKT_FLAG_KEY))) {
+         (s->freq == DUMP_FREQ_KEYFRAME && in->flags & AV_PKT_FLAG_KEY)) &&
+         in->size >= ctx->par_in->extradata_size &&
+         memcmp(in->data, ctx->par_in->extradata, ctx->par_in->extradata_size)) {
         if (in->size >= INT_MAX - ctx->par_in->extradata_size) {
             ret = AVERROR(ERANGE);
             goto fail;