Commit | Line | Data |
---|---|---|
7ecc2d40 AK |
1 | /* |
2 | * | |
3 | * This file is part of Libav. | |
4 | * | |
5 | * Libav is free software; you can redistribute it and/or | |
6 | * modify it under the terms of the GNU Lesser General Public | |
7 | * License as published by the Free Software Foundation; either | |
8 | * version 2.1 of the License, or (at your option) any later version. | |
9 | * | |
10 | * Libav is distributed in the hope that it will be useful, | |
11 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
13 | * Lesser General Public License for more details. | |
14 | * | |
15 | * You should have received a copy of the GNU Lesser General Public | |
16 | * License along with Libav; if not, write to the Free Software | |
17 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | |
18 | */ | |
19 | ||
20 | #ifndef AVUTIL_FRAME_H | |
21 | #define AVUTIL_FRAME_H | |
22 | ||
23 | #include <stdint.h> | |
24 | ||
25 | #include "libavcodec/version.h" | |
26 | ||
27 | #include "avutil.h" | |
28 | #include "buffer.h" | |
77b2cd7b | 29 | #include "dict.h" |
7ecc2d40 AK |
30 | #include "rational.h" |
31 | #include "samplefmt.h" | |
32 | ||
77b2cd7b AK |
33 | enum AVFrameSideDataType { |
34 | /** | |
35 | * The data is the AVPanScan struct defined in libavcodec. | |
36 | */ | |
37 | AV_FRAME_DATA_PANSCAN, | |
38 | }; | |
39 | ||
40 | typedef struct AVFrameSideData { | |
41 | enum AVFrameSideDataType type; | |
42 | uint8_t *data; | |
43 | int size; | |
44 | AVDictionary *metadata; | |
45 | } AVFrameSideData; | |
7ecc2d40 AK |
46 | |
47 | /** | |
48 | * This structure describes decoded (raw) audio or video data. | |
49 | * | |
50 | * AVFrame must be allocated using av_frame_alloc(). Not that this only | |
51 | * allocates the AVFrame itself, the buffers for the data must be managed | |
52 | * through other means (see below). | |
53 | * AVFrame must be freed with av_frame_free(). | |
54 | * | |
55 | * AVFrame is typically allocated once and then reused multiple times to hold | |
56 | * different data (e.g. a single AVFrame to hold frames received from a | |
57 | * decoder). In such a case, av_frame_unref() will free any references held by | |
58 | * the frame and reset it to its original clean state before it | |
59 | * is reused again. | |
60 | * | |
61 | * The data described by an AVFrame is usually reference counted through the | |
62 | * AVBuffer API. The underlying buffer references are stored in AVFrame.buf / | |
63 | * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at | |
64 | * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case, | |
65 | * every single data plane must be contained in one of the buffers in | |
66 | * AVFrame.buf or AVFrame.extended_buf. | |
67 | * There may be a single buffer for all the data, or one separate buffer for | |
68 | * each plane, or anything in between. | |
69 | * | |
70 | * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added | |
71 | * to the end with a minor bump. | |
72 | */ | |
73 | typedef struct AVFrame { | |
74 | #define AV_NUM_DATA_POINTERS 8 | |
75 | /** | |
76 | * pointer to the picture/channel planes. | |
77 | * This might be different from the first allocated byte | |
78 | */ | |
79 | uint8_t *data[AV_NUM_DATA_POINTERS]; | |
80 | ||
81 | /** | |
82 | * For video, size in bytes of each picture line. | |
83 | * For audio, size in bytes of each plane. | |
84 | * | |
85 | * For audio, only linesize[0] may be set. For planar audio, each channel | |
86 | * plane must be the same size. | |
87 | */ | |
88 | int linesize[AV_NUM_DATA_POINTERS]; | |
89 | ||
90 | /** | |
91 | * pointers to the data planes/channels. | |
92 | * | |
93 | * For video, this should simply point to data[]. | |
94 | * | |
95 | * For planar audio, each channel has a separate data pointer, and | |
96 | * linesize[0] contains the size of each channel buffer. | |
97 | * For packed audio, there is just one data pointer, and linesize[0] | |
98 | * contains the total size of the buffer for all channels. | |
99 | * | |
100 | * Note: Both data and extended_data should always be set in a valid frame, | |
101 | * but for planar audio with more channels that can fit in data, | |
102 | * extended_data must be used in order to access all channels. | |
103 | */ | |
104 | uint8_t **extended_data; | |
105 | ||
106 | /** | |
107 | * width and height of the video frame | |
108 | */ | |
109 | int width, height; | |
110 | ||
111 | /** | |
112 | * number of audio samples (per channel) described by this frame | |
113 | */ | |
114 | int nb_samples; | |
115 | ||
116 | /** | |
117 | * format of the frame, -1 if unknown or unset | |
118 | * Values correspond to enum AVPixelFormat for video frames, | |
119 | * enum AVSampleFormat for audio) | |
120 | */ | |
121 | int format; | |
122 | ||
123 | /** | |
124 | * 1 -> keyframe, 0-> not | |
125 | */ | |
126 | int key_frame; | |
127 | ||
128 | /** | |
129 | * Picture type of the frame. | |
130 | */ | |
131 | enum AVPictureType pict_type; | |
132 | ||
133 | uint8_t *base[AV_NUM_DATA_POINTERS]; | |
134 | ||
135 | /** | |
136 | * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified. | |
137 | */ | |
138 | AVRational sample_aspect_ratio; | |
139 | ||
140 | /** | |
141 | * Presentation timestamp in time_base units (time when frame should be shown to user). | |
142 | */ | |
143 | int64_t pts; | |
144 | ||
145 | /** | |
146 | * PTS copied from the AVPacket that was decoded to produce this frame. | |
147 | */ | |
148 | int64_t pkt_pts; | |
149 | ||
150 | /** | |
151 | * DTS copied from the AVPacket that triggered returning this frame. | |
152 | */ | |
153 | int64_t pkt_dts; | |
154 | ||
155 | /** | |
156 | * picture number in bitstream order | |
157 | */ | |
158 | int coded_picture_number; | |
159 | /** | |
160 | * picture number in display order | |
161 | */ | |
162 | int display_picture_number; | |
163 | ||
164 | /** | |
165 | * quality (between 1 (good) and FF_LAMBDA_MAX (bad)) | |
166 | */ | |
167 | int quality; | |
168 | ||
169 | int reference; | |
170 | ||
171 | /** | |
172 | * QP table | |
173 | */ | |
174 | int8_t *qscale_table; | |
175 | /** | |
176 | * QP store stride | |
177 | */ | |
178 | int qstride; | |
179 | ||
180 | int qscale_type; | |
181 | ||
182 | /** | |
183 | * mbskip_table[mb]>=1 if MB didn't change | |
184 | * stride= mb_width = (width+15)>>4 | |
185 | */ | |
186 | uint8_t *mbskip_table; | |
187 | ||
188 | /** | |
189 | * motion vector table | |
190 | * @code | |
191 | * example: | |
192 | * int mv_sample_log2= 4 - motion_subsample_log2; | |
193 | * int mb_width= (width+15)>>4; | |
194 | * int mv_stride= (mb_width << mv_sample_log2) + 1; | |
195 | * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y]; | |
196 | * @endcode | |
197 | */ | |
198 | int16_t (*motion_val[2])[2]; | |
199 | ||
200 | /** | |
201 | * macroblock type table | |
202 | * mb_type_base + mb_width + 2 | |
203 | */ | |
204 | uint32_t *mb_type; | |
205 | ||
206 | /** | |
207 | * DCT coefficients | |
208 | */ | |
209 | short *dct_coeff; | |
210 | ||
211 | /** | |
212 | * motion reference frame index | |
213 | * the order in which these are stored can depend on the codec. | |
214 | */ | |
215 | int8_t *ref_index[2]; | |
216 | ||
217 | /** | |
218 | * for some private data of the user | |
219 | */ | |
220 | void *opaque; | |
221 | ||
222 | /** | |
223 | * error | |
224 | */ | |
225 | uint64_t error[AV_NUM_DATA_POINTERS]; | |
226 | ||
227 | int type; | |
228 | ||
229 | /** | |
230 | * When decoding, this signals how much the picture must be delayed. | |
231 | * extra_delay = repeat_pict / (2*fps) | |
232 | */ | |
233 | int repeat_pict; | |
234 | ||
235 | /** | |
236 | * The content of the picture is interlaced. | |
237 | */ | |
238 | int interlaced_frame; | |
239 | ||
240 | /** | |
241 | * If the content is interlaced, is top field displayed first. | |
242 | */ | |
243 | int top_field_first; | |
244 | ||
245 | /** | |
246 | * Tell user application that palette has changed from previous frame. | |
247 | */ | |
248 | int palette_has_changed; | |
249 | ||
250 | int buffer_hints; | |
251 | ||
252 | /** | |
253 | * Pan scan. | |
254 | */ | |
255 | struct AVPanScan *pan_scan; | |
256 | ||
257 | /** | |
258 | * reordered opaque 64bit (generally an integer or a double precision float | |
259 | * PTS but can be anything). | |
260 | * The user sets AVCodecContext.reordered_opaque to represent the input at | |
261 | * that time, | |
262 | * the decoder reorders values as needed and sets AVFrame.reordered_opaque | |
263 | * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque | |
264 | * @deprecated in favor of pkt_pts | |
265 | */ | |
266 | int64_t reordered_opaque; | |
267 | ||
268 | #if FF_API_AVFRAME_LAVC | |
269 | /** | |
270 | * @deprecated this field is unused | |
271 | */ | |
272 | attribute_deprecated void *hwaccel_picture_private; | |
273 | #endif | |
274 | ||
275 | struct AVCodecContext *owner; | |
276 | void *thread_opaque; | |
277 | ||
278 | /** | |
279 | * log2 of the size of the block which a single vector in motion_val represents: | |
280 | * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2) | |
281 | */ | |
282 | uint8_t motion_subsample_log2; | |
283 | ||
284 | /** | |
285 | * Sample rate of the audio data. | |
286 | */ | |
287 | int sample_rate; | |
288 | ||
289 | /** | |
290 | * Channel layout of the audio data. | |
291 | */ | |
292 | uint64_t channel_layout; | |
293 | ||
294 | /** | |
295 | * AVBuffer references backing the data for this frame. If all elements of | |
296 | * this array are NULL, then this frame is not reference counted. | |
297 | * | |
298 | * There may be at most one AVBuffer per data plane, so for video this array | |
299 | * always contains all the references. For planar audio with more than | |
300 | * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in | |
301 | * this array. Then the extra AVBufferRef pointers are stored in the | |
302 | * extended_buf array. | |
303 | */ | |
304 | AVBufferRef *buf[AV_NUM_DATA_POINTERS]; | |
305 | ||
306 | /** | |
307 | * For planar audio which requires more than AV_NUM_DATA_POINTERS | |
308 | * AVBufferRef pointers, this array will hold all the references which | |
309 | * cannot fit into AVFrame.buf. | |
310 | * | |
311 | * Note that this is different from AVFrame.extended_data, which always | |
312 | * contains all the pointers. This array only contains the extra pointers, | |
313 | * which cannot fit into AVFrame.buf. | |
314 | * | |
315 | * This array is always allocated using av_malloc() by whoever constructs | |
316 | * the frame. It is freed in av_frame_unref(). | |
317 | */ | |
318 | AVBufferRef **extended_buf; | |
319 | /** | |
320 | * Number of elements in extended_buf. | |
321 | */ | |
322 | int nb_extended_buf; | |
77b2cd7b AK |
323 | |
324 | AVFrameSideData **side_data; | |
325 | int nb_side_data; | |
7ecc2d40 AK |
326 | } AVFrame; |
327 | ||
328 | /** | |
329 | * Allocate an AVFrame and set its fields to default values. The resulting | |
330 | * struct must be freed using av_frame_free(). | |
331 | * | |
332 | * @return An AVFrame filled with default values or NULL on failure. | |
333 | * | |
334 | * @note this only allocates the AVFrame itself, not the data buffers. Those | |
335 | * must be allocated through other means, e.g. with av_frame_get_buffer() or | |
336 | * manually. | |
337 | */ | |
338 | AVFrame *av_frame_alloc(void); | |
339 | ||
340 | /** | |
341 | * Free the frame and any dynamically allocated objects in it, | |
342 | * e.g. extended_data. If the frame is reference counted, it will be | |
343 | * unreferenced first. | |
344 | * | |
345 | * @param frame frame to be freed. The pointer will be set to NULL. | |
346 | */ | |
347 | void av_frame_free(AVFrame **frame); | |
348 | ||
349 | /** | |
350 | * Setup a new reference to the data described by an given frame. | |
351 | * | |
352 | * Copy frame properties from src to dst and create a new reference for each | |
353 | * AVBufferRef from src. | |
354 | * | |
355 | * If src is not reference counted, new buffers are allocated and the data is | |
356 | * copied. | |
357 | * | |
358 | * @return 0 on success, a negative AVERROR on error | |
359 | */ | |
360 | int av_frame_ref(AVFrame *dst, AVFrame *src); | |
361 | ||
362 | /** | |
363 | * Create a new frame that references the same data as src. | |
364 | * | |
365 | * This is a shortcut for av_frame_alloc()+av_frame_ref(). | |
366 | * | |
367 | * @return newly created AVFrame on success, NULL on error. | |
368 | */ | |
369 | AVFrame *av_frame_clone(AVFrame *src); | |
370 | ||
371 | /** | |
372 | * Unreference all the buffers referenced by frame and reset the frame fields. | |
373 | */ | |
374 | void av_frame_unref(AVFrame *frame); | |
375 | ||
376 | /** | |
377 | * Move everythnig contained in src to dst and reset src. | |
378 | */ | |
379 | void av_frame_move_ref(AVFrame *dst, AVFrame *src); | |
380 | ||
381 | /** | |
382 | * Allocate new buffer(s) for audio or video data. | |
383 | * | |
384 | * The following fields must be set on frame before calling this function: | |
385 | * - format (pixel format for video, sample format for audio) | |
386 | * - width and height for video | |
387 | * - nb_samples and channel_layout for audio | |
388 | * | |
389 | * This function will fill AVFrame.data and AVFrame.buf arrays and, if | |
390 | * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf. | |
391 | * For planar formats, one buffer will be allocated for each plane. | |
392 | * | |
393 | * @param frame frame in which to store the new buffers. | |
394 | * @param align required buffer size alignment | |
395 | * | |
396 | * @return 0 on success, a negative AVERROR on error. | |
397 | */ | |
398 | int av_frame_get_buffer(AVFrame *frame, int align); | |
399 | ||
400 | /** | |
401 | * Check if the frame data is writable. | |
402 | * | |
403 | * @return A positive value if the frame data is writable (which is true if and | |
404 | * only if each of the underlying buffers has only one reference, namely the one | |
405 | * stored in this frame). Return 0 otherwise. | |
406 | * | |
407 | * If 1 is returned the answer is valid until av_buffer_ref() is called on any | |
408 | * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly). | |
409 | * | |
410 | * @see av_frame_make_writable(), av_buffer_is_writable() | |
411 | */ | |
412 | int av_frame_is_writable(AVFrame *frame); | |
413 | ||
414 | /** | |
415 | * Ensure that the frame data is writable, avoiding data copy if possible. | |
416 | * | |
417 | * Do nothing if the frame is writable, allocate new buffers and copy the data | |
418 | * if it is not. | |
419 | * | |
420 | * @return 0 on success, a negative AVERROR on error. | |
421 | * | |
422 | * @see av_frame_is_writable(), av_buffer_is_writable(), | |
423 | * av_buffer_make_writable() | |
424 | */ | |
425 | int av_frame_make_writable(AVFrame *frame); | |
426 | ||
427 | /** | |
428 | * Copy only "metadata" fields from src to dst. | |
429 | * | |
430 | * Metadata for the purpose of this function are those fields that do not affect | |
431 | * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample | |
432 | * aspect ratio (for video), but not width/height or channel layout. | |
77b2cd7b | 433 | * Side data is also copied. |
7ecc2d40 AK |
434 | */ |
435 | int av_frame_copy_props(AVFrame *dst, const AVFrame *src); | |
436 | ||
437 | /** | |
438 | * Get the buffer reference a given data plane is stored in. | |
439 | * | |
440 | * @param plane index of the data plane of interest in frame->extended_data. | |
441 | * | |
442 | * @return the buffer reference that contains the plane or NULL if the input | |
443 | * frame is not valid. | |
444 | */ | |
445 | AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane); | |
446 | ||
77b2cd7b AK |
447 | /** |
448 | * Add a new side data to a frame. | |
449 | * | |
450 | * @param frame a frame to which the side data should be added | |
451 | * @param type type of the added side data | |
452 | * @param size size of the side data | |
453 | * | |
454 | * @return newly added side data on success, NULL on error | |
455 | */ | |
456 | AVFrameSideData *av_frame_new_side_data(AVFrame *frame, | |
457 | enum AVFrameSideDataType type, | |
458 | int size); | |
459 | ||
460 | /** | |
461 | * @return a pointer to the side data of a given type on success, NULL if there | |
462 | * is no side data with such type in this frame. | |
463 | */ | |
464 | AVFrameSideData *av_frame_get_side_data(AVFrame *frame, | |
465 | enum AVFrameSideDataType type); | |
466 | ||
7ecc2d40 | 467 | #endif /* AVUTIL_FRAME_H */ |