#include "libavutil/mem.h"
#include "bsf.h"
+#include "bsf_internal.h"
#include "cbs.h"
#include "cbs_h264.h"
#include "h264.h"
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) {
av_log(bsf, AV_LOG_VERBOSE, "Deleting redundant PPS "
"at %"PRId64".\n", pkt->pts);
- err = ff_cbs_delete_unit(ctx->input, au, i);
- if (err < 0)
- goto fail;
+ ff_cbs_delete_unit(au, i);
i--;
continue;
}
err = 0;
fail:
- ff_cbs_fragment_reset(ctx->output, au);
+ ff_cbs_fragment_reset(au);
if (err < 0)
av_packet_unref(pkt);
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;
}
err = 0;
fail:
- ff_cbs_fragment_reset(ctx->output, au);
+ ff_cbs_fragment_reset(au);
return err;
}
{
H264RedundantPPSContext *ctx = bsf->priv_data;
- ff_cbs_fragment_free(ctx->input, &ctx->access_unit);
+ ff_cbs_fragment_free(&ctx->access_unit);
ff_cbs_close(&ctx->input);
ff_cbs_close(&ctx->output);
}