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;
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) {
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;
}