1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * This file is part of FFmpeg. 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 5cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 6cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 7cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 8cabdff1aSopenharmony_ci * 9cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 10cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 11cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12cabdff1aSopenharmony_ci * Lesser General Public License for more details. 13cabdff1aSopenharmony_ci * 14cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 16cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17cabdff1aSopenharmony_ci */ 18cabdff1aSopenharmony_ci 19cabdff1aSopenharmony_ci#include <va/va.h> 20cabdff1aSopenharmony_ci#include <va/va_enc_vp9.h> 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include "libavutil/avassert.h" 23cabdff1aSopenharmony_ci#include "libavutil/common.h" 24cabdff1aSopenharmony_ci#include "libavutil/internal.h" 25cabdff1aSopenharmony_ci#include "libavutil/opt.h" 26cabdff1aSopenharmony_ci#include "libavutil/pixfmt.h" 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci#include "avcodec.h" 29cabdff1aSopenharmony_ci#include "codec_internal.h" 30cabdff1aSopenharmony_ci#include "vaapi_encode.h" 31cabdff1aSopenharmony_ci 32cabdff1aSopenharmony_ci#define VP9_MAX_QUANT 255 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#define VP9_MAX_TILE_WIDTH 4096 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_citypedef struct VAAPIEncodeVP9Picture { 37cabdff1aSopenharmony_ci int slot; 38cabdff1aSopenharmony_ci} VAAPIEncodeVP9Picture; 39cabdff1aSopenharmony_ci 40cabdff1aSopenharmony_citypedef struct VAAPIEncodeVP9Context { 41cabdff1aSopenharmony_ci VAAPIEncodeContext common; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci // User options. 44cabdff1aSopenharmony_ci int loop_filter_level; 45cabdff1aSopenharmony_ci int loop_filter_sharpness; 46cabdff1aSopenharmony_ci 47cabdff1aSopenharmony_ci // Derived settings. 48cabdff1aSopenharmony_ci int q_idx_idr; 49cabdff1aSopenharmony_ci int q_idx_p; 50cabdff1aSopenharmony_ci int q_idx_b; 51cabdff1aSopenharmony_ci} VAAPIEncodeVP9Context; 52cabdff1aSopenharmony_ci 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_cistatic int vaapi_encode_vp9_init_sequence_params(AVCodecContext *avctx) 55cabdff1aSopenharmony_ci{ 56cabdff1aSopenharmony_ci VAAPIEncodeContext *ctx = avctx->priv_data; 57cabdff1aSopenharmony_ci VAEncSequenceParameterBufferVP9 *vseq = ctx->codec_sequence_params; 58cabdff1aSopenharmony_ci VAEncPictureParameterBufferVP9 *vpic = ctx->codec_picture_params; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci vseq->max_frame_width = avctx->width; 61cabdff1aSopenharmony_ci vseq->max_frame_height = avctx->height; 62cabdff1aSopenharmony_ci 63cabdff1aSopenharmony_ci vseq->kf_auto = 0; 64cabdff1aSopenharmony_ci 65cabdff1aSopenharmony_ci if (!(ctx->va_rc_mode & VA_RC_CQP)) { 66cabdff1aSopenharmony_ci vseq->bits_per_second = ctx->va_bit_rate; 67cabdff1aSopenharmony_ci vseq->intra_period = ctx->gop_size; 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci 70cabdff1aSopenharmony_ci vpic->frame_width_src = avctx->width; 71cabdff1aSopenharmony_ci vpic->frame_height_src = avctx->height; 72cabdff1aSopenharmony_ci vpic->frame_width_dst = avctx->width; 73cabdff1aSopenharmony_ci vpic->frame_height_dst = avctx->height; 74cabdff1aSopenharmony_ci 75cabdff1aSopenharmony_ci return 0; 76cabdff1aSopenharmony_ci} 77cabdff1aSopenharmony_ci 78cabdff1aSopenharmony_cistatic int vaapi_encode_vp9_init_picture_params(AVCodecContext *avctx, 79cabdff1aSopenharmony_ci VAAPIEncodePicture *pic) 80cabdff1aSopenharmony_ci{ 81cabdff1aSopenharmony_ci VAAPIEncodeContext *ctx = avctx->priv_data; 82cabdff1aSopenharmony_ci VAAPIEncodeVP9Context *priv = avctx->priv_data; 83cabdff1aSopenharmony_ci VAAPIEncodeVP9Picture *hpic = pic->priv_data; 84cabdff1aSopenharmony_ci VAEncPictureParameterBufferVP9 *vpic = pic->codec_picture_params; 85cabdff1aSopenharmony_ci int i; 86cabdff1aSopenharmony_ci int num_tile_columns; 87cabdff1aSopenharmony_ci 88cabdff1aSopenharmony_ci vpic->reconstructed_frame = pic->recon_surface; 89cabdff1aSopenharmony_ci vpic->coded_buf = pic->output_buffer; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci // Maximum width of a tile in units of superblocks is MAX_TILE_WIDTH_B64(64) 92cabdff1aSopenharmony_ci // So the number of tile columns is related to the width of the picture. 93cabdff1aSopenharmony_ci // We set the minimum possible number for num_tile_columns as default value. 94cabdff1aSopenharmony_ci num_tile_columns = (vpic->frame_width_src + VP9_MAX_TILE_WIDTH - 1) / VP9_MAX_TILE_WIDTH; 95cabdff1aSopenharmony_ci vpic->log2_tile_columns = num_tile_columns == 1 ? 0 : av_log2(num_tile_columns - 1) + 1; 96cabdff1aSopenharmony_ci 97cabdff1aSopenharmony_ci switch (pic->type) { 98cabdff1aSopenharmony_ci case PICTURE_TYPE_IDR: 99cabdff1aSopenharmony_ci av_assert0(pic->nb_refs == 0); 100cabdff1aSopenharmony_ci vpic->ref_flags.bits.force_kf = 1; 101cabdff1aSopenharmony_ci vpic->refresh_frame_flags = 0xff; 102cabdff1aSopenharmony_ci hpic->slot = 0; 103cabdff1aSopenharmony_ci break; 104cabdff1aSopenharmony_ci case PICTURE_TYPE_P: 105cabdff1aSopenharmony_ci av_assert0(pic->nb_refs == 1); 106cabdff1aSopenharmony_ci { 107cabdff1aSopenharmony_ci VAAPIEncodeVP9Picture *href = pic->refs[0]->priv_data; 108cabdff1aSopenharmony_ci av_assert0(href->slot == 0 || href->slot == 1); 109cabdff1aSopenharmony_ci 110cabdff1aSopenharmony_ci if (ctx->max_b_depth > 0) { 111cabdff1aSopenharmony_ci hpic->slot = !href->slot; 112cabdff1aSopenharmony_ci vpic->refresh_frame_flags = 1 << hpic->slot | 0xfc; 113cabdff1aSopenharmony_ci } else { 114cabdff1aSopenharmony_ci hpic->slot = 0; 115cabdff1aSopenharmony_ci vpic->refresh_frame_flags = 0xff; 116cabdff1aSopenharmony_ci } 117cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_frame_ctrl_l0 = 1; 118cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_last_idx = href->slot; 119cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_last_sign_bias = 1; 120cabdff1aSopenharmony_ci } 121cabdff1aSopenharmony_ci break; 122cabdff1aSopenharmony_ci case PICTURE_TYPE_B: 123cabdff1aSopenharmony_ci av_assert0(pic->nb_refs == 2); 124cabdff1aSopenharmony_ci { 125cabdff1aSopenharmony_ci VAAPIEncodeVP9Picture *href0 = pic->refs[0]->priv_data, 126cabdff1aSopenharmony_ci *href1 = pic->refs[1]->priv_data; 127cabdff1aSopenharmony_ci av_assert0(href0->slot < pic->b_depth + 1 && 128cabdff1aSopenharmony_ci href1->slot < pic->b_depth + 1); 129cabdff1aSopenharmony_ci 130cabdff1aSopenharmony_ci if (pic->b_depth == ctx->max_b_depth) { 131cabdff1aSopenharmony_ci // Unreferenced frame. 132cabdff1aSopenharmony_ci vpic->refresh_frame_flags = 0x00; 133cabdff1aSopenharmony_ci hpic->slot = 8; 134cabdff1aSopenharmony_ci } else { 135cabdff1aSopenharmony_ci vpic->refresh_frame_flags = 0xfe << pic->b_depth & 0xff; 136cabdff1aSopenharmony_ci hpic->slot = 1 + pic->b_depth; 137cabdff1aSopenharmony_ci } 138cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_frame_ctrl_l0 = 1; 139cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_frame_ctrl_l1 = 2; 140cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_last_idx = href0->slot; 141cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_last_sign_bias = 1; 142cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_gf_idx = href1->slot; 143cabdff1aSopenharmony_ci vpic->ref_flags.bits.ref_gf_sign_bias = 0; 144cabdff1aSopenharmony_ci } 145cabdff1aSopenharmony_ci break; 146cabdff1aSopenharmony_ci default: 147cabdff1aSopenharmony_ci av_assert0(0 && "invalid picture type"); 148cabdff1aSopenharmony_ci } 149cabdff1aSopenharmony_ci if (vpic->refresh_frame_flags == 0x00) { 150cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Pic %"PRId64" not stored.\n", 151cabdff1aSopenharmony_ci pic->display_order); 152cabdff1aSopenharmony_ci } else { 153cabdff1aSopenharmony_ci av_log(avctx, AV_LOG_DEBUG, "Pic %"PRId64" stored in slot %d.\n", 154cabdff1aSopenharmony_ci pic->display_order, hpic->slot); 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci 157cabdff1aSopenharmony_ci for (i = 0; i < FF_ARRAY_ELEMS(vpic->reference_frames); i++) 158cabdff1aSopenharmony_ci vpic->reference_frames[i] = VA_INVALID_SURFACE; 159cabdff1aSopenharmony_ci 160cabdff1aSopenharmony_ci for (i = 0; i < pic->nb_refs; i++) { 161cabdff1aSopenharmony_ci VAAPIEncodePicture *ref_pic = pic->refs[i]; 162cabdff1aSopenharmony_ci int slot; 163cabdff1aSopenharmony_ci slot = ((VAAPIEncodeVP9Picture*)ref_pic->priv_data)->slot; 164cabdff1aSopenharmony_ci av_assert0(vpic->reference_frames[slot] == VA_INVALID_SURFACE); 165cabdff1aSopenharmony_ci vpic->reference_frames[slot] = ref_pic->recon_surface; 166cabdff1aSopenharmony_ci } 167cabdff1aSopenharmony_ci 168cabdff1aSopenharmony_ci vpic->pic_flags.bits.frame_type = (pic->type != PICTURE_TYPE_IDR); 169cabdff1aSopenharmony_ci vpic->pic_flags.bits.show_frame = pic->display_order <= pic->encode_order; 170cabdff1aSopenharmony_ci 171cabdff1aSopenharmony_ci if (pic->type == PICTURE_TYPE_IDR) 172cabdff1aSopenharmony_ci vpic->luma_ac_qindex = priv->q_idx_idr; 173cabdff1aSopenharmony_ci else if (pic->type == PICTURE_TYPE_P) 174cabdff1aSopenharmony_ci vpic->luma_ac_qindex = priv->q_idx_p; 175cabdff1aSopenharmony_ci else 176cabdff1aSopenharmony_ci vpic->luma_ac_qindex = priv->q_idx_b; 177cabdff1aSopenharmony_ci vpic->luma_dc_qindex_delta = 0; 178cabdff1aSopenharmony_ci vpic->chroma_ac_qindex_delta = 0; 179cabdff1aSopenharmony_ci vpic->chroma_dc_qindex_delta = 0; 180cabdff1aSopenharmony_ci 181cabdff1aSopenharmony_ci vpic->filter_level = priv->loop_filter_level; 182cabdff1aSopenharmony_ci vpic->sharpness_level = priv->loop_filter_sharpness; 183cabdff1aSopenharmony_ci 184cabdff1aSopenharmony_ci return 0; 185cabdff1aSopenharmony_ci} 186cabdff1aSopenharmony_ci 187cabdff1aSopenharmony_cistatic av_cold int vaapi_encode_vp9_get_encoder_caps(AVCodecContext *avctx) 188cabdff1aSopenharmony_ci{ 189cabdff1aSopenharmony_ci VAAPIEncodeContext *ctx = avctx->priv_data; 190cabdff1aSopenharmony_ci 191cabdff1aSopenharmony_ci // Surfaces must be aligned to 64x64 superblock boundaries. 192cabdff1aSopenharmony_ci ctx->surface_width = FFALIGN(avctx->width, 64); 193cabdff1aSopenharmony_ci ctx->surface_height = FFALIGN(avctx->height, 64); 194cabdff1aSopenharmony_ci 195cabdff1aSopenharmony_ci return 0; 196cabdff1aSopenharmony_ci} 197cabdff1aSopenharmony_ci 198cabdff1aSopenharmony_cistatic av_cold int vaapi_encode_vp9_configure(AVCodecContext *avctx) 199cabdff1aSopenharmony_ci{ 200cabdff1aSopenharmony_ci VAAPIEncodeContext *ctx = avctx->priv_data; 201cabdff1aSopenharmony_ci VAAPIEncodeVP9Context *priv = avctx->priv_data; 202cabdff1aSopenharmony_ci 203cabdff1aSopenharmony_ci if (ctx->rc_mode->quality) { 204cabdff1aSopenharmony_ci priv->q_idx_p = av_clip(ctx->rc_quality, 0, VP9_MAX_QUANT); 205cabdff1aSopenharmony_ci if (avctx->i_quant_factor > 0.0) 206cabdff1aSopenharmony_ci priv->q_idx_idr = 207cabdff1aSopenharmony_ci av_clip((avctx->i_quant_factor * priv->q_idx_p + 208cabdff1aSopenharmony_ci avctx->i_quant_offset) + 0.5, 209cabdff1aSopenharmony_ci 0, VP9_MAX_QUANT); 210cabdff1aSopenharmony_ci else 211cabdff1aSopenharmony_ci priv->q_idx_idr = priv->q_idx_p; 212cabdff1aSopenharmony_ci if (avctx->b_quant_factor > 0.0) 213cabdff1aSopenharmony_ci priv->q_idx_b = 214cabdff1aSopenharmony_ci av_clip((avctx->b_quant_factor * priv->q_idx_p + 215cabdff1aSopenharmony_ci avctx->b_quant_offset) + 0.5, 216cabdff1aSopenharmony_ci 0, VP9_MAX_QUANT); 217cabdff1aSopenharmony_ci else 218cabdff1aSopenharmony_ci priv->q_idx_b = priv->q_idx_p; 219cabdff1aSopenharmony_ci } else { 220cabdff1aSopenharmony_ci // Arbitrary value. 221cabdff1aSopenharmony_ci priv->q_idx_idr = priv->q_idx_p = priv->q_idx_b = 100; 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci 224cabdff1aSopenharmony_ci ctx->roi_quant_range = VP9_MAX_QUANT; 225cabdff1aSopenharmony_ci 226cabdff1aSopenharmony_ci return 0; 227cabdff1aSopenharmony_ci} 228cabdff1aSopenharmony_ci 229cabdff1aSopenharmony_cistatic const VAAPIEncodeProfile vaapi_encode_vp9_profiles[] = { 230cabdff1aSopenharmony_ci { FF_PROFILE_VP9_0, 8, 3, 1, 1, VAProfileVP9Profile0 }, 231cabdff1aSopenharmony_ci { FF_PROFILE_VP9_2, 10, 3, 1, 1, VAProfileVP9Profile2 }, 232cabdff1aSopenharmony_ci { FF_PROFILE_UNKNOWN } 233cabdff1aSopenharmony_ci}; 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_cistatic const VAAPIEncodeType vaapi_encode_type_vp9 = { 236cabdff1aSopenharmony_ci .profiles = vaapi_encode_vp9_profiles, 237cabdff1aSopenharmony_ci 238cabdff1aSopenharmony_ci .flags = FLAG_B_PICTURES | 239cabdff1aSopenharmony_ci FLAG_B_PICTURE_REFERENCES, 240cabdff1aSopenharmony_ci 241cabdff1aSopenharmony_ci .default_quality = 100, 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci .picture_priv_data_size = sizeof(VAAPIEncodeVP9Picture), 244cabdff1aSopenharmony_ci 245cabdff1aSopenharmony_ci .get_encoder_caps = &vaapi_encode_vp9_get_encoder_caps, 246cabdff1aSopenharmony_ci .configure = &vaapi_encode_vp9_configure, 247cabdff1aSopenharmony_ci 248cabdff1aSopenharmony_ci .sequence_params_size = sizeof(VAEncSequenceParameterBufferVP9), 249cabdff1aSopenharmony_ci .init_sequence_params = &vaapi_encode_vp9_init_sequence_params, 250cabdff1aSopenharmony_ci 251cabdff1aSopenharmony_ci .picture_params_size = sizeof(VAEncPictureParameterBufferVP9), 252cabdff1aSopenharmony_ci .init_picture_params = &vaapi_encode_vp9_init_picture_params, 253cabdff1aSopenharmony_ci}; 254cabdff1aSopenharmony_ci 255cabdff1aSopenharmony_cistatic av_cold int vaapi_encode_vp9_init(AVCodecContext *avctx) 256cabdff1aSopenharmony_ci{ 257cabdff1aSopenharmony_ci VAAPIEncodeContext *ctx = avctx->priv_data; 258cabdff1aSopenharmony_ci 259cabdff1aSopenharmony_ci ctx->codec = &vaapi_encode_type_vp9; 260cabdff1aSopenharmony_ci 261cabdff1aSopenharmony_ci // No packed headers are currently desired. They could be written, 262cabdff1aSopenharmony_ci // but there isn't any reason to do so - the one usable driver (i965) 263cabdff1aSopenharmony_ci // can write its own headers and there is no metadata to include. 264cabdff1aSopenharmony_ci ctx->desired_packed_headers = 0; 265cabdff1aSopenharmony_ci 266cabdff1aSopenharmony_ci return ff_vaapi_encode_init(avctx); 267cabdff1aSopenharmony_ci} 268cabdff1aSopenharmony_ci 269cabdff1aSopenharmony_ci#define OFFSET(x) offsetof(VAAPIEncodeVP9Context, x) 270cabdff1aSopenharmony_ci#define FLAGS (AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM) 271cabdff1aSopenharmony_cistatic const AVOption vaapi_encode_vp9_options[] = { 272cabdff1aSopenharmony_ci VAAPI_ENCODE_COMMON_OPTIONS, 273cabdff1aSopenharmony_ci VAAPI_ENCODE_RC_OPTIONS, 274cabdff1aSopenharmony_ci 275cabdff1aSopenharmony_ci { "loop_filter_level", "Loop filter level", 276cabdff1aSopenharmony_ci OFFSET(loop_filter_level), AV_OPT_TYPE_INT, { .i64 = 16 }, 0, 63, FLAGS }, 277cabdff1aSopenharmony_ci { "loop_filter_sharpness", "Loop filter sharpness", 278cabdff1aSopenharmony_ci OFFSET(loop_filter_sharpness), AV_OPT_TYPE_INT, { .i64 = 4 }, 0, 15, FLAGS }, 279cabdff1aSopenharmony_ci { NULL }, 280cabdff1aSopenharmony_ci}; 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_cistatic const FFCodecDefault vaapi_encode_vp9_defaults[] = { 283cabdff1aSopenharmony_ci { "b", "0" }, 284cabdff1aSopenharmony_ci { "bf", "0" }, 285cabdff1aSopenharmony_ci { "g", "250" }, 286cabdff1aSopenharmony_ci { "qmin", "-1" }, 287cabdff1aSopenharmony_ci { "qmax", "-1" }, 288cabdff1aSopenharmony_ci { NULL }, 289cabdff1aSopenharmony_ci}; 290cabdff1aSopenharmony_ci 291cabdff1aSopenharmony_cistatic const AVClass vaapi_encode_vp9_class = { 292cabdff1aSopenharmony_ci .class_name = "vp9_vaapi", 293cabdff1aSopenharmony_ci .item_name = av_default_item_name, 294cabdff1aSopenharmony_ci .option = vaapi_encode_vp9_options, 295cabdff1aSopenharmony_ci .version = LIBAVUTIL_VERSION_INT, 296cabdff1aSopenharmony_ci}; 297cabdff1aSopenharmony_ci 298cabdff1aSopenharmony_ciconst FFCodec ff_vp9_vaapi_encoder = { 299cabdff1aSopenharmony_ci .p.name = "vp9_vaapi", 300cabdff1aSopenharmony_ci .p.long_name = NULL_IF_CONFIG_SMALL("VP9 (VAAPI)"), 301cabdff1aSopenharmony_ci .p.type = AVMEDIA_TYPE_VIDEO, 302cabdff1aSopenharmony_ci .p.id = AV_CODEC_ID_VP9, 303cabdff1aSopenharmony_ci .priv_data_size = sizeof(VAAPIEncodeVP9Context), 304cabdff1aSopenharmony_ci .init = &vaapi_encode_vp9_init, 305cabdff1aSopenharmony_ci FF_CODEC_RECEIVE_PACKET_CB(&ff_vaapi_encode_receive_packet), 306cabdff1aSopenharmony_ci .close = &ff_vaapi_encode_close, 307cabdff1aSopenharmony_ci .p.priv_class = &vaapi_encode_vp9_class, 308cabdff1aSopenharmony_ci .p.capabilities = AV_CODEC_CAP_DELAY | AV_CODEC_CAP_HARDWARE | 309cabdff1aSopenharmony_ci AV_CODEC_CAP_DR1, 310cabdff1aSopenharmony_ci .caps_internal = FF_CODEC_CAP_INIT_CLEANUP, 311cabdff1aSopenharmony_ci .defaults = vaapi_encode_vp9_defaults, 312cabdff1aSopenharmony_ci .p.pix_fmts = (const enum AVPixelFormat[]) { 313cabdff1aSopenharmony_ci AV_PIX_FMT_VAAPI, 314cabdff1aSopenharmony_ci AV_PIX_FMT_NONE, 315cabdff1aSopenharmony_ci }, 316cabdff1aSopenharmony_ci .hw_configs = ff_vaapi_encode_hw_configs, 317cabdff1aSopenharmony_ci .p.wrapper_name = "vaapi", 318cabdff1aSopenharmony_ci}; 319