Message ID | 20200223234124.17689-8-sw@jkqxz.net |
---|---|
State | Superseded |
Headers | show |
Series | [FFmpeg-devel,v4,01/21] cbs: Mention all codecs in unit type comment | expand |
Context | Check | Description |
---|---|---|
andriy/ffmpeg-patchwork | success | Make fate finished |
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
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 --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; }