FFmpeg: libavcodec/vaapi_encode.h Source File

FFmpeg
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 #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 */
AVHWDeviceContext
This struct aggregates all the (hardware/vendor-specific) "high-level" state, i.e.
Definition: hwcontext.h:54
VAAPIEncodeContext::dts_pts_diff
int64_t dts_pts_diff
Definition: vaapi_encode.h:194
VAAPIEncodePicture::input_surface
VASurfaceID input_surface
Definition: vaapi_encode.h:70
VAAPIEncodeContext::va_profile
VAProfile va_profile
Definition: vaapi_encode.h:98
VAAPIEncodeContext::misc
VAEncMiscParameterBuffer misc
Definition: vaapi_encode.h:151
AVFrame
This structure describes decoded (raw) audio or video data.
Definition: frame.h:187
VAAPIEncodePicture::slices
VAAPIEncodeSlice * slices[MAX_PICTURE_SLICES]
Definition: vaapi_encode.h:88
VAAPIEncodeContext::va_entrypoint
VAEntrypoint va_entrypoint
Definition: vaapi_encode.h:100
data
ptrdiff_t const GLvoid * data
Definition: opengl_enc.c:101
VAAPIEncodeContext::codec_options_data
char codec_options_data[0]
Definition: vaapi_encode.h:209
VAAPIEncodeType::priv_data_size
size_t priv_data_size
Definition: vaapi_encode.h:214
VAAPIEncodeType::write_slice_header
int(* write_slice_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice, char *data, size_t *data_len)
Definition: vaapi_encode.h:249
VAAPIEncodeContext::codec_sequence_params
void * codec_sequence_params
Definition: vaapi_encode.h:164
VAAPIEncodeContext::input_frames_ref
AVBufferRef * input_frames_ref
Definition: vaapi_encode.h:133
pkt
static AVPacket pkt
Definition: demuxing_decoding.c:54
VAAPIEncodeContext::hrd
VAEncMiscParameterHRD hrd
Definition: vaapi_encode.h:156
VAAPIEncodeType::picture_params_size
size_t picture_params_size
Definition: vaapi_encode.h:224
VAAPIEncodeContext::device
AVHWDeviceContext * device
Definition: vaapi_encode.h:129
VAAPIEncodeContext::hrd_params
struct VAAPIEncodeContext::@129 hrd_params
hwcontext_vaapi.h
API-specific header for AV_HWDEVICE_TYPE_VAAPI.
VAAPIEncodeContext::va_packed_headers
unsigned int va_packed_headers
Definition: vaapi_encode.h:107
VAAPIEncodeContext::fr
VAEncMiscParameterFrameRate fr
Definition: vaapi_encode.h:160
VAAPIEncodeType::write_picture_header
int(* write_picture_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, char *data, size_t *data_len)
Definition: vaapi_encode.h:246
VAAPIEncodePicture::output_buffer_ref
AVBufferRef * output_buffer_ref
Definition: vaapi_encode.h:78
VAAPIEncodeContext::va_context
VAContextID va_context
Definition: vaapi_encode.h:126
VAAPIEncodePicture::recon_surface
VASurfaceID recon_surface
Definition: vaapi_encode.h:73
VAAPIEncodeContext::output_order
int64_t output_order
Definition: vaapi_encode.h:180
ff_vaapi_encode_init
int ff_vaapi_encode_init(AVCodecContext *avctx)
Definition: vaapi_encode.c:1338
AVBufferPool
The buffer pool.
Definition: buffer_internal.h:76
VAAPIEncodeContext::va_rc_mode
unsigned int va_rc_mode
Definition: vaapi_encode.h:104
VAAPIEncodeContext::config_attributes
VAConfigAttrib config_attributes[MAX_CONFIG_ATTRIBUTES]
Definition: vaapi_encode.h:122
VAAPIEncodeContext::codec_options
void * codec_options
Definition: vaapi_encode.h:208
VAAPIEncodeContext::input_frames
AVHWFramesContext * input_frames
Definition: vaapi_encode.h:134
VAAPIEncodeType::sequence_header_type
int sequence_header_type
Definition: vaapi_encode.h:237
VAAPIEncodeType::picture_header_type
int picture_header_type
Definition: vaapi_encode.h:238
VAAPIEncodeContext::global_params
VAEncMiscParameterBuffer * global_params[MAX_GLOBAL_PARAMS]
Definition: vaapi_encode.h:145
VAAPIEncodeType::configure
int(* configure)(AVCodecContext *avctx)
Definition: vaapi_encode.h:219
ff_vaapi_encode_close
int ff_vaapi_encode_close(AVCodecContext *avctx)
Definition: vaapi_encode.c:1499
VAAPIEncodeType::init_picture_params
int(* init_picture_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic)
Definition: vaapi_encode.h:229
VAAPIEncodePicture::codec_picture_params
void * codec_picture_params
Definition: vaapi_encode.h:82
VAAPIEncodeType::write_extra_header
int(* write_extra_header)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
Definition: vaapi_encode.h:266
VAAPIEncodeContext::va_config
VAConfigID va_config
Definition: vaapi_encode.h:125
VAAPIEncodeContext::recon_frames
AVHWFramesContext * recon_frames
Definition: vaapi_encode.h:138
VAAPIEncodeContext::va_rt_format
unsigned int va_rt_format
Definition: vaapi_encode.h:102
VAAPIEncodeType::slice_header_type
int slice_header_type
Definition: vaapi_encode.h:239
VAAPIEncodePicture::next
struct VAAPIEncodePicture * next
Definition: vaapi_encode.h:58
VAAPIEncodePicture::input_image
AVFrame * input_image
Definition: vaapi_encode.h:69
VAAPIEncodeContext::codec_picture_params
void * codec_picture_params
Definition: vaapi_encode.h:168
VAAPIEncodeContext::ts_ring
int64_t ts_ring[MAX_REORDER_DELAY *3]
Definition: vaapi_encode.h:195
VAAPIEncodeContext::output_buffer_pool
AVBufferPool * output_buffer_pool
Definition: vaapi_encode.h:141
VAAPIEncodePicture::encode_order
int64_t encode_order
Definition: vaapi_encode.h:61
VAAPIEncodeType::write_sequence_header
int(* write_sequence_header)(AVCodecContext *avctx, char *data, size_t *data_len)
Definition: vaapi_encode.h:244
VAAPIEncodePicture::refs
struct VAAPIEncodePicture * refs[MAX_PICTURE_REFERENCES]
Definition: vaapi_encode.h:85
ff_vaapi_encode2
int ff_vaapi_encode2(AVCodecContext *avctx, AVPacket *pkt, const AVFrame *input_image, int *got_packet)
Definition: vaapi_encode.c:831
VAAPIEncodeContext::codec
const struct VAAPIEncodeType * codec
Definition: vaapi_encode.h:95
avcodec.h
Libavcodec external API header.
VAAPIEncodeContext::pic_start
VAAPIEncodePicture * pic_start
Definition: vaapi_encode.h:171
AVCodecContext
main external API structure.
Definition: avcodec.h:1732
VAAPIEncodeType::write_extra_buffer
int(* write_extra_buffer)(AVCodecContext *avctx, VAAPIEncodePicture *pic, int index, int *type, char *data, size_t *data_len)
Definition: vaapi_encode.h:258
VAAPIEncodePicture::param_buffers
VABufferID param_buffers[MAX_PARAM_BUFFERS]
Definition: vaapi_encode.h:76
VAAPIEncodeType::slice_params_size
size_t slice_params_size
Definition: vaapi_encode.h:225
type
GLint GLenum type
Definition: opengl_enc.c:105
AVClass
Describe the class of an AVClass context structure.
Definition: log.h:67
index
int index
Definition: gxfenc.c:89
VAAPIEncodeContext::decode_delay
int64_t decode_delay
Definition: vaapi_encode.h:178
AVHWFramesContext
This struct describes a set or pool of "hardware" frames (i.e.
Definition: hwcontext.h:117
VAAPIEncodeSlice::priv_data
void * priv_data
Definition: vaapi_encode.h:53
VAAPIEncodeContext::recon_frames_ref
AVBufferRef * recon_frames_ref
Definition: vaapi_encode.h:137
VAAPIEncodeContext::device_ref
AVBufferRef * device_ref
Definition: vaapi_encode.h:128
VAAPIEncodeContext::pic_end
VAAPIEncodePicture * pic_end
Definition: vaapi_encode.h:171
VAAPIEncodeContext::output_delay
int64_t output_delay
Definition: vaapi_encode.h:176
VAAPIEncodeContext::global_params_size
size_t global_params_size[MAX_GLOBAL_PARAMS]
Definition: vaapi_encode.h:146
VAAPIEncodeContext::rc
VAEncMiscParameterRateControl rc
Definition: vaapi_encode.h:152
AVBufferRef
A reference to a data buffer.
Definition: buffer.h:81
VAAPIEncodeType::sequence_params_size
size_t sequence_params_size
Definition: vaapi_encode.h:223
int
int
Definition: ffmpeg_filter.c:190
VAAPIEncodeSlice::codec_slice_params
void * codec_slice_params
Definition: vaapi_encode.h:54
VAAPIEncodePicture::recon_image
AVFrame * recon_image
Definition: vaapi_encode.h:72
VAAPIEncodeType::init_slice_params
int(* init_slice_params)(AVCodecContext *avctx, VAAPIEncodePicture *pic, VAAPIEncodeSlice *slice)
Definition: vaapi_encode.h:231
AVVAAPIDeviceContext
VAAPI connection details.
Definition: hwcontext_vaapi.h:61
VAAPIEncodeContext::issue_mode
enum VAAPIEncodeContext::@131 issue_mode
VAAPIEncodeType::init_sequence_params
int(* init_sequence_params)(AVCodecContext *avctx)
Definition: vaapi_encode.h:228
VAAPIEncodeContext::rc_params
struct VAAPIEncodeContext::@128 rc_params
VAAPIEncodePicture::output_buffer
VABufferID output_buffer
Definition: vaapi_encode.h:79
AVPacket
This structure stores compressed data.
Definition: avcodec.h:1634
VAAPIEncodePicture::display_order
int64_t display_order
Definition: vaapi_encode.h:60
VAAPIEncodeContext::fr_params
struct VAAPIEncodeContext::@130 fr_params
VAAPIEncodeContext::input_order
int64_t input_order
Definition: vaapi_encode.h:174
VAAPIEncodeContext::hwctx
AVVAAPIDeviceContext * hwctx
Definition: vaapi_encode.h:130

Generated on Fri Jan 12 2018 01:45:48 for FFmpeg by   doxygen 1.8.6

AltStyle によって変換されたページ (->オリジナル) /