diff mbox series

[FFmpeg-devel,v4,08/21] h264_redundant_pps: Make it reference-compatible

Message ID 20200223234124.17689-8-sw@jkqxz.net
State New
Headers show
Series [FFmpeg-devel,v4,01/21] cbs: Mention all codecs in unit type comment
Related show

Checks

Context Check Description
andriy/ffmpeg-patchwork pending
andriy/ffmpeg-patchwork success Applied patch
andriy/ffmpeg-patchwork success Configure finished
andriy/ffmpeg-patchwork success Make finished
andriy/ffmpeg-patchwork success Make fate finished

Commit Message

Mark Thompson Feb. 23, 2020, 11:41 p.m. UTC
From: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>

Since c6a63e11092c975b89d824f08682fe31948d3686, the parameter sets
modified as content of PPS units were references shared with the
CodedBitstreamH264Context, so modifying them alters the parsing process
of future access units which meant that frames often got discarded
because invalid values were parsed. This patch makes h264_redundant_pps
compatible with the reality of reference-counted parameter sets.

Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
Signed-off-by: Mark Thompson <sw@jkqxz.net>
---
 libavcodec/h264_redundant_pps_bsf.c | 17 ++++++++++++++---
 1 file changed, 14 insertions(+), 3 deletions(-)

Comments

Andreas Rheinhardt Feb. 24, 2020, 4:07 p.m. UTC | #1
Mark Thompson:
> From: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> 
> Since c6a63e11092c975b89d824f08682fe31948d3686, the parameter sets
> modified as content of PPS units were references shared with the
> CodedBitstreamH264Context, so modifying them alters the parsing process
> of future access units which meant that frames often got discarded
> because invalid values were parsed. This patch makes h264_redundant_pps
> compatible with the reality of reference-counted parameter sets.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
> Signed-off-by: Mark Thompson <sw@jkqxz.net>
> ---

You can now add ticket #7807 to the commit message.

- Andreas
Mark Thompson Feb. 24, 2020, 9:49 p.m. UTC | #2
On 24/02/2020 16:07, Andreas Rheinhardt wrote:
> Mark Thompson:
>> From: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>>
>> Since c6a63e11092c975b89d824f08682fe31948d3686, the parameter sets
>> modified as content of PPS units were references shared with the
>> CodedBitstreamH264Context, so modifying them alters the parsing process
>> of future access units which meant that frames often got discarded
>> because invalid values were parsed. This patch makes h264_redundant_pps
>> compatible with the reality of reference-counted parameter sets.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com>
>> Signed-off-by: Mark Thompson <sw@jkqxz.net>
>> ---
> 
> You can now add ticket #7807 to the commit message.

Added.

Thanks,

- Mark
diff mbox series

Patch

diff --git a/libavcodec/h264_redundant_pps_bsf.c b/libavcodec/h264_redundant_pps_bsf.c
index 8405738c4b..4d5dd9a90f 100644
--- a/libavcodec/h264_redundant_pps_bsf.c
+++ b/libavcodec/h264_redundant_pps_bsf.c
@@ -40,8 +40,19 @@  typedef struct H264RedundantPPSContext {
 
 
 static int h264_redundant_pps_fixup_pps(H264RedundantPPSContext *ctx,
-                                        H264RawPPS *pps)
+                                        CodedBitstreamUnit *unit)
 {
+    H264RawPPS *pps;
+    int err;
+
+    // The changes we are about to perform affect the parsing process,
+    // so we must make sure that the PPS is writable, otherwise the
+    // parsing of future slices will be incorrect and even raise errors.
+    err = ff_cbs_make_unit_writable(ctx->input, unit);
+    if (err < 0)
+        return err;
+    pps = unit->content;
+
     // Record the current value of pic_init_qp in order to fix up
     // following slices, then overwrite with the global value.
     ctx->current_pic_init_qp = pps->pic_init_qp_minus26 + 26;
@@ -88,7 +99,7 @@  static int h264_redundant_pps_filter(AVBSFContext *bsf, AVPacket *pkt)
         if (nal->type == H264_NAL_SPS)
             au_has_sps = 1;
         if (nal->type == H264_NAL_PPS) {
-            err = h264_redundant_pps_fixup_pps(ctx, nal->content);
+            err = h264_redundant_pps_fixup_pps(ctx, nal);
             if (err < 0)
                 goto fail;
             if (!au_has_sps) {
@@ -144,7 +155,7 @@  static int h264_redundant_pps_init(AVBSFContext *bsf)
 
         for (i = 0; i < au->nb_units; i++) {
             if (au->units[i].type == H264_NAL_PPS) {
-                err = h264_redundant_pps_fixup_pps(ctx, au->units[i].content);
+                err = h264_redundant_pps_fixup_pps(ctx, &au->units[i]);
                 if (err < 0)
                     goto fail;
             }