blob: 0edf27e4cbf7f2f0d800a51872ec61d499b6a56b
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 | #include "libavutil/hwcontext.h" |
27 | #include "libavutil/hwcontext_vaapi.h" |
28 | |
29 | #include "avcodec.h" |
30 | |
31 | struct VAAPIEncodeType; |
32 | struct VAAPIEncodePicture; |
33 | |
34 | enum { |
35 | MAX_CONFIG_ATTRIBUTES = 4, |
36 | MAX_GLOBAL_PARAMS = 4, |
37 | MAX_PICTURE_REFERENCES = 2, |
38 | MAX_PICTURE_SLICES = 112, |
39 | MAX_PARAM_BUFFERS = 128, |
40 | MAX_REORDER_DELAY = 16, |
41 | MAX_PARAM_BUFFER_SIZE = 1024, |
42 | }; |
43 | |
44 | enum { |
45 | PICTURE_TYPE_IDR = 0, |
46 | PICTURE_TYPE_I = 1, |
47 | PICTURE_TYPE_P = 2, |
48 | PICTURE_TYPE_B = 3, |
49 | }; |
50 | |
51 | typedef struct VAAPIEncodeSlice { |
52 | int index; |
53 | void *priv_data; |
54 | void *codec_slice_params; |
55 | } VAAPIEncodeSlice; |
56 | |
57 | typedef struct VAAPIEncodePicture { |
58 | struct VAAPIEncodePicture *next; |
59 | |
60 | int64_t display_order; |
61 | int64_t encode_order; |
62 | int64_t pts; |
63 | |
64 | int type; |
65 | int input_available; |
66 | int encode_issued; |
67 | int encode_complete; |
68 | |
69 | AVFrame *input_image; |
70 | VASurfaceID input_surface; |
71 | |
72 | AVFrame *recon_image; |
73 | VASurfaceID recon_surface; |
74 | |
75 | int nb_param_buffers; |
76 | VABufferID param_buffers[MAX_PARAM_BUFFERS]; |
77 | |
78 | AVBufferRef *output_buffer_ref; |
79 | VABufferID output_buffer; |
80 | |
81 | void *priv_data; |
82 | void *codec_picture_params; |
83 | |
84 | int nb_refs; |
85 | struct VAAPIEncodePicture *refs[MAX_PICTURE_REFERENCES]; |
86 | |
87 | int nb_slices; |
88 | VAAPIEncodeSlice *slices[MAX_PICTURE_SLICES]; |
89 | } VAAPIEncodePicture; |
90 | |
91 | typedef struct VAAPIEncodeContext { |
92 | const AVClass *class; |
93 | |
94 | // Codec-specific hooks. |
95 | const struct VAAPIEncodeType *codec; |
96 | |
97 | // Encoding profile (VAProfileXXX). |
98 | VAProfile va_profile; |
99 | // Encoding entrypoint (usually VAEntryointEncSlice). |
100 | VAEntrypoint va_entrypoint; |
101 | // Surface colour/sampling format (usually VA_RT_FORMAT_YUV420). |
102 | unsigned int va_rt_format; |
103 | // Rate control mode. |
104 | unsigned int va_rc_mode; |
105 | // Supported packed headers (initially the desired set, modified |
106 | // later to what is actually supported). |
107 | unsigned int va_packed_headers; |
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. |
112 | int surface_width; |
113 | int surface_height; |
114 | |
115 | // Everything above this point must be set before calling |
116 | // ff_vaapi_encode_init(). |
117 | |
118 | // Codec-specific state. |
119 | void *priv_data; |
120 | |
121 | // Configuration attributes to use when creating va_config. |
122 | VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]; |
123 | int nb_config_attributes; |
124 | |
125 | VAConfigID va_config; |
126 | VAContextID va_context; |
127 | |
128 | AVBufferRef *device_ref; |
129 | AVHWDeviceContext *device; |
130 | AVVAAPIDeviceContext *hwctx; |
131 | |
132 | // The hardware frame context containing the input frames. |
133 | AVBufferRef *input_frames_ref; |
134 | AVHWFramesContext *input_frames; |
135 | |
136 | // The hardware frame context containing the reconstructed frames. |
137 | AVBufferRef *recon_frames_ref; |
138 | AVHWFramesContext *recon_frames; |
139 | |
140 | // Pool of (reusable) bitstream output buffers. |
141 | AVBufferPool *output_buffer_pool; |
142 | |
143 | // Global parameters which will be applied at the start of the |
144 | // sequence (includes rate control parameters below). |
145 | VAEncMiscParameterBuffer *global_params[MAX_GLOBAL_PARAMS]; |
146 | size_t global_params_size[MAX_GLOBAL_PARAMS]; |
147 | int nb_global_params; |
148 | |
149 | // Rate control parameters. |
150 | struct { |
151 | VAEncMiscParameterBuffer misc; |
152 | VAEncMiscParameterRateControl rc; |
153 | } rc_params; |
154 | struct { |
155 | VAEncMiscParameterBuffer misc; |
156 | VAEncMiscParameterHRD hrd; |
157 | } hrd_params; |
158 | struct { |
159 | VAEncMiscParameterBuffer misc; |
160 | VAEncMiscParameterFrameRate fr; |
161 | } fr_params; |
162 | |
163 | // Per-sequence parameter structure (VAEncSequenceParameterBuffer*). |
164 | void *codec_sequence_params; |
165 | |
166 | // Per-sequence parameters found in the per-picture parameter |
167 | // structure (VAEncPictureParameterBuffer*). |
168 | void *codec_picture_params; |
169 | |
170 | // Current encoding window, in display (input) order. |
171 | VAAPIEncodePicture *pic_start, *pic_end; |
172 | |
173 | // Next input order index (display order). |
174 | int64_t input_order; |
175 | // Number of frames that output is behind input. |
176 | int64_t output_delay; |
177 | // Number of frames decode output will need to be delayed. |
178 | int64_t decode_delay; |
179 | // Next output order index (encode order). |
180 | int64_t output_order; |
181 | |
182 | enum { |
183 | // All encode operations are done independently (synchronise |
184 | // immediately after every operation). |
185 | ISSUE_MODE_SERIALISE_EVERYTHING = 0, |
186 | // Overlap as many operations as possible. |
187 | ISSUE_MODE_MAXIMISE_THROUGHPUT, |
188 | // Overlap operations only when satisfying parallel dependencies. |
189 | ISSUE_MODE_MINIMISE_LATENCY, |
190 | } issue_mode; |
191 | |
192 | // Timestamp handling. |
193 | int64_t first_pts; |
194 | int64_t dts_pts_diff; |
195 | int64_t ts_ring[MAX_REORDER_DELAY * 3]; |
196 | |
197 | // Frame type decision. |
198 | int p_per_i; |
199 | int b_per_p; |
200 | int force_idr; |
201 | int gop_counter; |
202 | int p_counter; |
203 | int end_of_stream; |
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)). |
208 | void *codec_options; |
209 | char codec_options_data[0]; |
210 | } VAAPIEncodeContext; |
211 | |
212 | |
213 | typedef struct VAAPIEncodeType { |
214 | size_t priv_data_size; |
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). |
219 | int (*configure)(AVCodecContext *avctx); |
220 | |
221 | // The size of the parameter structures: |
222 | // sizeof(VAEnc{type}ParameterBuffer{codec}). |
223 | size_t sequence_params_size; |
224 | size_t picture_params_size; |
225 | size_t slice_params_size; |
226 | |
227 | // Fill the parameter structures. |
228 | int (*init_sequence_params)(AVCodecContext *avctx); |
229 | int (*init_picture_params)(AVCodecContext *avctx, |
230 | VAAPIEncodePicture *pic); |
231 | int (*init_slice_params)(AVCodecContext *avctx, |
232 | VAAPIEncodePicture *pic, |
233 | VAAPIEncodeSlice *slice); |
234 | |
235 | // The type used by the packed header: this should look like |
236 | // VAEncPackedHeader{something}. |
237 | int sequence_header_type; |
238 | int picture_header_type; |
239 | int slice_header_type; |
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. |
244 | int (*write_sequence_header)(AVCodecContext *avctx, |
245 | char *data, size_t *data_len); |
246 | int (*write_picture_header)(AVCodecContext *avctx, |
247 | VAAPIEncodePicture *pic, |
248 | char *data, size_t *data_len); |
249 | int (*write_slice_header)(AVCodecContext *avctx, |
250 | VAAPIEncodePicture *pic, |
251 | VAAPIEncodeSlice *slice, |
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. |
258 | int (*write_extra_buffer)(AVCodecContext *avctx, |
259 | VAAPIEncodePicture *pic, |
260 | int index, int *type, |
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. |
266 | int (*write_extra_header)(AVCodecContext *avctx, |
267 | VAAPIEncodePicture *pic, |
268 | int index, int *type, |
269 | char *data, size_t *data_len); |
270 | } VAAPIEncodeType; |
271 | |
272 | |
273 | int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, |
274 | const AVFrame *input_image, int *got_packet); |
275 | |
276 | int ff_vaapi_encode_init(AVCodecContext *avctx); |
277 | int ff_vaapi_encode_close(AVCodecContext *avctx); |
278 | |
279 | #endif /* AVCODEC_VAAPI_ENCODE_H */ |
280 |