FFmpeg
Loading...
Searching...
No Matches
qsvenc.h
Go to the documentation of this file.
1/*
2 * Intel MediaSDK QSV encoder utility functions
3 *
4 * copyright (c) 2013 Yukinori Yamazoe
5 *
6 * This file is part of FFmpeg.
7 *
8 * FFmpeg is free software; you can redistribute it and/or
9 * modify it under the terms of the GNU Lesser General Public
10 * License as published by the Free Software Foundation; either
11 * version 2.1 of the License, or (at your option) any later version.
12 *
13 * FFmpeg is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16 * Lesser General Public License for more details.
17 *
18 * You should have received a copy of the GNU Lesser General Public
19 * License along with FFmpeg; if not, write to the Free Software
20 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 */
22
23#ifndef AVCODEC_QSVENC_H
24#define AVCODEC_QSVENC_H
25
26#include <stdint.h>
27#include <sys/types.h>
28
29#include "libavutil/common.h"
30#include "libavutil/hwcontext.h"
32#include "libavutil/avutil.h"
33#include "libavutil/fifo.h"
34
35#include "avcodec.h"
36#include "hwconfig.h"
37#include "qsv_internal.h"
38
39#define QSV_HAVE_EXT_VP9_TILES QSV_VERSION_ATLEAST(1, 29)
40#define QSV_HAVE_EXT_AV1_PARAM QSV_VERSION_ATLEAST(2, 5)
41
42#if defined(_WIN32) || defined(__CYGWIN__)
43#define QSV_HAVE_AVBR 1
44#define QSV_HAVE_VCM 1
45#define QSV_HAVE_MF 0
46#define QSV_HAVE_HE QSV_VERSION_ATLEAST(2, 4)
47#else
48#define QSV_HAVE_AVBR 0
49#define QSV_HAVE_VCM 0
50#define QSV_HAVE_MF !QSV_ONEVPL
51#define QSV_HAVE_HE 0
52#endif
53
54#define QSV_COMMON_OPTS \
55{ "async_depth", "Maximum processing parallelism", OFFSET(qsv.async_depth), AV_OPT_TYPE_INT, { .i64 = ASYNC_DEPTH_DEFAULT }, 1, INT_MAX, VE }, \
56{ "preset", NULL, OFFSET(qsv.preset), AV_OPT_TYPE_INT, { .i64 = MFX_TARGETUSAGE_UNKNOWN }, MFX_TARGETUSAGE_UNKNOWN, MFX_TARGETUSAGE_BEST_SPEED, VE, .unit = "preset" }, \
57{ "veryfast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_SPEED }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
58{ "faster", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_6 }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
59{ "fast", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_5 }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
60{ "medium", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BALANCED }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
61{ "slow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_3 }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
62{ "slower", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_2 }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
63{ "veryslow", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_TARGETUSAGE_BEST_QUALITY }, INT_MIN, INT_MAX, VE, .unit = "preset" }, \
64{ "forced_idr", "Forcing I frames as IDR frames", OFFSET(qsv.forced_idr), AV_OPT_TYPE_BOOL,{ .i64 = 0 }, 0, 1, VE }, \
65{ "low_power", "enable low power mode(experimental: many limitations by mfx version, BRC modes, etc.)", OFFSET(qsv.low_power), AV_OPT_TYPE_BOOL, { .i64 = -1}, -1, 1, VE},\
66{ "qsv_params", "Set QSV encoder parameters as key1=value1:key2=value2:...", OFFSET(qsv.qsv_params), AV_OPT_TYPE_DICT, { 0 }, 0, 0, VE },
67
68#if QSV_HAVE_HE
69#define QSV_HE_OPTIONS \
70{ "dual_gfx", "Prefer processing on both iGfx and dGfx simultaneously", OFFSET(qsv.dual_gfx), AV_OPT_TYPE_INT, { .i64 = MFX_HYPERMODE_OFF }, MFX_HYPERMODE_OFF, MFX_HYPERMODE_ADAPTIVE, VE, .unit = "dual_gfx" }, \
71{ "off", "Disable HyperEncode mode", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_HYPERMODE_OFF }, INT_MIN, INT_MAX, VE, .unit = "dual_gfx" }, \
72{ "on", "Enable HyperEncode mode and return error if incompatible parameters during initialization", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_HYPERMODE_ON }, INT_MIN, INT_MAX, VE, .unit = "dual_gfx" }, \
73{ "adaptive", "Enable HyperEncode mode or fallback to single GPU if incompatible parameters during initialization", 0, AV_OPT_TYPE_CONST, { .i64 = MFX_HYPERMODE_ADAPTIVE }, INT_MIN, INT_MAX, VE, .unit = "dual_gfx" },
74#endif
75
76#define QSV_OPTION_RDO \
77{ "rdo", "Enable rate distortion optimization", OFFSET(qsv.rdo), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
78
79#define QSV_OPTION_MAX_FRAME_SIZE \
80{ "max_frame_size", "Maximum encoded frame size in bytes", OFFSET(qsv.max_frame_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE }, \
81{ "max_frame_size_i", "Maximum encoded I frame size in bytes",OFFSET(qsv.max_frame_size_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE }, \
82{ "max_frame_size_p", "Maximum encoded P frame size in bytes",OFFSET(qsv.max_frame_size_p), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE },
83
84#define QSV_OPTION_MAX_SLICE_SIZE \
85{ "max_slice_size", "Maximum encoded slice size in bytes", OFFSET(qsv.max_slice_size), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, INT_MAX, VE },
86
87#define QSV_OPTION_BITRATE_LIMIT \
88{ "bitrate_limit", "Toggle bitrate limitations", OFFSET(qsv.bitrate_limit), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
89
90#define QSV_OPTION_MBBRC \
91{ "mbbrc", "MB level bitrate control", OFFSET(qsv.mbbrc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
92
93#define QSV_OPTION_EXTBRC \
94{ "extbrc", "Extended bitrate control", OFFSET(qsv.extbrc), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
95
96#define QSV_OPTION_ADAPTIVE_I \
97{ "adaptive_i", "Adaptive I-frame placement", OFFSET(qsv.adaptive_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
98
99#define QSV_OPTION_ADAPTIVE_B \
100{ "adaptive_b", "Adaptive B-frame placement", OFFSET(qsv.adaptive_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
101
102#define QSV_OPTION_P_STRATEGY \
103{ "p_strategy", "Enable P-pyramid: 0-default 1-simple 2-pyramid(bf need to be set to 0).", OFFSET(qsv.p_strategy), AV_OPT_TYPE_INT, { .i64 = 0}, 0, 2, VE },
104
105#define QSV_OPTION_B_STRATEGY \
106{ "b_strategy", "Strategy to choose between I/P/B-frames", OFFSET(qsv.b_strategy), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 1, VE },
107
108#define QSV_OPTION_DBLK_IDC \
109{ "dblk_idc", "This option disable deblocking. It has value in range 0~2.", OFFSET(qsv.dblk_idc), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, 2, VE},
110
111#define QSV_OPTION_LOW_DELAY_BRC \
112{ "low_delay_brc", "Allow to strictly obey avg frame size", OFFSET(qsv.low_delay_brc), AV_OPT_TYPE_BOOL,{ .i64 = -1 }, -1, 1, VE },
113
114#define QSV_OPTION_MAX_MIN_QP \
115{ "max_qp_i", "Maximum video quantizer scale for I frame", OFFSET(qsv.max_qp_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \
116{ "min_qp_i", "Minimum video quantizer scale for I frame", OFFSET(qsv.min_qp_i), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \
117{ "max_qp_p", "Maximum video quantizer scale for P frame", OFFSET(qsv.max_qp_p), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \
118{ "min_qp_p", "Minimum video quantizer scale for P frame", OFFSET(qsv.min_qp_p), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \
119{ "max_qp_b", "Maximum video quantizer scale for B frame", OFFSET(qsv.max_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE}, \
120{ "min_qp_b", "Minimum video quantizer scale for B frame", OFFSET(qsv.min_qp_b), AV_OPT_TYPE_INT, { .i64 = -1 }, -1, 51, VE},
121
122#define QSV_OPTION_SCENARIO \
123{ "scenario", "A hint to encoder about the scenario for the encoding session", OFFSET(qsv.scenario), AV_OPT_TYPE_INT, { .i64 = MFX_SCENARIO_UNKNOWN }, \
124 MFX_SCENARIO_UNKNOWN, MFX_SCENARIO_REMOTE_GAMING, VE, .unit = "scenario" }, \
125{ "unknown", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_UNKNOWN }, .flags = VE, .unit = "scenario" }, \
126{ "displayremoting", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_DISPLAY_REMOTING }, .flags = VE, .unit = "scenario" }, \
127{ "videoconference", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_VIDEO_CONFERENCE }, .flags = VE, .unit = "scenario" }, \
128{ "archive", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_ARCHIVE }, .flags = VE, .unit = "scenario" }, \
129{ "livestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_LIVE_STREAMING }, .flags = VE, .unit = "scenario" }, \
130{ "cameracapture", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_CAMERA_CAPTURE }, .flags = VE, .unit = "scenario" }, \
131{ "videosurveillance", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_VIDEO_SURVEILLANCE }, .flags = VE, .unit = "scenario" }, \
132{ "gamestreaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_GAME_STREAMING }, .flags = VE, .unit = "scenario" }, \
133{ "remotegaming", NULL, 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SCENARIO_REMOTE_GAMING }, .flags = VE, .unit = "scenario" },
134
135#define QSV_OPTION_AVBR \
136{ "avbr_accuracy", "Accuracy of the AVBR ratecontrol (unit of tenth of percent)", OFFSET(qsv.avbr_accuracy), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE }, \
137{ "avbr_convergence", "Convergence of the AVBR ratecontrol (unit of 100 frames)", OFFSET(qsv.avbr_convergence), AV_OPT_TYPE_INT, { .i64 = 0 }, 0, UINT16_MAX, VE },
138
139#define QSV_OPTION_SKIP_FRAME \
140{ "skip_frame", "Allow frame skipping", OFFSET(qsv.skip_frame), AV_OPT_TYPE_INT, { .i64 = MFX_SKIPFRAME_NO_SKIP }, \
141 MFX_SKIPFRAME_NO_SKIP, MFX_SKIPFRAME_BRC_ONLY, VE, .unit = "skip_frame" }, \
142{ "no_skip", "Frame skipping is disabled", \
143 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SKIPFRAME_NO_SKIP }, .flags = VE, .unit = "skip_frame" }, \
144{ "insert_dummy", "Encoder inserts into bitstream frame where all macroblocks are encoded as skipped", \
145 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SKIPFRAME_INSERT_DUMMY }, .flags = VE, .unit = "skip_frame" }, \
146{ "insert_nothing", "Encoder inserts nothing into bitstream", \
147 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SKIPFRAME_INSERT_NOTHING }, .flags = VE, .unit = "skip_frame" }, \
148{ "brc_only", "skip_frame metadata indicates the number of missed frames before the current frame", \
149 0, AV_OPT_TYPE_CONST, { .i64 = MFX_SKIPFRAME_BRC_ONLY }, .flags = VE, .unit = "skip_frame" },
150
152
153typedef int SetEncodeCtrlCB (AVCodecContext *avctx,
154 const AVFrame *frame, mfxEncodeCtrl* enc_ctrl);
155typedef struct QSVEncContext {
157
159
160 mfxSession session;
162
166
167 mfxVideoParam param;
168 mfxFrameAllocRequest req;
169
170 mfxExtCodingOption extco;
171 mfxExtCodingOption2 extco2;
172 mfxExtCodingOption3 extco3;
173#if QSV_HAVE_MF
174 mfxExtMultiFrameParam extmfp;
175 mfxExtMultiFrameControl extmfc;
176#endif
177 mfxExtHEVCTiles exthevctiles;
178 mfxExtVP9Param extvp9param;
179#if QSV_HAVE_EXT_AV1_PARAM
180 mfxExtAV1TileParam extav1tileparam;
181 mfxExtAV1BitstreamParam extav1bsparam;
182#endif
183#if QSV_HAVE_HE
184 mfxExtHyperModeParam exthypermodeparam;
185#endif
186#if QSV_HAVE_OPAQUE
187 mfxExtOpaqueSurfaceAlloc opaque_alloc;
188 mfxFrameSurface1 **opaque_surfaces;
189 AVBufferRef *opaque_alloc_buf;
190#endif
191
192 mfxExtVideoSignalInfo extvsi;
193
196
197 mfxExtBuffer **extparam_str;
199
200 mfxExtBuffer **extparam;
202
204
206
207 mfxVersion ver;
208
210
211 // options set by the caller
215 int tier;
223 int vcm;
224 int rdo;
231
234
235 int aud;
236
239
241 int mbbrc;
247 int cavlc;
248
254
257 int gpb;
259
261
262#if QSV_HAVE_MF
263 int mfmode;
264#endif
269
275
282 // These are used for qp reset
288 // This is used for max_frame_size reset
290 // This is used for gop reset
292 // These are used for intra refresh reset
297 // These are used for max/min qp reset;
306 // This is used for low_delay_brc reset
308 // This is used for framerate reset
310 // These are used for bitrate control reset
315 // This is used for SEI Timing reset
318 // This is used for Hyper Encode
320
323
325
327 AVPacket *pkt, const AVFrame *frame, int *got_packet);
328
330
331#endif /* AVCODEC_QSVENC_H */
Libavcodec external API header.
Convenience header that includes libavutil's core.
common internal and external API header
static AVPacket * pkt
static AVFrame * frame
A generic FIFO API.
An API-specific header for AV_HWDEVICE_TYPE_QSV.
const AVCodecHWConfigInternal *const ff_qsv_enc_hw_configs[]
Definition qsvenc.c:2762
int ff_qsv_enc_close(AVCodecContext *avctx, QSVEncContext *q)
Definition qsvenc.c:2710
#define QSV_HAVE_EXT_AV1_PARAM
Definition qsvenc.h:40
int ff_qsv_enc_init(AVCodecContext *avctx, QSVEncContext *q)
Definition qsvenc.c:1637
int SetEncodeCtrlCB(AVCodecContext *avctx, const AVFrame *frame, mfxEncodeCtrl *enc_ctrl)
Definition qsvenc.h:153
int ff_qsv_encode(AVCodecContext *avctx, QSVEncContext *q, AVPacket *pkt, const AVFrame *frame, int *got_packet)
Definition qsvenc.c:2642
#define QSV_HAVE_MF
Definition qsvenc.h:50
#define QSV_HAVE_HE
Definition qsvenc.h:51
A reference to a data buffer.
Definition buffer.h:82
main external API structure.
Definition avcodec.h:443
Definition fifo.c:35
This structure describes decoded (raw) audio or video data.
Definition frame.h:472
This structure stores compressed data.
Definition packet.h:580
Rational number (pair of numerator and denominator).
Definition rational.h:58
mfxVersion ver
Definition qsvenc.h:207
int exthevctiles_idx
Definition qsvenc.h:272
int old_int_ref_type
Definition qsvenc.h:293
AVDictionary * qsv_params
Definition qsvenc.h:321
int old_int_ref_cycle_size
Definition qsvenc.h:294
int old_max_qp_b
Definition qsvenc.h:304
int max_frame_size
Definition qsvenc.h:225
int avbr_accuracy
Definition qsvenc.h:217
int nb_extparam
Definition qsvenc.h:201
mfxVideoParam param
Definition qsvenc.h:167
int packet_size
Definition qsvenc.h:163
int old_global_quality
Definition qsvenc.h:283
float old_b_quant_factor
Definition qsvenc.h:286
mfxExtCodingOption3 extco3
Definition qsvenc.h:172
mfxExtVP9Param extvp9param
Definition qsvenc.h:178
int old_min_qp_i
Definition qsvenc.h:301
SetEncodeCtrlCB * set_encode_ctrl_cb
Definition qsvenc.h:266
int repeat_pps
Definition qsvenc.h:255
int old_min_qp_p
Definition qsvenc.h:303
int old_bit_rate
Definition qsvenc.h:311
int p_strategy
Definition qsvenc.h:246
int idr_interval
Definition qsvenc.h:213
mfxExtCodingOption extco
Definition qsvenc.h:170
int bitrate_limit
Definition qsvenc.h:240
int single_sei_nal_unit
Definition qsvenc.h:237
int max_frame_size_i
Definition qsvenc.h:226
int forced_idr
Definition qsvenc.h:267
int width_align
Definition qsvenc.h:164
int old_low_delay_brc
Definition qsvenc.h:307
int transform_skip
Definition qsvenc.h:258
int nb_extparam_internal
Definition qsvenc.h:195
int recovery_point_sei
Definition qsvenc.h:253
int old_rc_buffer_size
Definition qsvenc.h:312
int async_depth
Definition qsvenc.h:212
int avbr_convergence
Definition qsvenc.h:218
int max_slice_size
Definition qsvenc.h:228
int look_ahead_downsampling
Definition qsvenc.h:222
int old_pic_timing_sei
Definition qsvenc.h:316
int int_ref_cycle_size
Definition qsvenc.h:250
int pic_timing_sei
Definition qsvenc.h:219
float old_i_quant_offset
Definition qsvenc.h:285
int adaptive_i
Definition qsvenc.h:243
mfxExtBuffer * extparam_internal[5+(QSV_HAVE_MF *2)+(QSV_HAVE_EXT_AV1_PARAM *2)+QSV_HAVE_HE]
Definition qsvenc.h:194
int old_max_qp_i
Definition qsvenc.h:300
int old_rc_max_rate
Definition qsvenc.h:314
mfxExtBuffer ** extparam_str
Definition qsvenc.h:197
int int_ref_type
Definition qsvenc.h:249
int old_rc_initial_buffer_occupancy
Definition qsvenc.h:313
int max_frame_size_p
Definition qsvenc.h:227
int skip_frame
Definition qsvenc.h:317
int old_max_qp_p
Definition qsvenc.h:302
int tile_cols
Definition qsvenc.h:232
QSVFramesContext frames_ctx
Definition qsvenc.h:205
int b_strategy
Definition qsvenc.h:245
float old_i_quant_factor
Definition qsvenc.h:284
int tile_rows
Definition qsvenc.h:233
int adaptive_b
Definition qsvenc.h:244
AVCodecContext * avctx
Definition qsvenc.h:156
mfxExtVideoSignalInfo extvsi
Definition qsvenc.h:192
int height_align
Definition qsvenc.h:165
AVFifo * async_fifo
Definition qsvenc.h:203
int old_max_frame_size
Definition qsvenc.h:289
float old_b_quant_offset
Definition qsvenc.h:287
int int_ref_cycle_dist
Definition qsvenc.h:252
int int_ref_qp_delta
Definition qsvenc.h:251
int old_int_ref_qp_delta
Definition qsvenc.h:295
int max_dec_frame_buffering
Definition qsvenc.h:238
int exthypermodeparam_idx
Definition qsvenc.h:273
mfxExtHEVCTiles exthevctiles
Definition qsvenc.h:177
int look_ahead
Definition qsvenc.h:220
mfxExtBuffer ** extparam
Definition qsvenc.h:200
int old_min_qp_b
Definition qsvenc.h:305
mfxFrameAllocRequest req
Definition qsvenc.h:168
QSVFrame * work_frames
Definition qsvenc.h:158
int old_gop_size
Definition qsvenc.h:291
char * load_plugins
Definition qsvenc.h:265
int low_power
Definition qsvenc.h:256
int low_delay_brc
Definition qsvenc.h:268
int nb_extparam_str
Definition qsvenc.h:198
int look_ahead_depth
Definition qsvenc.h:221
AVRational old_framerate
Definition qsvenc.h:309
mfxExtCodingOption2 extco2
Definition qsvenc.h:171
mfxSession session
Definition qsvenc.h:160
int old_int_ref_cycle_dist
Definition qsvenc.h:296
QSVSession internal_qs
Definition qsvenc.h:161