FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
vaapi_encode.h
Go to the documentation of this file.
1 /*
2  * This file is part of FFmpeg.
3  *
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.
8  *
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.
13  *
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
17  */
18 
19 #ifndef AVCODEC_VAAPI_ENCODE_H
20 #define AVCODEC_VAAPI_ENCODE_H
21 
22 #include <stdint.h>
23 
24 #include <va/va.h>
25 
26 #if VA_CHECK_VERSION(1, 0, 0)
27 #include <va/va_str.h>
28 #endif
29 
30 #include "libavutil/hwcontext.h"
32 
33 #include "avcodec.h"
34 
35 struct VAAPIEncodeType;
36 struct VAAPIEncodePicture;
37 
38 enum {
44 };
45 
46 enum {
51 };
52 
53 typedef struct VAAPIEncodeSlice {
54  int index;
55  int row_start;
56  int row_size;
59  void *priv_data;
62 
63 typedef struct VAAPIEncodePicture {
65 
66  int64_t display_order;
67  int64_t encode_order;
68  int64_t pts;
69 
70  int type;
74 
76  VASurfaceID input_surface;
77 
79  VASurfaceID recon_surface;
80 
82  VABufferID *param_buffers;
83 
85  VABufferID output_buffer;
86 
87  void *priv_data;
89 
90  int nb_refs;
92 
93  int nb_slices;
96 
97 typedef struct VAAPIEncodeProfile {
98  // lavc profile value (FF_PROFILE_*).
100  // Supported bit depth.
101  int depth;
102  // Number of components.
104  // Chroma subsampling in width dimension.
106  // Chroma subsampling in height dimension.
108  // VAAPI profile value.
109  VAProfile va_profile;
111 
112 typedef struct VAAPIEncodeContext {
113  const AVClass *class;
114 
115  // Codec-specific hooks.
116  const struct VAAPIEncodeType *codec;
117 
118  // Global options.
119 
120  // Use low power encoding mode.
122 
123  // Desired packed headers.
125 
126  // The required size of surfaces. This is probably the input
127  // size (AVCodecContext.width|height) aligned up to whatever
128  // block size is required by the codec.
131 
132  // The block size for slice calculations.
135 
136  // Everything above this point must be set before calling
137  // ff_vaapi_encode_init().
138 
139  // Chosen encoding profile details.
141 
142  // Encoding profile (VAProfile*).
143  VAProfile va_profile;
144  // Encoding entrypoint (VAEntryoint*).
145  VAEntrypoint va_entrypoint;
146  // Rate control mode.
147  unsigned int va_rc_mode;
148  // Bitrate for codec-specific encoder parameters.
149  unsigned int va_bit_rate;
150  // Packed headers which will actually be sent.
151  unsigned int va_packed_headers;
152 
153  // Configuration attributes to use when creating va_config.
156 
157  VAConfigID va_config;
158  VAContextID va_context;
159 
163 
164  // The hardware frame context containing the input frames.
167 
168  // The hardware frame context containing the reconstructed frames.
171 
172  // Pool of (reusable) bitstream output buffers.
174 
175  // Global parameters which will be applied at the start of the
176  // sequence (includes rate control parameters below).
177  VAEncMiscParameterBuffer *global_params[MAX_GLOBAL_PARAMS];
180 
181  // Rate control parameters.
182  struct {
183  VAEncMiscParameterBuffer misc;
184  VAEncMiscParameterRateControl rc;
185  } rc_params;
186  struct {
187  VAEncMiscParameterBuffer misc;
188  VAEncMiscParameterHRD hrd;
189  } hrd_params;
190  struct {
191  VAEncMiscParameterBuffer misc;
192  VAEncMiscParameterFrameRate fr;
193  } fr_params;
194 #if VA_CHECK_VERSION(0, 36, 0)
195  struct {
196  VAEncMiscParameterBuffer misc;
197  VAEncMiscParameterBufferQualityLevel quality;
198  } quality_params;
199 #endif
200 
201  // Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
203 
204  // Per-sequence parameters found in the per-picture parameter
205  // structure (VAEncPictureParameterBuffer*).
207 
208  // Current encoding window, in display (input) order.
210 
211  // Next input order index (display order).
212  int64_t input_order;
213  // Number of frames that output is behind input.
214  int64_t output_delay;
215  // Number of frames decode output will need to be delayed.
216  int64_t decode_delay;
217  // Next output order index (encode order).
218  int64_t output_order;
219 
220  enum {
221  // All encode operations are done independently (synchronise
222  // immediately after every operation).
224  // Overlap as many operations as possible.
226  // Overlap operations only when satisfying parallel dependencies.
228  } issue_mode;
229 
230  // Timestamp handling.
231  int64_t first_pts;
232  int64_t dts_pts_diff;
234 
235  // Slice structure.
240 
241  // Frame type decision.
242  int gop_size;
243  int p_per_i;
244  int b_per_p;
250 
251 enum {
252  // Codec supports controlling the subdivision of pictures into slices.
254  // Codec only supports constant quality (no rate control).
256 };
257 
258 typedef struct VAAPIEncodeType {
259  // List of supported profiles and corresponding VAAPI profiles.
260  // (Must end with FF_PROFILE_UNKNOWN.)
262 
263  // Codec feature flags.
264  int flags;
265 
266  // Perform any extra codec-specific configuration after the
267  // codec context is initialised (set up the private data and
268  // add any necessary global parameters).
270 
271  // The size of the parameter structures:
272  // sizeof(VAEnc{type}ParameterBuffer{codec}).
276 
277  // Fill the parameter structures.
280  VAAPIEncodePicture *pic);
282  VAAPIEncodePicture *pic,
283  VAAPIEncodeSlice *slice);
284 
285  // The type used by the packed header: this should look like
286  // VAEncPackedHeader{something}.
290 
291  // Write the packed header data to the provided buffer.
292  // The sequence header is also used to fill the codec extradata
293  // when the encoder is starting.
295  char *data, size_t *data_len);
297  VAAPIEncodePicture *pic,
298  char *data, size_t *data_len);
300  VAAPIEncodePicture *pic,
301  VAAPIEncodeSlice *slice,
302  char *data, size_t *data_len);
303 
304  // Fill an extra parameter structure, which will then be
305  // passed to vaRenderPicture(). Will be called repeatedly
306  // with increasing index argument until AVERROR_EOF is
307  // returned.
309  VAAPIEncodePicture *pic,
310  int index, int *type,
311  char *data, size_t *data_len);
312 
313  // Write an extra packed header. Will be called repeatedly
314  // with increasing index argument until AVERROR_EOF is
315  // returned.
317  VAAPIEncodePicture *pic,
318  int index, int *type,
319  char *data, size_t *data_len);
321 
322 
324  const AVFrame *input_image, int *got_packet);
325 
328 
329 
330 #define VAAPI_ENCODE_COMMON_OPTIONS \
331  { "low_power", \
332  "Use low-power encoding mode (only available on some platforms; " \
333  "may not support all encoding features)", \
334  OFFSET(common.low_power), AV_OPT_TYPE_BOOL, \
335  { .i64 = 0 }, 0, 1, FLAGS }
336 
337 
338 #endif /* AVCODEC_VAAPI_ENCODE_H */
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:60
VASurfaceID input_surface
Definition: vaapi_encode.h:76
VAProfile va_profile
Definition: vaapi_encode.h:143
VAEncMiscParameterBuffer misc
Definition: vaapi_encode.h:183
This structure describes decoded (raw) audio or video data.
Definition: frame.h:226
VAEntrypoint va_entrypoint
Definition: vaapi_encode.h:145
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:101
int(* write_slice_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
Definition: vaapi_encode.h:299
void * codec_sequence_params
Definition: vaapi_encode.h:202
AVBufferRef * input_frames_ref
Definition: vaapi_encode.h:165
static AVPacket pkt
VAEncMiscParameterHRD hrd
Definition: vaapi_encode.h:188
size_t picture_params_size
Definition: vaapi_encode.h:274
AVHWDeviceContext * device
Definition: vaapi_encode.h:161
API-specific header for AV_HWDEVICE_TYPE_VAAPI.
unsigned int va_packed_headers
Definition: vaapi_encode.h:151
VAEncMiscParameterFrameRate fr
Definition: vaapi_encode.h:192
int(* write_picture_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, char *data, size_t *data_len)
Definition: vaapi_encode.h:296
AVBufferRef * output_buffer_ref
Definition: vaapi_encode.h:84
VABufferID * param_buffers
Definition: vaapi_encode.h:82
struct VAAPIEncodeContext::@161 rc_params
VAContextID va_context
Definition: vaapi_encode.h:158
VASurfaceID recon_surface
Definition: vaapi_encode.h:79
int ff_vaapi_encode_init(AVCodecContext *avctx)
The buffer pool.
unsigned int va_rc_mode
Definition: vaapi_encode.h:147
VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]
Definition: vaapi_encode.h:154
AVHWFramesContext * input_frames
Definition: vaapi_encode.h:166
VAEncMiscParameterBuffer * global_params[MAX_GLOBAL_PARAMS]
Definition: vaapi_encode.h:177
int(* configure)(AVCodecContext *avctx)
Definition: vaapi_encode.h:269
struct VAAPIEncodeContext::@163 fr_params
int ff_vaapi_encode_close(AVCodecContext *avctx)
unsigned int va_bit_rate
Definition: vaapi_encode.h:149
int(* init_picture_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic)
Definition: vaapi_encode.h:279
void * codec_picture_params
Definition: vaapi_encode.h:88
int(* write_extra_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
Definition: vaapi_encode.h:316
VAConfigID va_config
Definition: vaapi_encode.h:157
AVHWFramesContext * recon_frames
Definition: vaapi_encode.h:170
VAAPIEncodeSlice * slices
Definition: vaapi_encode.h:94
const VAAPIEncodeProfile * profile
Definition: vaapi_encode.h:140
const VAAPIEncodeProfile * profiles
Definition: vaapi_encode.h:261
struct VAAPIEncodePicture * next
Definition: vaapi_encode.h:64
AVFrame * input_image
Definition: vaapi_encode.h:75
void * codec_picture_params
Definition: vaapi_encode.h:206
int64_t ts_ring[MAX_REORDER_DELAY *3]
Definition: vaapi_encode.h:233
AVBufferPool * output_buffer_pool
Definition: vaapi_encode.h:173
int(* write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len)
Definition: vaapi_encode.h:294
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
Definition: vaapi_encode.h:91
int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet)
Definition: vaapi_encode.c:895
const struct VAAPIEncodeType * codec
Definition: vaapi_encode.h:116
Libavcodec external API header.
VAAPIEncodePicture * pic_start
Definition: vaapi_encode.h:209
main external API structure.
Definition: avcodec.h:1533
int(* write_extra_buffer)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
Definition: vaapi_encode.h:308
size_t slice_params_size
Definition: vaapi_encode.h:275
GLint GLenum type
Definition: opengl_enc.c:105
Describe the class of an AVClass context structure.
Definition: log.h:67
int index
Definition: gxfenc.c:89
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:123
AVBufferRef * recon_frames_ref
Definition: vaapi_encode.h:169
AVBufferRef * device_ref
Definition: vaapi_encode.h:160
VAAPIEncodePicture * pic_end
Definition: vaapi_encode.h:209
size_t global_params_size[MAX_GLOBAL_PARAMS]
Definition: vaapi_encode.h:178
VAEncMiscParameterRateControl rc
Definition: vaapi_encode.h:184
A reference to a data buffer.
Definition: buffer.h:81
size_t sequence_params_size
Definition: vaapi_encode.h:273
VAProfile va_profile
Definition: vaapi_encode.h:109
int
struct VAAPIEncodeContext::@162 hrd_params
void * codec_slice_params
Definition: vaapi_encode.h:60
AVFrame * recon_image
Definition: vaapi_encode.h:78
int(* init_slice_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
Definition: vaapi_encode.h:281
VAAPI connection details.
int(* init_sequence_params)(AVCodecContext *avctx)
Definition: vaapi_encode.h:278
unsigned int desired_packed_headers
Definition: vaapi_encode.h:124
enum VAAPIEncodeContext::@164 issue_mode
VABufferID output_buffer
Definition: vaapi_encode.h:85
This structure stores compressed data.
Definition: avcodec.h:1422
AVVAAPIDeviceContext * hwctx
Definition: vaapi_encode.h:162