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
28
30
33
34 enum {
42 };
43
44 enum {
49 };
50
56
59
63
68
71
74
77
80
83
86
90
93
94 // Codec-specific hooks.
96
97 // Encoding profile (VAProfileXXX).
99 // Encoding entrypoint (usually VAEntryointEncSlice).
101 // Surface colour/sampling format (usually VA_RT_FORMAT_YUV420).
103 // Rate control mode.
105 // Supported packed headers (initially the desired set, modified
106 // later to what is actually supported).
108
109 // The required size of surfaces. This is probably the input
110 // size (AVCodecContext.width|height) aligned up to whatever
111 // block size is required by the codec.
114
115 // Everything above this point must be set before calling
116 // ff_vaapi_encode_init().
117
118 // Codec-specific state.
120
121 // Configuration attributes to use when creating va_config.
124
127
131
132 // The hardware frame context containing the input frames.
135
136 // The hardware frame context containing the reconstructed frames.
139
140 // Pool of (reusable) bitstream output buffers.
142
143 // Global parameters which will be applied at the start of the
144 // sequence (includes rate control parameters below).
148
149 // Rate control parameters.
150 struct {
152 VAEncMiscParameterRateControl
rc;
154 struct {
155 VAEncMiscParameterBuffer
misc;
156 VAEncMiscParameterHRD
hrd;
158 struct {
159 VAEncMiscParameterBuffer
misc;
160 VAEncMiscParameterFrameRate
fr;
162
163 // Per-sequence parameter structure (VAEncSequenceParameterBuffer*).
165
166 // Per-sequence parameters found in the per-picture parameter
167 // structure (VAEncPictureParameterBuffer*).
169
170 // Current encoding window, in display (input) order.
172
173 // Next input order index (display order).
175 // Number of frames that output is behind input.
177 // Number of frames decode output will need to be delayed.
179 // Next output order index (encode order).
181
182 enum {
183 // All encode operations are done independently (synchronise
184 // immediately after every operation).
186 // Overlap as many operations as possible.
188 // Overlap operations only when satisfying parallel dependencies.
191
192 // Timestamp handling.
196
197 // Frame type decision.
204
205 // Codec-local options are allocated to follow this structure in
206 // memory (in the AVCodec definition, set priv_data_size to
207 // sizeof(VAAPIEncodeContext) + sizeof(VAAPIEncodeFooOptions)).
211
212
215
216 // Perform any extra codec-specific configuration after the
217 // codec context is initialised (set up the private data and
218 // add any necessary global parameters).
220
221 // The size of the parameter structures:
222 // sizeof(VAEnc{type}ParameterBuffer{codec}).
226
227 // Fill the parameter structures.
234
235 // The type used by the packed header: this should look like
236 // VAEncPackedHeader{something}.
240
241 // Write the packed header data to the provided buffer.
242 // The sequence header is also used to fill the codec extradata
243 // when the encoder is starting.
245 char *
data,
size_t *data_len);
248 char *
data,
size_t *data_len);
252 char *
data,
size_t *data_len);
253
254 // Fill an extra parameter structure, which will then be
255 // passed to vaRenderPicture(). Will be called repeatedly
256 // with increasing index argument until AVERROR_EOF is
257 // returned.
261 char *
data,
size_t *data_len);
262
263 // Write an extra packed header. Will be called repeatedly
264 // with increasing index argument until AVERROR_EOF is
265 // returned.
269 char *
data,
size_t *data_len);
271
272
274 const AVFrame *input_image,
int *got_packet);
275
278
279 #endif /* AVCODEC_VAAPI_ENCODE_H */
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
VASurfaceID input_surface
VAEncMiscParameterBuffer misc
This structure describes decoded (raw) audio or video data.
VAAPIEncodeSlice * slices[MAX_PICTURE_SLICES]
VAEntrypoint va_entrypoint
ptrdiff_t const GLvoid * data
char codec_options_data[0]
int(* write_slice_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
void * codec_sequence_params
AVBufferRef * input_frames_ref
VAEncMiscParameterHRD hrd
size_t picture_params_size
AVHWDeviceContext * device
struct VAAPIEncodeContext::@129 hrd_params
API-specific header for AV_HWDEVICE_TYPE_VAAPI.
unsigned int va_packed_headers
VAEncMiscParameterFrameRate fr
int(* write_picture_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, char *data, size_t *data_len)
AVBufferRef * output_buffer_ref
VASurfaceID recon_surface
int ff_vaapi_encode_init(AVCodecContext *avctx)
VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]
AVHWFramesContext * input_frames
VAEncMiscParameterBuffer * global_params[MAX_GLOBAL_PARAMS]
int(* configure)(AVCodecContext *avctx)
int ff_vaapi_encode_close(AVCodecContext *avctx)
int(* init_picture_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic)
void * codec_picture_params
int(* write_extra_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
AVHWFramesContext * recon_frames
unsigned int va_rt_format
struct VAAPIEncodePicture * next
void * codec_picture_params
int64_t ts_ring[MAX_REORDER_DELAY *3]
AVBufferPool * output_buffer_pool
int(* write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len)
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet)
const struct VAAPIEncodeType * codec
Libavcodec external API header.
VAAPIEncodePicture * pic_start
main external API structure.
int(* write_extra_buffer)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
VABufferID param_buffers[MAX_PARAM_BUFFERS]
Describe the class of an AVClass context structure.
This struct describes a set or pool of "hardware" frames (i.e.
AVBufferRef * recon_frames_ref
VAAPIEncodePicture * pic_end
size_t global_params_size[MAX_GLOBAL_PARAMS]
VAEncMiscParameterRateControl rc
A reference to a data buffer.
size_t sequence_params_size
void * codec_slice_params
int(* init_slice_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
VAAPI connection details.
enum VAAPIEncodeContext::@131 issue_mode
int(* init_sequence_params)(AVCodecContext *avctx)
struct VAAPIEncodeContext::@128 rc_params
This structure stores compressed data.
struct VAAPIEncodeContext::@130 fr_params
AVVAAPIDeviceContext * hwctx