mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
h264_redundant_pps: Make it reference-compatible
Since c6a63e1109
, 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>
This commit is contained in:
parent
0720e15c03
commit
d1c6e09d09
@ -41,8 +41,19 @@ typedef struct H264RedundantPPSContext {
|
|||||||
|
|
||||||
|
|
||||||
static int h264_redundant_pps_fixup_pps(H264RedundantPPSContext *ctx,
|
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
|
// Record the current value of pic_init_qp in order to fix up
|
||||||
// following slices, then overwrite with the global value.
|
// following slices, then overwrite with the global value.
|
||||||
ctx->current_pic_init_qp = pps->pic_init_qp_minus26 + 26;
|
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)
|
if (nal->type == H264_NAL_SPS)
|
||||||
au_has_sps = 1;
|
au_has_sps = 1;
|
||||||
if (nal->type == H264_NAL_PPS) {
|
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)
|
if (err < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
if (!au_has_sps) {
|
if (!au_has_sps) {
|
||||||
@ -145,7 +156,7 @@ static int h264_redundant_pps_init(AVBSFContext *bsf)
|
|||||||
|
|
||||||
for (i = 0; i < au->nb_units; i++) {
|
for (i = 0; i < au->nb_units; i++) {
|
||||||
if (au->units[i].type == H264_NAL_PPS) {
|
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)
|
if (err < 0)
|
||||||
goto fail;
|
goto fail;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user