2 * This file is part of FFmpeg.
4 * FFmpeg is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * FFmpeg is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with FFmpeg; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19 #include "libavutil/internal.h"
20 #include "libavutil/mem.h"
21 #include "libavutil/opt.h"
23 #include "codec_internal.h"
24 #include <AMF/components/PreAnalysis.h>
26 #define OFFSET(x) offsetof(AMFEncoderContext, x)
27 #define VE AV_OPT_FLAG_VIDEO_PARAM | AV_OPT_FLAG_ENCODING_PARAM
29 static const AVOption options
[] = {
30 { "usage", "Set the encoding usage", OFFSET(usage
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY
, VE
, .unit
= "usage" },
31 { "transcoding", "Generic Transcoding", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_TRANSCODING
}, 0, 0, VE
, .unit
= "usage" },
32 { "ultralowlatency", "Ultra low latency usecase", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_ULTRA_LOW_LATENCY
}, 0, 0, VE
, .unit
= "usage" },
33 { "lowlatency", "Low latency usecase", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY
}, 0, 0, VE
, .unit
= "usage" },
34 { "webcam", "Webcam", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_WEBCAM
}, 0, 0, VE
, .unit
= "usage" },
35 { "high_quality", "High quality usecase", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_HIGH_QUALITY
}, 0, 0, VE
, .unit
= "usage" },
36 { "lowlatency_high_quality", "Low latency yet high quality usecase", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_VIDEO_ENCODER_HEVC_USAGE_LOW_LATENCY_HIGH_QUALITY
}, 0, 0, VE
, .unit
= "usage" },
38 { "profile", "Set the profile", OFFSET(profile
), AV_OPT_TYPE_INT
,{ .i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN_10
, VE
, .unit
= "profile" },
39 { "main", "", 0, AV_OPT_TYPE_CONST
,{ .i64
= AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN
}, 0, 0, VE
, .unit
= "profile" },
40 { "main10", "", 0, AV_OPT_TYPE_CONST
,{ .i64
= AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN_10
}, 0, 0, VE
, .unit
= "profile" },
42 { "profile_tier", "Set the profile tier (default main)", OFFSET(tier
), AV_OPT_TYPE_INT
,{ .i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_TIER_HIGH
, VE
, .unit
= "tier" },
43 { "main", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_TIER_MAIN
}, 0, 0, VE
, .unit
= "tier" },
44 { "high", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_TIER_HIGH
}, 0, 0, VE
, .unit
= "tier" },
46 { "level", "Set the encoding level (default auto)", OFFSET(level
), AV_OPT_TYPE_INT
,{ .i64
= 0 }, 0, AMF_LEVEL_6_2
, VE
, .unit
= "level" },
47 { "auto", "", 0, AV_OPT_TYPE_CONST
, { .i64
= 0 }, 0, 0, VE
, .unit
= "level" },
48 { "1.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_1
}, 0, 0, VE
, .unit
= "level" },
49 { "2.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_2
}, 0, 0, VE
, .unit
= "level" },
50 { "2.1", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_2_1
}, 0, 0, VE
, .unit
= "level" },
51 { "3.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_3
}, 0, 0, VE
, .unit
= "level" },
52 { "3.1", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_3_1
}, 0, 0, VE
, .unit
= "level" },
53 { "4.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_4
}, 0, 0, VE
, .unit
= "level" },
54 { "4.1", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_4_1
}, 0, 0, VE
, .unit
= "level" },
55 { "5.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_5
}, 0, 0, VE
, .unit
= "level" },
56 { "5.1", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_5_1
}, 0, 0, VE
, .unit
= "level" },
57 { "5.2", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_5_2
}, 0, 0, VE
, .unit
= "level" },
58 { "6.0", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_6
}, 0, 0, VE
, .unit
= "level" },
59 { "6.1", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_6_1
}, 0, 0, VE
, .unit
= "level" },
60 { "6.2", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_LEVEL_6_2
}, 0, 0, VE
, .unit
= "level" },
62 { "quality", "Set the encoding quality preset", OFFSET(quality
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED
, VE
, .unit
= "quality" },
63 { "preset", "Set the encoding quality preset", OFFSET(quality
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED
, VE
, .unit
= "quality" },
64 { "quality", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_QUALITY
}, 0, 0, VE
, .unit
= "quality" },
65 { "balanced", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_BALANCED
}, 0, 0, VE
, .unit
= "quality" },
66 { "speed", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET_SPEED
}, 0, 0, VE
, .unit
= "quality" },
68 { "latency", "enables low latency mode", OFFSET(latency
), AV_OPT_TYPE_BOOL
,{.i64
= -1 }, -1, 1, VE
},
70 { "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_HIGH_QUALITY_CBR
, VE
, .unit
= "rc" },
71 { "cqp", "Constant Quantization Parameter", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP
}, 0, 0, VE
, .unit
= "rc" },
72 { "cbr", "Constant Bitrate", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR
}, 0, 0, VE
, .unit
= "rc" },
73 { "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
, .unit
= "rc" },
74 { "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
, .unit
= "rc" },
75 { "qvbr", "Quality Variable Bitrate", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_QUALITY_VBR
}, 0, 0, VE
, .unit
= "rc" },
76 { "hqvbr", "High Quality Variable Bitrate", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_HIGH_QUALITY_VBR
}, 0, 0, VE
, .unit
= "rc" },
77 { "hqcbr", "High Quality Constant Bitrate", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_HIGH_QUALITY_CBR
}, 0, 0, VE
, .unit
= "rc" },
79 { "qvbr_quality_level", "Sets the QVBR quality level", OFFSET(qvbr_quality_level
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, 51, VE
},
81 { "header_insertion_mode", "Set header insertion mode", OFFSET(header_insertion_mode
), AV_OPT_TYPE_INT
,{ .i64
= -1 }, -1, AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_IDR_ALIGNED
, VE
, .unit
= "hdrmode" },
82 { "none", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_NONE
}, 0, 0, VE
, .unit
= "hdrmode" },
83 { "gop", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_GOP_ALIGNED
}, 0, 0, VE
, .unit
= "hdrmode" },
84 { "idr", "", 0, AV_OPT_TYPE_CONST
, { .i64
= AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE_IDR_ALIGNED
}, 0, 0, VE
, .unit
= "hdrmode" },
86 { "async_depth", "Set maximum encoding parallelism. Higher values increase output latency.", OFFSET(hwsurfaces_in_queue_max
), AV_OPT_TYPE_INT
, {.i64
= 16 }, 1, 16, VE
},
88 { "high_motion_quality_boost_enable", "Enable High motion quality boost mode", OFFSET(hw_high_motion_quality_boost
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
89 { "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
},
90 { "preencode", "Enable preencode", OFFSET(preencode
), AV_OPT_TYPE_BOOL
, { .i64
= -1 }, -1, 1, VE
},
91 { "vbaq", "Enable VBAQ", OFFSET(enable_vbaq
), AV_OPT_TYPE_BOOL
, { .i64
= -1 }, -1, 1, VE
},
92 { "enforce_hrd", "Enforce HRD", OFFSET(enforce_hrd
), AV_OPT_TYPE_BOOL
, { .i64
= -1 }, -1, 1, VE
},
93 { "filler_data", "Filler Data Enable", OFFSET(filler_data
), AV_OPT_TYPE_BOOL
, { .i64
= -1 }, -1, 1, VE
},
94 { "max_au_size", "Maximum Access Unit Size for rate control (in bits)", OFFSET(max_au_size
), AV_OPT_TYPE_INT
,{ .i64
= -1 }, -1, INT_MAX
, VE
},
95 { "min_qp_i", "min quantization parameter for I-frame", OFFSET(min_qp_i
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
96 { "max_qp_i", "max quantization parameter for I-frame", OFFSET(max_qp_i
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
97 { "min_qp_p", "min quantization parameter for P-frame", OFFSET(min_qp_p
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
98 { "max_qp_p", "max quantization parameter for P-frame", OFFSET(max_qp_p
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
99 { "qp_p", "quantization parameter for P-frame", OFFSET(qp_p
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
100 { "qp_i", "quantization parameter for I-frame", OFFSET(qp_i
), AV_OPT_TYPE_INT
, { .i64
= -1 }, -1, 51, VE
},
101 { "skip_frame", "Rate Control Based Frame Skip", OFFSET(skip_frame
), AV_OPT_TYPE_BOOL
,{ .i64
= -1 }, -1, 1, VE
},
102 { "me_half_pel", "Enable ME Half Pixel", OFFSET(me_half_pel
), AV_OPT_TYPE_BOOL
,{ .i64
= -1 }, -1, 1, VE
},
103 { "me_quarter_pel", "Enable ME Quarter Pixel ", OFFSET(me_quarter_pel
),AV_OPT_TYPE_BOOL
,{ .i64
= -1 }, -1, 1, VE
},
105 { "forced_idr", "Force I frames to be IDR frames", OFFSET(forced_idr
) ,AV_OPT_TYPE_BOOL
,{ .i64
= 0 }, 0, 1, VE
},
106 { "aud", "Inserts AU Delimiter NAL unit", OFFSET(aud
) ,AV_OPT_TYPE_BOOL
,{ .i64
= -1 }, -1, 1, VE
},
108 //Pre Analysis options
109 { "preanalysis", "Enable preanalysis", OFFSET(preanalysis
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
111 { "pa_activity_type", "Set the type of activity analysis", OFFSET(pa_activity_type
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_ACTIVITY_YUV
, VE
, .unit
= "activity_type" },
112 { "y", "activity y", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_ACTIVITY_Y
}, 0, 0, VE
, .unit
= "activity_type" },
113 { "yuv", "activity yuv", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_ACTIVITY_YUV
}, 0, 0, VE
, .unit
= "activity_type" },
115 { "pa_scene_change_detection_enable", "Enable scene change detection", OFFSET(pa_scene_change_detection
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
117 { "pa_scene_change_detection_sensitivity", "Set the sensitivity of scene change detection", OFFSET(pa_scene_change_detection_sensitivity
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_HIGH
, VE
, .unit
= "scene_change_sensitivity" },
118 { "low", "low scene change dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_LOW
}, 0, 0, VE
, .unit
= "scene_change_sensitivity" },
119 { "medium", "medium scene change dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_MEDIUM
}, 0, 0, VE
, .unit
= "scene_change_sensitivity" },
120 { "high", "high scene change dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY_HIGH
}, 0, 0, VE
, .unit
= "scene_change_sensitivity" },
122 { "pa_static_scene_detection_enable", "Enable static scene detection", OFFSET(pa_static_scene_detection
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
124 { "pa_static_scene_detection_sensitivity", "Set the sensitivity of static scene detection", OFFSET(pa_static_scene_detection_sensitivity
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_HIGH
, VE
, .unit
= "static_scene_sensitivity" },
125 { "low", "low static scene dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_LOW
}, 0, 0, VE
, .unit
= "static_scene_sensitivity" },
126 { "medium", "medium static scene dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_MEDIUM
}, 0, 0, VE
, .unit
= "static_scene_sensitivity" },
127 { "high", "high static scene dectection sensitivity", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY_HIGH
}, 0, 0, VE
, .unit
= "static_scene_sensitivity" },
129 { "pa_initial_qp_after_scene_change", "The QP value that is used immediately after a scene change", OFFSET(pa_initial_qp
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, 51, VE
},
130 { "pa_max_qp_before_force_skip", "The QP threshold to allow a skip frame", OFFSET(pa_max_qp
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, 51, VE
},
132 { "pa_caq_strength", "Content Adaptive Quantization strength", OFFSET(pa_caq_strength
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_CAQ_STRENGTH_HIGH
, VE
, .unit
= "caq_strength" },
133 { "low", "low Content Adaptive Quantization strength", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_CAQ_STRENGTH_LOW
}, 0, 0, VE
, .unit
= "caq_strength" },
134 { "medium", "medium Content Adaptive Quantization strength", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_CAQ_STRENGTH_MEDIUM
}, 0, 0, VE
, .unit
= "caq_strength" },
135 { "high", "high Content Adaptive Quantization strength", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_CAQ_STRENGTH_HIGH
}, 0, 0, VE
, .unit
= "caq_strength" },
137 { "pa_frame_sad_enable", "Enable Frame SAD algorithm", OFFSET(pa_frame_sad
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
138 { "pa_ltr_enable", "Enable long term reference frame management", OFFSET(pa_ltr
), AV_OPT_TYPE_BOOL
, {.i64
= -1 }, -1, 1, VE
},
139 { "pa_lookahead_buffer_depth", "Sets the PA lookahead buffer size", OFFSET(pa_lookahead_buffer_depth
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, MAX_LOOKAHEAD_DEPTH
, VE
},
141 { "pa_paq_mode", "Sets the perceptual adaptive quantization mode", OFFSET(pa_paq_mode
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_PAQ_MODE_CAQ
, VE
, .unit
= "paq_mode" },
142 { "none", "no perceptual adaptive quantization", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_PAQ_MODE_NONE
}, 0, 0, VE
, .unit
= "paq_mode" },
143 { "caq", "caq perceptual adaptive quantization", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_PAQ_MODE_CAQ
}, 0, 0, VE
, .unit
= "paq_mode" },
145 { "pa_taq_mode", "Sets the temporal adaptive quantization mode", OFFSET(pa_taq_mode
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_TAQ_MODE_2
, VE
, .unit
= "taq_mode" },
146 { "none", "no temporal adaptive quantization", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_TAQ_MODE_NONE
}, 0, 0, VE
, .unit
= "taq_mode" },
147 { "1", "temporal adaptive quantization mode 1", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_TAQ_MODE_1
}, 0, 0, VE
, .unit
= "taq_mode" },
148 { "2", "temporal adaptive quantization mode 2", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_TAQ_MODE_2
}, 0, 0, VE
, .unit
= "taq_mode" },
150 { "pa_high_motion_quality_boost_mode", "Sets the PA high motion quality boost mode", OFFSET(pa_high_motion_quality_boost_mode
), AV_OPT_TYPE_INT
, {.i64
= -1 }, -1, AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_AUTO
, VE
, .unit
= "high_motion_quality_boost_mode" },
151 { "none", "no high motion quality boost", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_NONE
}, 0, 0, VE
, .unit
= "high_motion_quality_boost_mode" },
152 { "auto", "auto high motion quality boost", 0, AV_OPT_TYPE_CONST
, {.i64
= AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE_AUTO
}, 0, 0, VE
, .unit
= "high_motion_quality_boost_mode" },
156 static av_cold
int amf_encode_init_hevc(AVCodecContext
*avctx
)
159 AMF_RESULT res
= AMF_OK
;
160 AMFEncoderContext
*ctx
= avctx
->priv_data
;
161 AMFVariantStruct var
= {0};
162 amf_int64 profile
= 0;
163 amf_int64 profile_level
= 0;
167 AMFSize framesize
= AMFConstructSize(avctx
->width
, avctx
->height
);
168 int deblocking_filter
= (avctx
->flags
& AV_CODEC_FLAG_LOOP_FILTER
) ? 1 : 0;
169 amf_int64 color_depth
;
170 amf_int64 color_profile
;
171 enum AVPixelFormat pix_fmt
;
173 if (avctx
->framerate
.num
> 0 && avctx
->framerate
.den
> 0) {
174 framerate
= AMFConstructRate(avctx
->framerate
.num
, avctx
->framerate
.den
);
176 FF_DISABLE_DEPRECATION_WARNINGS
177 framerate
= AMFConstructRate(avctx
->time_base
.den
, avctx
->time_base
.num
178 #if FF_API_TICKS_PER_FRAME
179 * avctx
->ticks_per_frame
182 FF_ENABLE_DEPRECATION_WARNINGS
185 if ((ret
= ff_amf_encode_init(avctx
)) < 0)
188 // init static parameters
189 if (ctx
->usage
!= -1) {
190 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_USAGE
, ctx
->usage
);
193 AMF_ASSIGN_PROPERTY_SIZE(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_FRAMESIZE
, framesize
);
195 AMF_ASSIGN_PROPERTY_RATE(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_FRAMERATE
, framerate
);
197 switch (avctx
->profile
) {
198 case AV_PROFILE_HEVC_MAIN
:
199 profile
= AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN
;
201 case AV_PROFILE_HEVC_MAIN_10
:
202 profile
= AMF_VIDEO_ENCODER_HEVC_PROFILE_MAIN_10
;
208 if (ctx
->profile
!= -1) {
209 profile
= ctx
->profile
;
214 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PROFILE
, profile
);
217 if (ctx
->tier
!= -1) {
218 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_TIER
, ctx
->tier
);
221 profile_level
= avctx
->level
;
222 if (profile_level
== AV_LEVEL_UNKNOWN
) {
223 profile_level
= ctx
->level
;
226 if (profile_level
!= 0) {
227 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PROFILE_LEVEL
, profile_level
);
230 if (ctx
->quality
!= -1) {
231 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QUALITY_PRESET
, ctx
->quality
);
234 // Maximum Reference Frames
235 if (avctx
->refs
!= -1) {
236 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_NUM_REFRAMES
, avctx
->refs
);
239 if (avctx
->sample_aspect_ratio
.den
&& avctx
->sample_aspect_ratio
.num
) {
240 AMFRatio ratio
= AMFConstructRatio(avctx
->sample_aspect_ratio
.num
, avctx
->sample_aspect_ratio
.den
);
241 AMF_ASSIGN_PROPERTY_RATIO(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_ASPECT_RATIO
, ratio
);
244 color_profile
= ff_amf_get_color_profile(avctx
);
245 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PROFILE
, color_profile
);
246 /// Color Range (Support for older Drivers)
247 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_NOMINAL_RANGE
, !!(avctx
->color_range
== AVCOL_RANGE_JPEG
));
249 color_depth
= AMF_COLOR_BIT_DEPTH_8
;
250 pix_fmt
= avctx
->hw_frames_ctx
? ((AVHWFramesContext
*)avctx
->hw_frames_ctx
->data
)->sw_format
252 if (pix_fmt
== AV_PIX_FMT_P010
) {
253 color_depth
= AMF_COLOR_BIT_DEPTH_10
;
255 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_COLOR_BIT_DEPTH
, color_depth
);
256 /// Color Transfer Characteristics (AMF matches ISO/IEC)
257 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_OUTPUT_TRANSFER_CHARACTERISTIC
, avctx
->color_trc
);
258 /// Color Primaries (AMF matches ISO/IEC)
259 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_OUTPUT_COLOR_PRIMARIES
, avctx
->color_primaries
);
261 // Picture control properties
262 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_NUM_GOPS_PER_IDR
, ctx
->gops_per_idr
);
263 if (avctx
->gop_size
!= -1) {
264 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_GOP_SIZE
, avctx
->gop_size
);
266 if (avctx
->slices
> 1) {
267 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_SLICES_PER_FRAME
, avctx
->slices
);
269 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_DE_BLOCKING_FILTER_DISABLE
, !deblocking_filter
);
271 if (ctx
->header_insertion_mode
!= -1) {
272 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_HEADER_INSERTION_MODE
, ctx
->header_insertion_mode
);
276 // autodetect rate control method
277 if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_UNKNOWN
) {
278 if (ctx
->min_qp_i
!= -1 || ctx
->max_qp_i
!= -1 ||
279 ctx
->min_qp_p
!= -1 || ctx
->max_qp_p
!= -1 ||
280 ctx
->qp_i
!=-1 || ctx
->qp_p
!= -1) {
281 ctx
->rate_control_mode
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP
;
282 av_log(ctx
, AV_LOG_DEBUG
, "Rate control turned to CQP\n");
283 } else if (avctx
->bit_rate
> 0 && avctx
->rc_max_rate
== avctx
->bit_rate
) {
284 ctx
->rate_control_mode
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR
;
285 av_log(ctx
, AV_LOG_DEBUG
, "Rate control turned to CBR\n");
287 ctx
->rate_control_mode
= AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR
;
288 av_log(ctx
, AV_LOG_DEBUG
, "Rate control turned to Peak VBR\n");
292 // Pre-Pass, Pre-Analysis, Two-Pass
293 if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP
) {
294 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PREENCODE_ENABLE
, 0);
295 if (ctx
->preencode
!= -1) {
296 if (ctx
->preencode
) {
297 av_log(ctx
, AV_LOG_WARNING
, "Preencode is not supported by cqp Rate Control Method, automatically disabled\n");
302 if (ctx
->preencode
!= -1) {
303 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PREENCODE_ENABLE
, ctx
->preencode
);
307 if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_QUALITY_VBR
) {
308 if (ctx
->qvbr_quality_level
!= -1) {
309 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QVBR_QUALITY_LEVEL
, ctx
->qvbr_quality_level
);
313 if (ctx
->hw_high_motion_quality_boost
!= -1) {
314 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_HIGH_MOTION_QUALITY_BOOST_ENABLE
, ((ctx
->hw_high_motion_quality_boost
== 0) ? false : true));
317 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD
, ctx
->rate_control_mode
);
319 if (avctx
->rc_buffer_size
) {
320 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_VBV_BUFFER_SIZE
, avctx
->rc_buffer_size
);
322 if (avctx
->rc_initial_buffer_occupancy
!= 0) {
323 int amf_buffer_fullness
= avctx
->rc_initial_buffer_occupancy
* 64 / avctx
->rc_buffer_size
;
324 if (amf_buffer_fullness
> 64)
325 amf_buffer_fullness
= 64;
326 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_INITIAL_VBV_BUFFER_FULLNESS
, amf_buffer_fullness
);
330 if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CONSTANT_QP
) {
331 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ
, false);
332 if (ctx
->enable_vbaq
)
333 av_log(ctx
, AV_LOG_WARNING
, "VBAQ is not supported by cqp Rate Control Method, automatically disabled\n");
335 if (ctx
->enable_vbaq
!= -1) {
336 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_ENABLE_VBAQ
, !!ctx
->enable_vbaq
);
340 if (ctx
->me_half_pel
!= -1) {
341 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MOTION_HALF_PIXEL
, ctx
->me_half_pel
);
343 if (ctx
->me_quarter_pel
!= -1) {
344 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MOTION_QUARTERPIXEL
, ctx
->me_quarter_pel
);
347 // init dynamic rate control params
348 if (ctx
->enforce_hrd
!= -1) {
349 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_ENFORCE_HRD
, ((ctx
->enforce_hrd
== 0) ? false : true));
352 if (ctx
->filler_data
!= -1) {
353 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_FILLER_DATA_ENABLE
, ((ctx
->filler_data
== 0) ? false : true));
356 if (avctx
->bit_rate
) {
357 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_TARGET_BITRATE
, avctx
->bit_rate
);
360 if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_CBR
) {
361 if (avctx
->bit_rate
) {
362 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE
, avctx
->bit_rate
);
366 if (avctx
->rc_max_rate
) {
367 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PEAK_BITRATE
, avctx
->rc_max_rate
);
368 } else if (ctx
->rate_control_mode
== AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_METHOD_PEAK_CONSTRAINED_VBR
) {
369 av_log(ctx
, AV_LOG_WARNING
, "rate control mode is PEAK_CONSTRAINED_VBR but rc_max_rate is not set\n");
372 if (ctx
->latency
!= -1) {
373 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_LOWLATENCY_MODE
, ((ctx
->latency
== 0) ? false : true));
376 if (ctx
->preanalysis
!= -1) {
377 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE
, !!((ctx
->preanalysis
== 0) ? false : true));
380 res
= ctx
->encoder
->pVtbl
->GetProperty(ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE
, &var
);
381 if ((int)var
.int64Value
)
383 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_PRE_ANALYSIS_ENABLE
, true);
385 if (ctx
->pa_activity_type
!= -1) {
386 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_ACTIVITY_TYPE
, ctx
->pa_activity_type
);
388 if (ctx
->pa_scene_change_detection
!= -1) {
389 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_PA_SCENE_CHANGE_DETECTION_ENABLE
, ((ctx
->pa_scene_change_detection
== 0) ? false : true));
391 if (ctx
->pa_scene_change_detection_sensitivity
!= -1) {
392 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_SCENE_CHANGE_DETECTION_SENSITIVITY
, ctx
->pa_scene_change_detection_sensitivity
);
394 if (ctx
->pa_static_scene_detection
!= -1) {
395 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_PA_STATIC_SCENE_DETECTION_ENABLE
, ((ctx
->pa_static_scene_detection
== 0) ? false : true));
397 if (ctx
->pa_static_scene_detection_sensitivity
!= -1) {
398 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_STATIC_SCENE_DETECTION_SENSITIVITY
, ctx
->pa_static_scene_detection_sensitivity
);
400 if (ctx
->pa_initial_qp
!= -1) {
401 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_INITIAL_QP_AFTER_SCENE_CHANGE
, ctx
->pa_initial_qp
);
403 if (ctx
->pa_max_qp
!= -1) {
404 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_MAX_QP_BEFORE_FORCE_SKIP
, ctx
->pa_max_qp
);
406 if (ctx
->pa_caq_strength
!= -1) {
407 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_CAQ_STRENGTH
, ctx
->pa_caq_strength
);
409 if (ctx
->pa_frame_sad
!= -1) {
410 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_PA_FRAME_SAD_ENABLE
, ((ctx
->pa_frame_sad
== 0) ? false : true));
412 if (ctx
->pa_paq_mode
!= -1) {
413 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_PAQ_MODE
, ctx
->pa_paq_mode
);
415 if (ctx
->pa_taq_mode
!= -1) {
416 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_TAQ_MODE
, ctx
->pa_taq_mode
);
418 if (ctx
->pa_ltr
!= -1) {
419 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_PA_LTR_ENABLE
, ((ctx
->pa_ltr
== 0) ? false : true));
421 if (ctx
->pa_lookahead_buffer_depth
!= -1) {
422 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_LOOKAHEAD_BUFFER_DEPTH
, ctx
->pa_lookahead_buffer_depth
);
424 if (ctx
->pa_high_motion_quality_boost_mode
!= -1) {
425 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_PA_HIGH_MOTION_QUALITY_BOOST_MODE
, ctx
->pa_high_motion_quality_boost_mode
);
429 // Wait inside QueryOutput() if supported by the driver
430 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QUERY_TIMEOUT
, 1);
431 res
= ctx
->encoder
->pVtbl
->GetProperty(ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QUERY_TIMEOUT
, &var
);
432 ctx
->query_timeout_supported
= res
== AMF_OK
&& var
.int64Value
;
435 res
= ctx
->encoder
->pVtbl
->Init(ctx
->encoder
, ctx
->format
, avctx
->width
, avctx
->height
);
436 AMF_RETURN_IF_FALSE(ctx
, res
== AMF_OK
, AVERROR_BUG
, "encoder->Init() failed with error %d\n", res
);
438 // init dynamic picture control params
439 if (ctx
->max_au_size
!= -1) {
440 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_AU_SIZE
, ctx
->max_au_size
);
443 if (ctx
->min_qp_i
!= -1) {
444 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MIN_QP_I
, ctx
->min_qp_i
);
445 } else if (avctx
->qmin
!= -1) {
446 int qval
= avctx
->qmin
> 51 ? 51 : avctx
->qmin
;
447 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MIN_QP_I
, qval
);
449 if (ctx
->max_qp_i
!= -1) {
450 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_QP_I
, ctx
->max_qp_i
);
451 } else if (avctx
->qmax
!= -1) {
452 int qval
= avctx
->qmax
> 51 ? 51 : avctx
->qmax
;
453 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_QP_I
, qval
);
455 if (ctx
->min_qp_p
!= -1) {
456 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MIN_QP_P
, ctx
->min_qp_p
);
457 } else if (avctx
->qmin
!= -1) {
458 int qval
= avctx
->qmin
> 51 ? 51 : avctx
->qmin
;
459 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MIN_QP_P
, qval
);
461 if (ctx
->max_qp_p
!= -1) {
462 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_QP_P
, ctx
->max_qp_p
);
463 } else if (avctx
->qmax
!= -1) {
464 int qval
= avctx
->qmax
> 51 ? 51 : avctx
->qmax
;
465 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_MAX_QP_P
, qval
);
468 if (ctx
->qp_p
!= -1) {
469 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QP_P
, ctx
->qp_p
);
471 if (ctx
->qp_i
!= -1) {
472 AMF_ASSIGN_PROPERTY_INT64(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_QP_I
, ctx
->qp_i
);
474 if (ctx
->skip_frame
!= -1) {
475 AMF_ASSIGN_PROPERTY_BOOL(res
, ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_RATE_CONTROL_SKIP_FRAME_ENABLE
, ((ctx
->skip_frame
== 0) ? false : true));
479 res
= AMFVariantInit(&var
);
480 AMF_RETURN_IF_FALSE(ctx
, res
== AMF_OK
, AVERROR_BUG
, "AMFVariantInit() failed with error %d\n", res
);
482 res
= ctx
->encoder
->pVtbl
->GetProperty(ctx
->encoder
, AMF_VIDEO_ENCODER_HEVC_EXTRADATA
, &var
);
483 AMF_RETURN_IF_FALSE(ctx
, res
== AMF_OK
, AVERROR_BUG
, "GetProperty(AMF_VIDEO_ENCODER_EXTRADATA) failed with error %d\n", res
);
484 AMF_RETURN_IF_FALSE(ctx
, var
.pInterface
!= NULL
, AVERROR_BUG
, "GetProperty(AMF_VIDEO_ENCODER_EXTRADATA) returned NULL\n");
486 guid
= IID_AMFBuffer();
488 res
= var
.pInterface
->pVtbl
->QueryInterface(var
.pInterface
, &guid
, (void**)&buffer
); // query for buffer interface
490 var
.pInterface
->pVtbl
->Release(var
.pInterface
);
492 AMF_RETURN_IF_FALSE(ctx
, res
== AMF_OK
, AVERROR_BUG
, "QueryInterface(IID_AMFBuffer) failed with error %d\n", res
);
494 avctx
->extradata_size
= (int)buffer
->pVtbl
->GetSize(buffer
);
495 avctx
->extradata
= av_mallocz(avctx
->extradata_size
+ AV_INPUT_BUFFER_PADDING_SIZE
);
496 if (!avctx
->extradata
) {
497 buffer
->pVtbl
->Release(buffer
);
498 var
.pInterface
->pVtbl
->Release(var
.pInterface
);
499 return AVERROR(ENOMEM
);
501 memcpy(avctx
->extradata
, buffer
->pVtbl
->GetNative(buffer
), avctx
->extradata_size
);
503 buffer
->pVtbl
->Release(buffer
);
504 var
.pInterface
->pVtbl
->Release(var
.pInterface
);
508 static const FFCodecDefault defaults
[] = {
519 static const AVClass hevc_amf_class
= {
520 .class_name
= "hevc_amf",
521 .item_name
= av_default_item_name
,
523 .version
= LIBAVUTIL_VERSION_INT
,
526 const FFCodec ff_hevc_amf_encoder
= {
527 .p
.name
= "hevc_amf",
528 CODEC_LONG_NAME("AMD AMF HEVC encoder"),
529 .p
.type
= AVMEDIA_TYPE_VIDEO
,
530 .p
.id
= AV_CODEC_ID_HEVC
,
531 .init
= amf_encode_init_hevc
,
532 FF_CODEC_RECEIVE_PACKET_CB(ff_amf_receive_packet
),
533 .close
= ff_amf_encode_close
,
534 .priv_data_size
= sizeof(AMFEncoderContext
),
535 .p
.priv_class
= &hevc_amf_class
,
536 .defaults
= defaults
,
537 .p
.capabilities
= AV_CODEC_CAP_DELAY
| AV_CODEC_CAP_HARDWARE
|
539 .caps_internal
= FF_CODEC_CAP_NOT_INIT_THREADSAFE
|
540 FF_CODEC_CAP_INIT_CLEANUP
,
541 .p
.pix_fmts
= ff_amf_pix_fmts
,
542 .color_ranges
= AVCOL_RANGE_MPEG
| AVCOL_RANGE_JPEG
,
543 .p
.wrapper_name
= "amf",
544 .hw_configs
= ff_amfenc_hw_configs
,