[FFmpeg-devel] [PATCH, v3 1/2] lavc/hevc_ps: parse constraint flags for HEVC REXT
Linjie Fu
linjie.fu at intel.com
Wed Apr 3 07:09:50 EEST 2019
Parse all the constraint flags according to ITU-T Rec. H.265 (02/2018).
It can be passed to hw decoders to detemine the exact profile for Range
Extension HEVC.
Adjust the sequence of members in PTLCommon to match H265RawProfileTierLevel.
Signed-off-by: Linjie Fu <linjie.fu at intel.com>
---
libavcodec/hevc_ps.c | 44 ++++++++++++++++++++++++++++++++++++++++----
libavcodec/hevc_ps.h | 13 ++++++++++++-
2 files changed, 52 insertions(+), 5 deletions(-)
diff --git a/libavcodec/hevc_ps.c b/libavcodec/hevc_ps.c
index 80df417e4f..53822173b8 100644
--- a/libavcodec/hevc_ps.c
+++ b/libavcodec/hevc_ps.c
@@ -267,7 +267,7 @@ static int decode_profile_tier_level(GetBitContext *gb, AVCodecContext *avctx,
{
int i;
- if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 16 + 16 + 12)
+ if (get_bits_left(gb) < 2+1+5 + 32 + 4 + 43 + 1)
return -1;
ptl->profile_space = get_bits(gb, 2);
@@ -295,9 +295,45 @@ static int decode_profile_tier_level(GetBitContext *gb, AVCodecContext *avctx,
ptl->non_packed_constraint_flag = get_bits1(gb);
ptl->frame_only_constraint_flag = get_bits1(gb);
- skip_bits(gb, 16); // XXX_reserved_zero_44bits[0..15]
- skip_bits(gb, 16); // XXX_reserved_zero_44bits[16..31]
- skip_bits(gb, 12); // XXX_reserved_zero_44bits[32..43]
+#define check_profile_idc(idc) \
+ ptl->profile_idc == idc || ptl->profile_compatibility_flag[idc]
+
+ if (check_profile_idc(4) || check_profile_idc(5) || check_profile_idc(6) ||
+ check_profile_idc(7) || check_profile_idc(8) || check_profile_idc(9) ||
+ check_profile_idc(10)) {
+
+ ptl->max_12bit_constraint_flag = get_bits1(gb);
+ ptl->max_10bit_constraint_flag = get_bits1(gb);
+ ptl->max_8bit_constraint_flag = get_bits1(gb);
+ ptl->max_422chroma_constraint_flag = get_bits1(gb);
+ ptl->max_420chroma_constraint_flag = get_bits1(gb);
+ ptl->max_monochrome_constraint_flag = get_bits1(gb);
+ ptl->intra_constraint_flag = get_bits1(gb);
+ ptl->one_picture_only_constraint_flag = get_bits1(gb);
+ ptl->lower_bit_rate_constraint_flag = get_bits1(gb);
+
+ if (check_profile_idc(5) || check_profile_idc(9) || check_profile_idc(10)) {
+ ptl->max_14bit_constraint_flag = get_bits1(gb);
+ skip_bits_long(gb, 33); // XXX_reserved_zero_33bits[0..32]
+ } else {
+ skip_bits_long(gb, 34); // XXX_reserved_zero_34bits[0..33]
+ }
+ } else if (check_profile_idc(2)) {
+ skip_bits(gb, 7);
+ ptl->one_picture_only_constraint_flag = get_bits1(gb);
+ skip_bits_long(gb, 35); // XXX_reserved_zero_35bits[0..34]
+ } else {
+ skip_bits_long(gb, 43); // XXX_reserved_zero_43bits[0..42]
+ }
+
+ if ((ptl->profile_idc >=1 && ptl->profile_idc <= 5) || ptl->profile_idc == 9 ||
+ ptl->profile_compatibility_flag[1] || ptl->profile_compatibility_flag[2] ||
+ ptl->profile_compatibility_flag[3] || ptl->profile_compatibility_flag[4] ||
+ ptl->profile_compatibility_flag[5] || ptl->profile_compatibility_flag[9])
+ ptl->inbld_flag = get_bits1(gb);
+ else
+ skip_bits1(gb);
+#undef check_profile_idc
return 0;
}
diff --git a/libavcodec/hevc_ps.h b/libavcodec/hevc_ps.h
index bbaa9205ef..64f1a1e209 100644
--- a/libavcodec/hevc_ps.h
+++ b/libavcodec/hevc_ps.h
@@ -177,11 +177,22 @@ typedef struct PTLCommon {
uint8_t tier_flag;
uint8_t profile_idc;
uint8_t profile_compatibility_flag[32];
- uint8_t level_idc;
uint8_t progressive_source_flag;
uint8_t interlaced_source_flag;
uint8_t non_packed_constraint_flag;
uint8_t frame_only_constraint_flag;
+ uint8_t max_12bit_constraint_flag;
+ uint8_t max_10bit_constraint_flag;
+ uint8_t max_8bit_constraint_flag;
+ uint8_t max_422chroma_constraint_flag;
+ uint8_t max_420chroma_constraint_flag;
+ uint8_t max_monochrome_constraint_flag;
+ uint8_t intra_constraint_flag;
+ uint8_t one_picture_only_constraint_flag;
+ uint8_t lower_bit_rate_constraint_flag;
+ uint8_t max_14bit_constraint_flag;
+ uint8_t inbld_flag;
+ uint8_t level_idc;
} PTLCommon;
typedef struct PTL {
--
2.17.1
More information about the ffmpeg-devel
mailing list