summaryrefslogtreecommitdiff
path: root/libavcodec/h264_redundant_pps_bsf.c
diff options
context:
space:
mode:
authorAndreas Rheinhardt <andreas.rheinhardt@gmail.com>2020-07-27 17:32:23 +0100
committerMark Thompson <sw@jkqxz.net>2020-09-02 00:00:57 +0100
commitd1c6e09d09f530a1f103a5dbdf06f69f42611974 (patch)
treefcbac1190cdfe6b961f1766dfeb8f719a765bed5 /libavcodec/h264_redundant_pps_bsf.c
parent0720e15c0330f0f101c02d5c2c6548e964079f6d (diff)
h264_redundant_pps: Make it reference-compatible
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. Fixes #7807. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@gmail.com> Signed-off-by: Mark Thompson <sw@jkqxz.net>
Diffstat (limited to 'libavcodec/h264_redundant_pps_bsf.c')
-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;
}