24 #define OFFSET(x) offsetof(AmfContext, x) 25 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 27 {
"usage",
"Set the encoding usage",
OFFSET(
usage),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING }, AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING, AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM,
VE,
"usage" },
28 {
"transcoding",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCONDING }, 0, 0,
VE,
"usage" },
29 {
"ultralowlatency",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY }, 0, 0,
VE,
"usage" },
30 {
"lowlatency",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY }, 0, 0,
VE,
"usage" },
31 {
"webcam",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM }, 0, 0,
VE,
"usage" },
33 {
"profile",
"Set the profile (default main)",
OFFSET(
profile),
AV_OPT_TYPE_INT,{ .i64 = AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN }, AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN, AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN,
VE,
"profile" },
34 {
"main",
"", 0,
AV_OPT_TYPE_CONST,{ .i64 = AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN }, 0, 0,
VE,
"profile" },
36 {
"profile_tier",
"Set the profile tier (default main)",
OFFSET(tier),
AV_OPT_TYPE_INT,{ .i64 = AMF_VIDEO_ENCODER_HEVC_TIER_MAIN }, AMF_VIDEO_ENCODER_HEVC_TIER_MAIN, AMF_VIDEO_ENCODER_HEVC_TIER_HIGH,
VE,
"tier" },
37 {
"main",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_TIER_MAIN }, 0, 0,
VE,
"tier" },
38 {
"high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_TIER_HIGH }, 0, 0,
VE,
"tier" },
56 {
"quality",
"Set the encoding quality",
OFFSET(
quality),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED }, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_QUALITY, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED,
VE,
"quality" },
57 {
"balanced",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_BALANCED }, 0, 0,
VE,
"quality" },
58 {
"speed",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED }, 0, 0,
VE,
"quality" },
59 {
"quality",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_QUALITY }, 0, 0,
VE,
"quality" },
61 {
"rc",
"Set the rate control mode",
OFFSET(rate_control_mode),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN }, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR,
VE,
"rc" },
62 {
"cqp",
"Constant Quantization Parameter", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP }, 0, 0,
VE,
"rc" },
63 {
"cbr",
"Constant Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR }, 0, 0,
VE,
"rc" },
64 {
"vbr_peak",
"Peak Contrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
65 {
"vbr_latency",
"Latency Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
67 {
"header_insertion_mode",
"Set header insertion mode",
OFFSET(header_insertion_mode),
AV_OPT_TYPE_INT,{ .i64 = AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_NONE }, AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_NONE, AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_IDR_ALIGNED,
VE,
"hdrmode" },
68 {
"none",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_NONE }, 0, 0,
VE,
"hdrmode" },
69 {
"gop",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_GOP_ALIGNED }, 0, 0,
VE,
"hdrmode" },
70 {
"idr",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_IDR_ALIGNED }, 0, 0,
VE,
"hdrmode" },
72 {
"gops_per_idr",
"GOPs per IDR 0-no IDR will be inserted",
OFFSET(gops_per_idr),
AV_OPT_TYPE_INT, { .i64 = 1 }, 0, INT_MAX,
VE },
77 {
"max_au_size",
"Maximum Access Unit Size for rate control (in bits)",
OFFSET(max_au_size),
AV_OPT_TYPE_INT,{ .i64 = 0 }, 0, INT_MAX, VE},
78 {
"min_qp_i",
"min quantization parameter for I-frame",
OFFSET(min_qp_i),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
79 {
"max_qp_i",
"max quantization parameter for I-frame",
OFFSET(max_qp_i),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
80 {
"min_qp_p",
"min quantization parameter for P-frame",
OFFSET(min_qp_p),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
81 {
"max_qp_p",
"max quantization parameter for P-frame",
OFFSET(max_qp_p),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
82 {
"qp_p",
"quantization parameter for P-frame",
OFFSET(qp_p),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
83 {
"qp_i",
"quantization parameter for I-frame",
OFFSET(qp_i),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE },
84 {
"skip_frame",
"Rate Control Based Frame Skip",
OFFSET(skip_frame),
AV_OPT_TYPE_BOOL,{ .i64 = 0 }, 0, 1, VE },
86 {
"me_quarter_pel",
"Enable ME Quarter Pixel ",
OFFSET(me_quarter_pel),
AV_OPT_TYPE_BOOL,{ .i64 = 1 }, 0, 1, VE },
90 {
"log_to_dbg",
"Enable AMF logging to debug output",
OFFSET(log_to_dbg),
AV_OPT_TYPE_BOOL,{ .i64 = 0 }, 0, 1, VE },
97 AMF_RESULT res = AMF_OK;
99 AMFVariantStruct var = {0};
101 amf_int64 profile_level = 0;
105 AMFSize framesize = AMFConstructSize(avctx->
width, avctx->
height);
118 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_USAGE, ctx->
usage);
120 AMF_ASSIGN_PROPERTY_SIZE(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_FRAMESIZE, framesize);
122 AMF_ASSIGN_PROPERTY_RATE(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_FRAMERATE, framerate);
126 profile = AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN;
134 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_PROFILE, profile);
136 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_TIER, ctx->
tier);
138 profile_level = avctx->
level;
140 profile_level = ctx->
level;
142 if (profile_level != 0) {
143 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_PROFILE_LEVEL, profile_level);
145 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET, ctx->
quality);
147 if (avctx->
refs != -1) {
148 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_NUM_REFRAMES, avctx->
refs);
153 AMF_ASSIGN_PROPERTY_RATIO(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_ASPECT_RATIO, ratio);
157 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_NUM_GOPS_PER_IDR, ctx->
gops_per_idr);
158 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_GOP_SIZE, avctx->
gop_size);
160 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_SLICES_PER_FRAME, avctx->
slices);
162 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_DE_BLOCKING_FILTER_DISABLE, deblocking_filter);
167 if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN) {
170 ctx->
qp_i !=-1 || ctx->
qp_p != -1) {
174 ctx->
rate_control_mode = AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR;
185 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_VBV_BUFFER_SIZE, avctx->
rc_buffer_size);
189 if (amf_buffer_fullness > 64)
190 amf_buffer_fullness = 64;
191 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_INITIAL_VBV_BUFFER_FULLNESS, amf_buffer_fullness);
195 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_PREANALYSIS_ENABLE, ctx->
preanalysis);
197 if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP) {
198 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ,
false);
200 av_log(ctx,
AV_LOG_WARNING,
"VBAQ is not supported by cqp Rate Control Method, automatically disabled\n");
202 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ, !!ctx->
enable_vbaq);
204 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MOTION_HALF_PIXEL, ctx->
me_half_pel);
205 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MOTION_QUARTERPIXEL, ctx->
me_quarter_pel);
210 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_ENFORCE_HRD, ctx->
enforce_hrd);
211 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_FILLER_DATA_ENABLE, ctx->
filler_data);
213 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE, avctx->
bit_rate);
216 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE, avctx->
bit_rate);
219 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE, avctx->
rc_max_rate);
220 }
else if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR) {
221 av_log(ctx,
AV_LOG_WARNING,
"rate control mode is PEAK_CONSTRAINED_VBR but rc_max_rate is not set\n");
229 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_AU_SIZE, ctx->
max_au_size);
232 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MIN_QP_I, ctx->
min_qp_i);
233 }
else if (avctx->
qmin != -1) {
234 int qval = avctx->
qmin > 51 ? 51 : avctx->
qmin;
235 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MIN_QP_I, qval);
238 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_QP_I, ctx->
max_qp_i);
239 }
else if (avctx->
qmax != -1) {
240 int qval = avctx->
qmax > 51 ? 51 : avctx->
qmax;
241 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_QP_I, qval);
244 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MIN_QP_P, ctx->
min_qp_p);
245 }
else if (avctx->
qmin != -1) {
246 int qval = avctx->
qmin > 51 ? 51 : avctx->
qmin;
247 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MIN_QP_P, qval);
250 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_QP_P, ctx->
max_qp_p);
251 }
else if (avctx->
qmax != -1) {
252 int qval = avctx->
qmax > 51 ? 51 : avctx->
qmax;
253 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_MAX_QP_P, qval);
256 if (ctx->
qp_p != -1) {
257 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_QP_P, ctx->
qp_p);
259 if (ctx->
qp_i != -1) {
260 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_QP_I, ctx->
qp_i);
262 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_SKIP_FRAME_ENABLE, ctx->
skip_frame);
266 res = AMFVariantInit(&var);
269 res = ctx->
encoder->pVtbl->GetProperty(ctx->
encoder, AMF_VIDEO_ENCODER_HEVC_EXTRADATA, &var);
273 guid = IID_AMFBuffer();
275 res = var.pInterface->pVtbl->QueryInterface(var.pInterface, &guid, (
void**)&buffer);
277 var.pInterface->pVtbl->Release(var.pInterface);
284 buffer->pVtbl->Release(buffer);
285 var.pInterface->pVtbl->Release(var.pInterface);
290 buffer->pVtbl->Release(buffer);
291 var.pInterface->pVtbl->Release(var.pInterface);
319 .priv_class = &hevc_amf_class,
320 .defaults = defaults,
324 .wrapper_name =
"amf",
#define FF_CODEC_CAP_INIT_CLEANUP
The codec allows calling the close function for deallocation even if the init function returned a fai...
ptrdiff_t const GLvoid GLenum usage
const AVCodecHWConfigInternal *const ff_amfenc_hw_configs[]
#define AV_CODEC_FLAG_LOOP_FILTER
loop filter.
#define AV_LOG_WARNING
Something somehow does not look correct.
int64_t bit_rate
the average bitrate
#define LIBAVUTIL_VERSION_INT
int rc_initial_buffer_occupancy
Number of bits which should be loaded into the rc buffer before decoding starts.
#define AV_CODEC_CAP_HARDWARE
Codec is backed by a hardware implementation.
const char * av_default_item_name(void *ptr)
Return the context name.
AVRational sample_aspect_ratio
sample aspect ratio (0 if unknown) That is the width of a pixel divided by the height of the pixel...
#define AMF_RETURN_IF_FALSE(avctx, exp, ret_value,...)
Error handling helper.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
static const AVClass hevc_amf_class
AMF_SURFACE_FORMAT format
AMF surface format.
AVRational time_base
This is the fundamental unit of time (in seconds) in terms of which frame timestamps are represented...
static av_cold int amf_encode_init_hevc(AVCodecContext *avctx)
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
#define AV_CODEC_CAP_DELAY
Encoder or decoder requires flushing with NULL input at the end in order to give the complete and cor...
#define FF_PROFILE_HEVC_MAIN
uint8_t * extradata
some codecs need / can use extradata like Huffman tables.
int av_cold ff_amf_encode_close(AVCodecContext *avctx)
Common encoder termination function.
AVCodec ff_hevc_amf_encoder
int qmax
maximum quantizer
#define NULL_IF_CONFIG_SMALL(x)
Return NULL if CONFIG_SMALL is true, otherwise the argument without modification. ...
#define AV_LOG_DEBUG
Stuff which is only useful for libav* developers.
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
enum AVPixelFormat ff_amf_pix_fmts[]
Supported formats.
int rc_buffer_size
decoder bitstream buffer size
common internal API header
int refs
number of reference frames
int ff_amf_encode_init(AVCodecContext *avctx)
Common encoder initization function.
int width
picture width / height.
static const AVCodecDefault defaults[]
trying all byte sequences megabyte in length and selecting the best looking sequence will yield cases to try But a word about quality
int ticks_per_frame
For some codecs, the time base is closer to the field rate than the frame rate.
AMFComponent * encoder
AMF encoder object.
main external API structure.
int qmin
minimum quantizer
#define AVERROR_BUG
Internal bug, also see AVERROR_BUG2.
static int FUNC() aud(CodedBitstreamContext *ctx, RWContext *rw, H264RawAUD *current)
Describe the class of an AVClass context structure.
int ff_amf_receive_packet(AVCodecContext *avctx, AVPacket *avpkt)
Ecoding one frame - common function for all AMF encoders.
static enum AVPixelFormat pix_fmts[]
int header_insertion_mode
int gop_size
the number of pictures in a group of pictures, or 0 for intra_only
common internal api header.
#define AV_INPUT_BUFFER_PADDING_SIZE
Required number of additionally allocated bytes at the end of the input bitstream for decoding...
int slices
Number of slices.
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Frame references ownership and permissions
static const AVOption options[]
int64_t rc_max_rate
maximum bitrate