summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libavcodec/h264_redundant_pps_bsf.c17
1 files changed, 14 insertions, 3 deletions
diff --git a/libavcodec/h264_redundant_pps_bsf.c b/libavcodec/h264_redundant_pps_bsf.c
index a8af4105cf..cf41abe96c 100644
--- a/libavcodec/h264_redundant_pps_bsf.c
+++ b/libavcodec/h264_redundant_pps_bsf.c
@@ -41,8 +41,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;
@@ -89,7 +100,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) {
@@ -145,7 +156,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;
}