mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-01-29 18:53:02 +00:00
vaapi: support VAProfileH264High10 encoding
see https://github.com/intel/libva/pull/664 Signed-off-by: jianfeng.zheng <jianfeng.zheng@mthreads.com>
This commit is contained in:
parent
1cd5a383d4
commit
65e537b833
@ -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)",
|
||||
|
Loading…
Reference in New Issue
Block a user