[FFmpeg-devel] [PATCH v3 2/2] lavc/vaapi_encode_h265: Set general_*_constriaint flags with profile

Mark Thompson sw at jkqxz.net
Mon Mar 18 23:22:39 EET 2024


On 18/03/2024 04:21, fei.w.wang-at-intel.com at ffmpeg.org wrote:
> From: Fei Wang <fei.w.wang at intel.com>
> 
> According to Table A.2 in spec.
> 
> Signed-off-by: Fei Wang <fei.w.wang at intel.com>
> ---
>   libavcodec/vaapi_encode_h265.c | 176 +++++++++++++++++++++++----------
>   1 file changed, 123 insertions(+), 53 deletions(-)
> 
> diff --git a/libavcodec/vaapi_encode_h265.c b/libavcodec/vaapi_encode_h265.c
> index 43755e2188..5ed317ce11 100644
> --- a/libavcodec/vaapi_encode_h265.c
> +++ b/libavcodec/vaapi_encode_h265.c
> @@ -258,6 +258,124 @@ fail:
>       return err;
>   }
>   
> +static int vaapi_encode_h265_init_ptl(AVCodecContext *avctx)
> +{
> +    VAAPIEncodeContext      *ctx = avctx->priv_data;
> +    VAAPIEncodeH265Context *priv = avctx->priv_data;
> +    H265RawVPS              *vps = &priv->raw_vps;
> +    H265RawProfileTierLevel *ptl = &vps->profile_tier_level;
> +
> +    ptl->general_profile_space = 0;
> +    ptl->general_profile_idc   = avctx->profile;
> +    ptl->general_tier_flag     = priv->tier;
> +
> +    ptl->general_profile_compatibility_flag[ptl->general_profile_idc] = 1;
> +
> +    if (ptl->general_profile_compatibility_flag[1])
> +        ptl->general_profile_compatibility_flag[2] = 1;
> +    if (ptl->general_profile_compatibility_flag[3]) {
> +        ptl->general_profile_compatibility_flag[1] = 1;
> +        ptl->general_profile_compatibility_flag[2] = 1;
> +    }
> +
> +    ptl->general_progressive_source_flag    = 1;
> +    ptl->general_interlaced_source_flag     = 0;
> +    ptl->general_non_packed_constraint_flag = 1;
> +    ptl->general_frame_only_constraint_flag = 1;
> +
> +    if (avctx->profile >= 4) {
> +        ptl->general_intra_constraint_flag            = ctx->gop_size == 1;
> +        ptl->general_one_picture_only_constraint_flag = 0;
> +        ptl->general_lower_bit_rate_constraint_flag   = 1;
> +        ptl->general_max_14bit_constraint_flag        = 0;
> +
> +        switch (ctx->va_profile) {
> +#if VA_CHECK_VERSION(1, 2, 0)
> +        case VAProfileHEVCMain12:
> +            // Main 12
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 0;
> +            ptl->general_max_8bit_constraint_flag       = 0;
> +            ptl->general_max_422chroma_constraint_flag  = 1;
> +            ptl->general_max_420chroma_constraint_flag  = 1;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +        case VAProfileHEVCMain422_10:
> +            // Main 4:2:2 10
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 1;
> +            ptl->general_max_8bit_constraint_flag       = 0;
> +            ptl->general_max_422chroma_constraint_flag  = 1;
> +            ptl->general_max_420chroma_constraint_flag  = 0;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +        case VAProfileHEVCMain422_12:
> +            // Main 4:2:2 12
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 0;
> +            ptl->general_max_8bit_constraint_flag       = 0;
> +            ptl->general_max_422chroma_constraint_flag  = 1;
> +            ptl->general_max_420chroma_constraint_flag  = 0;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +        case VAProfileHEVCMain444:
> +            // Main 4:4:4
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 1;
> +            ptl->general_max_8bit_constraint_flag       = 1;
> +            ptl->general_max_422chroma_constraint_flag  = 0;
> +            ptl->general_max_420chroma_constraint_flag  = 0;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +        case VAProfileHEVCMain444_10:
> +            // Main 4:4:4 10
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 1;
> +            ptl->general_max_8bit_constraint_flag       = 0;
> +            ptl->general_max_422chroma_constraint_flag  = 0;
> +            ptl->general_max_420chroma_constraint_flag  = 0;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +        case VAProfileHEVCMain444_12:
> +            // Main 4:4:4 12
> +            ptl->general_max_12bit_constraint_flag      = 1;
> +            ptl->general_max_10bit_constraint_flag      = 0;
> +            ptl->general_max_8bit_constraint_flag       = 0;
> +            ptl->general_max_422chroma_constraint_flag  = 0;
> +            ptl->general_max_420chroma_constraint_flag  = 0;
> +            ptl->general_max_monochrome_constraint_flag = 0;
> +            break;
> +#endif
> +        default:
> +            av_log(avctx, AV_LOG_ERROR, "Unknown profile to init PTL.\n");
> +            return AVERROR(EINVAL);
> +        }
> +    }

Why is this an improvement over the current code which sets the constraint flags based on the actual content of the stream?

Note the requirement in A.3.5 for decoder support:

general_profile_idc is equal to 4 or general_profile_compatibility_flag[ 4 ] is equal to 1 for the bitstream, and
the value of each constraint flag listed in Table A.2 is greater than or equal to the value(s) specified in the row
of Table A.2 for the format range extensions profile for which the decoder conformance is evaluated.

which says that decoders must be able to support streams which set additional constraint flags beyond those which are specified for a particular profile (in particular, an 8-bit 4:2:2 stream must be decodable by any decoder supporting either "Main 4:2:2 10" or "Main 4:4:4", so ideally it shouldn't be marked to require one of those in particular).

Thanks,

- Mark


More information about the ffmpeg-devel mailing list