[FFmpeg-devel] [PATCH v2 1/4] avcodec/h264_redundant_pps_bsf: Don't remove PPS
Andreas Rheinhardt
andreas.rheinhardt at outlook.com
Sat Sep 24 17:11:56 EEST 2022
Andreas Rheinhardt:
> Andreas Rheinhardt:
>> There is no check for whether these supposedly redundant PPS
>> are actually redundant. One could check via memcmp which would
>> work in practice* (because all content buffers are initially
>> zero-allocated), but this is not portable as compilers may
>> trash padding inside structures as they wish.
>>
>> In case the PPS is not really redundant the output is garbage.
>> This happens with several files from the FATE-suite. E.g.
>> h264-conformance/CVCANLMA2_Sony_C.jsv doesn't decode correctly
>> any more, whereas h264-conformance/CABA3_TOSHIBA_E.264 even
>> fails in ff_cbs_write_packet(), because the inferred value
>> of num_ref_idx_l0_active_minus1 mismatches with the value set
>> in the slice (this happens when num_ref_idx_l0_default_active_minus1
>> changes in the PPS; the value in the slice header is inferred from
>> the original PPS's num_ref_idx_l0_default_active_minus1).
>>
>> *: Unless slice_group_id is used, i.e. unless slice_group_map_type
>> is six.
>>
>> Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at outlook.com>
>> ---
>> libavcodec/h264_redundant_pps_bsf.c | 11 -----------
>> 1 file changed, 11 deletions(-)
>>
>> diff --git a/libavcodec/h264_redundant_pps_bsf.c b/libavcodec/h264_redundant_pps_bsf.c
>> index f8bab1f109..df9a88a705 100644
>> --- a/libavcodec/h264_redundant_pps_bsf.c
>> +++ b/libavcodec/h264_redundant_pps_bsf.c
>> @@ -80,26 +80,15 @@ static int h264_redundant_pps_update_fragment(AVBSFContext *bsf,
>> CodedBitstreamFragment *au)
>> {
>> H264RedundantPPSContext *ctx = bsf->priv_data;
>> - int au_has_sps;
>> int err, i;
>>
>> - au_has_sps = 0;
>> for (i = 0; i < au->nb_units; i++) {
>> CodedBitstreamUnit *nal = &au->units[i];
>>
>> - if (nal->type == H264_NAL_SPS)
>> - au_has_sps = 1;
>> if (nal->type == H264_NAL_PPS) {
>> err = h264_redundant_pps_fixup_pps(ctx, nal);
>> if (err < 0)
>> return err;
>> - if (!au_has_sps) {
>> - av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS "
>> - "at %"PRId64".\n", pkt->pts);
>> - ff_cbs_delete_unit(au, i);
>> - i--;
>> - continue;
>> - }
>> }
>> if (nal->type == H264_NAL_SLICE ||
>> nal->type == H264_NAL_IDR_SLICE) {
>
> I just noticed that the documentation contains the sentence "A new
> single global PPS is created, and all of the redundant PPSs within the
> stream are removed". As the observations in the commit message show,
> this is just not true because every PPS in an access unit without SPS is
> considered redundant, making this filter dangerous. So I would simply
> delete this sentence from the documentation. Is everyone ok with this?
>
Will apply this patchset tomorrow unless there are objections.
- Andreas
More information about the ffmpeg-devel
mailing list