summaryrefslogtreecommitdiff
path: root/libavcodec/vaapi_encode_h264.c
diff options
context:
space:
mode:
authorjianfeng.zheng <ggjogh@gmail.com>2023-03-31 19:54:23 +0800
committerHaihao Xiang <haihao.xiang@intel.com>2023-04-17 15:11:22 +0800
commit65e537b83379d2d6f87343f9bd59968b21d949a3 (patch)
tree22ed06f14d93db908d6ff29bfc3c9ead21d2c424 /libavcodec/vaapi_encode_h264.c
parent1cd5a383d49f94b05699b234b0d3c98f2969b810 (diff)
downloadffmpeg-65e537b83379d2d6f87343f9bd59968b21d949a3.tar.gz
vaapi: support VAProfileH264High10 encoding
see https://github.com/intel/libva/pull/664 Signed-off-by: jianfeng.zheng <jianfeng.zheng@mthreads.com>
Diffstat (limited to 'libavcodec/vaapi_encode_h264.c')
-rw-r--r--libavcodec/vaapi_encode_h264.c27
1 files changed, 22 insertions, 5 deletions
diff --git a/libavcodec/vaapi_encode_h264.c b/libavcodec/vaapi_encode_h264.c
index 645f6a978d..9ad017d540 100644
--- a/libavcodec/vaapi_encode_h264.c
+++ b/libavcodec/vaapi_encode_h264.c
@@ -23,6 +23,7 @@
#include "libavutil/avassert.h"
#include "libavutil/common.h"
+#include "libavutil/pixdesc.h"
#include "libavutil/internal.h"
#include "libavutil/opt.h"
@@ -301,10 +302,21 @@ static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
H264RawPPS *pps = &priv->raw_pps;
VAEncSequenceParameterBufferH264 *vseq = ctx->codec_sequence_params;
VAEncPictureParameterBufferH264 *vpic = ctx->codec_picture_params;
+ const AVPixFmtDescriptor *desc;
+ int bit_depth;
memset(sps, 0, sizeof(*sps));
memset(pps, 0, sizeof(*pps));
+ desc = av_pix_fmt_desc_get(priv->common.input_frames->sw_format);
+ av_assert0(desc);
+ if (desc->nb_components == 1 || desc->log2_chroma_w != 1 || desc->log2_chroma_h != 1) {
+ av_log(avctx, AV_LOG_ERROR, "Chroma format of input pixel format "
+ "%s is not supported.\n", desc->name);
+ return AVERROR(EINVAL);
+ }
+ bit_depth = desc->comp[0].depth;
+
sps->nal_unit_header.nal_ref_idc = 3;
sps->nal_unit_header.nal_unit_type = H264_NAL_SPS;
@@ -314,11 +326,11 @@ static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
avctx->profile == FF_PROFILE_H264_MAIN)
sps->constraint_set1_flag = 1;
- if (avctx->profile == FF_PROFILE_H264_HIGH)
+ if (avctx->profile == FF_PROFILE_H264_HIGH || avctx->profile == FF_PROFILE_H264_HIGH_10)
sps->constraint_set3_flag = ctx->gop_size == 1;
if (avctx->profile == FF_PROFILE_H264_MAIN ||
- avctx->profile == FF_PROFILE_H264_HIGH) {
+ avctx->profile == FF_PROFILE_H264_HIGH || avctx->profile == FF_PROFILE_H264_HIGH_10) {
sps->constraint_set4_flag = 1;
sps->constraint_set5_flag = ctx->b_per_p == 0;
}
@@ -359,6 +371,8 @@ static int vaapi_encode_h264_init_sequence_params(AVCodecContext *avctx)
sps->seq_parameter_set_id = 0;
sps->chroma_format_idc = 1;
+ sps->bit_depth_luma_minus8 = bit_depth - 8;
+ sps->bit_depth_chroma_minus8 = bit_depth - 8;
sps->log2_max_frame_num_minus4 = 4;
sps->pic_order_cnt_type = ctx->max_b_depth ? 0 : 2;
@@ -1144,6 +1158,9 @@ static av_cold int vaapi_encode_h264_configure(AVCodecContext *avctx)
}
static const VAAPIEncodeProfile vaapi_encode_h264_profiles[] = {
+#if VA_CHECK_VERSION(1, 18, 0)
+ { FF_PROFILE_H264_HIGH_10, 10, 3, 1, 1, VAProfileH264High10 },
+#endif
{ FF_PROFILE_H264_HIGH, 8, 3, 1, 1, VAProfileH264High },
{ FF_PROFILE_H264_MAIN, 8, 3, 1, 1, VAProfileH264Main },
{ FF_PROFILE_H264_CONSTRAINED_BASELINE,
@@ -1208,10 +1225,9 @@ static av_cold int vaapi_encode_h264_init(AVCodecContext *avctx)
av_log(avctx, AV_LOG_ERROR, "H.264 extended profile "
"is not supported.\n");
return AVERROR_PATCHWELCOME;
- case FF_PROFILE_H264_HIGH_10:
case FF_PROFILE_H264_HIGH_10_INTRA:
- av_log(avctx, AV_LOG_ERROR, "H.264 10-bit profiles "
- "are not supported.\n");
+ av_log(avctx, AV_LOG_ERROR, "H.264 high 10 intra profile "
+ "is not supported.\n");
return AVERROR_PATCHWELCOME;
case FF_PROFILE_H264_HIGH_422:
case FF_PROFILE_H264_HIGH_422_INTRA:
@@ -1304,6 +1320,7 @@ static const AVOption vaapi_encode_h264_options[] = {
{ PROFILE("constrained_baseline", FF_PROFILE_H264_CONSTRAINED_BASELINE) },
{ PROFILE("main", FF_PROFILE_H264_MAIN) },
{ PROFILE("high", FF_PROFILE_H264_HIGH) },
+ { PROFILE("high10", FF_PROFILE_H264_HIGH_10) },
#undef PROFILE
{ "level", "Set level (level_idc)",