[FFmpeg-devel] [PATCH 3/4] h264_metadata: Fix handling of level 1b
Andreas Rheinhardt
andreas.rheinhardt at googlemail.com
Mon Nov 12 16:18:14 EET 2018
The earlier logic had two errors:
1. If level 1b for a non-High profile had been guessed, level 1b was not always written to the output, because constraint_set3_flag wasn't set.
2. If a level different from 1b that shares its level_idc with 1b was
intended to be set, constraint_set3_flag wasn't cleared so that the
output could mistakenly be read as 1b (in case none of the High profiles
is in use).
Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt at googlemail.com>
---
libavcodec/h264_metadata_bsf.c | 16 +++++++++++++++-
1 file changed, 15 insertions(+), 1 deletion(-)
diff --git a/libavcodec/h264_metadata_bsf.c b/libavcodec/h264_metadata_bsf.c
index 521bc36b7e..7fe213e8cd 100644
--- a/libavcodec/h264_metadata_bsf.c
+++ b/libavcodec/h264_metadata_bsf.c
@@ -244,7 +244,12 @@ static int h264_metadata_update_sps(AVBSFContext *bsf,
width, height,
sps->vui.max_dec_frame_buffering);
if (desc) {
- level_idc = desc->level_idc;
+ if ((desc->level_idc == 11) && desc->constraint_set3_flag)
+ // This ensures that for level 1b the correct level
+ // will be inferred below.
+ level_idc = 9;
+ else
+ level_idc = desc->level_idc;
} else {
av_log(bsf, AV_LOG_WARNING, "Stream does not appear to "
"conform to any level: using level 6.2.\n");
@@ -264,6 +269,15 @@ static int h264_metadata_update_sps(AVBSFContext *bsf,
sps->level_idc = 9;
}
} else {
+ // If the earlier level was 1b or the new level
+ // is in danger of being mistaken for 1b,
+ // we clear constraint_set3_flag.
+ if ((level_idc == 11 ||
+ sps->level_idc == 11) &&
+ (sps->profile_idc == 66 ||
+ sps->profile_idc == 77 ||
+ sps->profile_idc == 88))
+ sps->constraint_set3_flag = 0;
sps->level_idc = level_idc;
}
}
--
2.19.0
More information about the ffmpeg-devel
mailing list