25 #define OFFSET(x) offsetof(AmfContext, x) 26 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM 31 {
"usage",
"Encoder Usage",
OFFSET(
usage),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_USAGE_TRANSCONDING }, AMF_VIDEO_ENCODER_USAGE_TRANSCONDING, AMF_VIDEO_ENCODER_USAGE_WEBCAM,
VE,
"usage" },
32 {
"transcoding",
"Generic Transcoding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_TRANSCONDING }, 0, 0,
VE,
"usage" },
33 {
"ultralowlatency",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_ULTRA_LOW_LATENCY }, 0, 0,
VE,
"usage" },
34 {
"lowlatency",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_LOW_LATENCY }, 0, 0,
VE,
"usage" },
35 {
"webcam",
"Webcam", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_USAGE_WEBCAM }, 0, 0,
VE,
"usage" },
38 {
"profile",
"Profile",
OFFSET(
profile),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_PROFILE_MAIN }, AMF_VIDEO_ENCODER_PROFILE_BASELINE, AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH,
VE,
"profile" },
39 {
"main",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_MAIN }, 0, 0,
VE,
"profile" },
40 {
"high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_HIGH }, 0, 0,
VE,
"profile" },
41 {
"constrained_baseline",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE }, 0, 0,
VE,
"profile" },
42 {
"constrained_high",
"", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH }, 0, 0,
VE,
"profile" },
69 {
"quality",
"Quality Preference",
OFFSET(
quality),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_SPEED }, AMF_VIDEO_ENCODER_QUALITY_PRESET_BALANCED, AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY,
VE,
"quality" },
70 {
"speed",
"Prefer Speed", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_SPEED }, 0, 0,
VE,
"quality" },
71 {
"balanced",
"Balanced", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_BALANCED }, 0, 0,
VE,
"quality" },
72 {
"quality",
"Prefer Quality", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_QUALITY_PRESET_QUALITY }, 0, 0,
VE,
"quality" },
76 {
"rc",
"Rate Control Method",
OFFSET(rate_control_mode),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN }, AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_UNKNOWN, AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR,
VE,
"rc" },
77 {
"cqp",
"Constant Quantization Parameter", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP }, 0, 0,
VE,
"rc" },
78 {
"cbr",
"Constant Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CBR }, 0, 0,
VE,
"rc" },
79 {
"vbr_peak",
"Peak Contrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
80 {
"vbr_latency",
"Latency Constrained Variable Bitrate", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_LATENCY_CONSTRAINED_VBR }, 0, 0,
VE,
"rc" },
97 {
"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 },
100 {
"header_spacing",
"Header Insertion Spacing",
OFFSET(header_spacing),
AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1000, VE },
104 {
"bf_delta_qp",
"B-Picture Delta QP",
OFFSET(b_frame_delta_qp),
AV_OPT_TYPE_INT, { .i64 = 4 }, -10, 10, VE },
105 {
"bf_ref",
"Enable Reference to B-Frames",
OFFSET(b_frame_ref),
AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
106 {
"bf_ref_delta_qp",
"Reference B-Picture Delta QP",
OFFSET(ref_b_frame_delta_qp),
AV_OPT_TYPE_INT, { .i64 = 4 }, -10, 10, VE },
109 {
"intra_refresh_mb",
"Intra Refresh MBs Number Per Slot in Macroblocks",
OFFSET(intra_refresh_mb),
AV_OPT_TYPE_INT, { .i64 = 0 }, 0, INT_MAX, VE },
112 {
"coder",
"Coding Type",
OFFSET(coding_mode),
AV_OPT_TYPE_INT, { .i64 = AMF_VIDEO_ENCODER_UNDEFINED }, AMF_VIDEO_ENCODER_UNDEFINED, AMF_VIDEO_ENCODER_CALV,
VE,
"coder" },
113 {
"auto",
"Automatic", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_UNDEFINED }, 0, 0,
VE,
"coder" },
114 {
"cavlc",
"Context Adaptive Variable-Length Coding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_CALV }, 0, 0,
VE,
"coder" },
115 {
"cabac",
"Context Adaptive Binary Arithmetic Coding", 0,
AV_OPT_TYPE_CONST, { .i64 = AMF_VIDEO_ENCODER_CABAC }, 0, 0,
VE,
"coder" },
118 {
"me_quarter_pel",
"Enable ME Quarter Pixel",
OFFSET(me_quarter_pel),
AV_OPT_TYPE_BOOL, { .i64 = 1 }, 0, 1, VE },
122 {
"log_to_dbg",
"Enable AMF logging to debug output",
OFFSET(log_to_dbg) ,
AV_OPT_TYPE_BOOL, { .i64 = 0 }, 0, 1, VE },
130 AMF_RESULT res = AMF_OK;
132 AMFVariantStruct var = { 0 };
134 amf_int64 profile_level = 0;
138 AMFSize framesize = AMFConstructSize(avctx->
width, avctx->
height);
151 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_USAGE, ctx->
usage);
153 AMF_ASSIGN_PROPERTY_SIZE(res, ctx->
encoder, AMF_VIDEO_ENCODER_FRAMESIZE, framesize);
155 AMF_ASSIGN_PROPERTY_RATE(res, ctx->
encoder, AMF_VIDEO_ENCODER_FRAMERATE, framerate);
159 profile = AMF_VIDEO_ENCODER_PROFILE_BASELINE;
162 profile = AMF_VIDEO_ENCODER_PROFILE_MAIN;
165 profile = AMF_VIDEO_ENCODER_PROFILE_HIGH;
168 profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_BASELINE;
171 profile = AMF_VIDEO_ENCODER_PROFILE_CONSTRAINED_HIGH;
178 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_PROFILE, profile);
180 profile_level = avctx->
level;
182 profile_level = ctx->
level;
184 if (profile_level != 0) {
185 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_PROFILE_LEVEL, profile_level);
189 if (avctx->
refs != -1) {
190 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MAX_NUM_REFRAMES, avctx->
refs);
194 AMF_ASSIGN_PROPERTY_RATIO(res, ctx->
encoder, AMF_VIDEO_ENCODER_ASPECT_RATIO, ratio);
199 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_FULL_RANGE_COLOR, 1);
204 if (ctx->
qp_i != -1 || ctx->
qp_p != -1 || ctx->
qp_b != -1) {
208 ctx->
rate_control_mode = AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR;
216 if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
217 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_RATE_CONTROL_PREANALYSIS_ENABLE, AMF_VIDEO_ENCODER_PREENCODE_DISABLED);
219 av_log(ctx,
AV_LOG_WARNING,
"Pre-Analysis is not supported by cqp Rate Control Method, automatically disabled\n");
221 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_RATE_CONTROL_PREANALYSIS_ENABLE, ctx->
preanalysis);
224 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_QUALITY_PRESET, ctx->
quality);
231 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_VBV_BUFFER_SIZE, avctx->
rc_buffer_size);
234 if (amf_buffer_fullness > 64)
235 amf_buffer_fullness = 64;
236 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_INITIAL_VBV_BUFFER_FULLNESS, amf_buffer_fullness);
240 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MAX_AU_SIZE, ctx->
max_au_size);
246 if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
247 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MIN_QP, 0);
248 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MAX_QP, 51);
250 if (avctx->
qmin != -1) {
251 int qval = avctx->
qmin > 51 ? 51 : avctx->
qmin;
252 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MIN_QP, qval);
254 if (avctx->
qmax != -1) {
255 int qval = avctx->
qmax > 51 ? 51 : avctx->
qmax;
256 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_MAX_QP, qval);
261 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_QP_I, ctx->
qp_i);
263 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_QP_P, ctx->
qp_p);
265 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_QP_B, ctx->
qp_b);
267 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_TARGET_BITRATE, avctx->
bit_rate);
270 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_PEAK_BITRATE, avctx->
bit_rate);
273 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_PEAK_BITRATE, avctx->
rc_max_rate);
274 }
else if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR) {
275 av_log(ctx,
AV_LOG_WARNING,
"rate control mode is PEAK_CONSTRAINED_VBR but rc_max_rate is not set\n");
283 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_ENFORCE_HRD, !!ctx->
enforce_hrd);
284 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_FILLER_DATA_ENABLE, !!ctx->
filler_data);
285 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_RATE_CONTROL_SKIP_FRAME_ENABLE, !!ctx->
skip_frame);
286 if (ctx->
rate_control_mode == AMF_VIDEO_ENCODER_RATE_CONTROL_METHOD_CONSTANT_QP) {
287 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_ENABLE_VBAQ, 0);
289 av_log(ctx,
AV_LOG_WARNING,
"VBAQ is not supported by cqp Rate Control Method, automatically disabled\n");
291 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_ENABLE_VBAQ, !!ctx->
enable_vbaq);
293 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_DE_BLOCKING_FILTER, !!deblocking_filter);
296 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, avctx->
max_b_frames);
298 res = ctx->
encoder->pVtbl->GetProperty(ctx->
encoder, AMF_VIDEO_ENCODER_B_PIC_PATTERN, &var);
305 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_B_REFERENCE_ENABLE, !!ctx->
b_frame_ref);
310 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_IDR_PERIOD, avctx->
gop_size);
314 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_HEADER_INSERTION_SPACING, ctx->
header_spacing);
318 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_INTRA_REFRESH_NUM_MBS_PER_SLOT, ctx->
intra_refresh_mb);
320 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_SLICES_PER_FRAME, avctx->
slices);
324 AMF_ASSIGN_PROPERTY_INT64(res, ctx->
encoder, AMF_VIDEO_ENCODER_CABAC_ENABLE, ctx->
coding_mode);
327 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_MOTION_HALF_PIXEL, !!ctx->
me_half_pel);
328 AMF_ASSIGN_PROPERTY_BOOL(res, ctx->
encoder, AMF_VIDEO_ENCODER_MOTION_QUARTERPIXEL, !!ctx->
me_quarter_pel);
331 res = AMFVariantInit(&var);
334 res = ctx->
encoder->pVtbl->GetProperty(ctx->
encoder, AMF_VIDEO_ENCODER_EXTRADATA, &var);
338 guid = IID_AMFBuffer();
340 res = var.pInterface->pVtbl->QueryInterface(var.pInterface, &guid, (
void**)&buffer);
342 var.pInterface->pVtbl->Release(var.pInterface);
349 buffer->pVtbl->Release(buffer);
350 var.pInterface->pVtbl->Release(var.pInterface);
355 buffer->pVtbl->Release(buffer);
356 var.pInterface->pVtbl->Release(var.pInterface);
389 .priv_class = &h264_amf_class,
390 .defaults = defaults,
394 .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...
#define FF_PROFILE_H264_MAIN
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 max_b_frames
maximum number of B-frames between non-B-frames Note: The output will be delayed by max_b_frames+1 re...
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.
enum AVColorRange color_range
MPEG vs JPEG YUV range.
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...
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...
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_H264_BASELINE
AVCodec ff_h264_amf_encoder
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.
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.
#define FF_PROFILE_H264_HIGH
int flags
AV_CODEC_FLAG_*.
const char * name
Name of the codec implementation.
static const AVCodecDefault defaults[]
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.
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.
static const AVClass h264_amf_class
main external API structure.
int qmin
minimum quantizer
static const AVOption options[]
#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 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.
static av_cold int amf_encode_init_h264(AVCodecContext *avctx)
#define FF_PROFILE_H264_CONSTRAINED
#define FF_PROFILE_H264_CONSTRAINED_BASELINE
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
int64_t rc_max_rate
maximum bitrate