annotate ffmpeg/libavutil/frame.h @ 13:844d341cf643 tip

Back up before ISMIR
author Yading Song <yading.song@eecs.qmul.ac.uk>
date Thu, 31 Oct 2013 13:17:06 +0000
parents f445c3017523
children
rev   line source
yading@11 1 /*
yading@11 2 *
yading@11 3 * This file is part of FFmpeg.
yading@11 4 *
yading@11 5 * FFmpeg is free software; you can redistribute it and/or
yading@11 6 * modify it under the terms of the GNU Lesser General Public
yading@11 7 * License as published by the Free Software Foundation; either
yading@11 8 * version 2.1 of the License, or (at your option) any later version.
yading@11 9 *
yading@11 10 * FFmpeg is distributed in the hope that it will be useful,
yading@11 11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
yading@11 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
yading@11 13 * Lesser General Public License for more details.
yading@11 14 *
yading@11 15 * You should have received a copy of the GNU Lesser General Public
yading@11 16 * License along with FFmpeg; if not, write to the Free Software
yading@11 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
yading@11 18 */
yading@11 19
yading@11 20 #ifndef AVUTIL_FRAME_H
yading@11 21 #define AVUTIL_FRAME_H
yading@11 22
yading@11 23 #include <stdint.h>
yading@11 24
yading@11 25 #include "libavcodec/version.h"
yading@11 26
yading@11 27 #include "avutil.h"
yading@11 28 #include "buffer.h"
yading@11 29 #include "dict.h"
yading@11 30 #include "rational.h"
yading@11 31 #include "samplefmt.h"
yading@11 32
yading@11 33 enum AVFrameSideDataType {
yading@11 34 /**
yading@11 35 * The data is the AVPanScan struct defined in libavcodec.
yading@11 36 */
yading@11 37 AV_FRAME_DATA_PANSCAN,
yading@11 38 };
yading@11 39
yading@11 40 typedef struct AVFrameSideData {
yading@11 41 enum AVFrameSideDataType type;
yading@11 42 uint8_t *data;
yading@11 43 int size;
yading@11 44 AVDictionary *metadata;
yading@11 45 } AVFrameSideData;
yading@11 46
yading@11 47 /**
yading@11 48 * This structure describes decoded (raw) audio or video data.
yading@11 49 *
yading@11 50 * AVFrame must be allocated using av_frame_alloc(). Note that this only
yading@11 51 * allocates the AVFrame itself, the buffers for the data must be managed
yading@11 52 * through other means (see below).
yading@11 53 * AVFrame must be freed with av_frame_free().
yading@11 54 *
yading@11 55 * AVFrame is typically allocated once and then reused multiple times to hold
yading@11 56 * different data (e.g. a single AVFrame to hold frames received from a
yading@11 57 * decoder). In such a case, av_frame_unref() will free any references held by
yading@11 58 * the frame and reset it to its original clean state before it
yading@11 59 * is reused again.
yading@11 60 *
yading@11 61 * The data described by an AVFrame is usually reference counted through the
yading@11 62 * AVBuffer API. The underlying buffer references are stored in AVFrame.buf /
yading@11 63 * AVFrame.extended_buf. An AVFrame is considered to be reference counted if at
yading@11 64 * least one reference is set, i.e. if AVFrame.buf[0] != NULL. In such a case,
yading@11 65 * every single data plane must be contained in one of the buffers in
yading@11 66 * AVFrame.buf or AVFrame.extended_buf.
yading@11 67 * There may be a single buffer for all the data, or one separate buffer for
yading@11 68 * each plane, or anything in between.
yading@11 69 *
yading@11 70 * sizeof(AVFrame) is not a part of the public ABI, so new fields may be added
yading@11 71 * to the end with a minor bump.
yading@11 72 * Similarly fields that are marked as to be only accessed by
yading@11 73 * av_opt_ptr() can be reordered. This allows 2 forks to add fields
yading@11 74 * without breaking compatibility with each other.
yading@11 75 */
yading@11 76 typedef struct AVFrame {
yading@11 77 #define AV_NUM_DATA_POINTERS 8
yading@11 78 /**
yading@11 79 * pointer to the picture/channel planes.
yading@11 80 * This might be different from the first allocated byte
yading@11 81 *
yading@11 82 * Some decoders access areas outside 0,0 - width,height, please
yading@11 83 * see avcodec_align_dimensions2(). Some filters and swscale can read
yading@11 84 * up to 16 bytes beyond the planes, if these filters are to be used,
yading@11 85 * then 16 extra bytes must be allocated.
yading@11 86 */
yading@11 87 uint8_t *data[AV_NUM_DATA_POINTERS];
yading@11 88
yading@11 89 /**
yading@11 90 * For video, size in bytes of each picture line.
yading@11 91 * For audio, size in bytes of each plane.
yading@11 92 *
yading@11 93 * For audio, only linesize[0] may be set. For planar audio, each channel
yading@11 94 * plane must be the same size.
yading@11 95 *
yading@11 96 * For video the linesizes should be multiplies of the CPUs alignment
yading@11 97 * preference, this is 16 or 32 for modern desktop CPUs.
yading@11 98 * Some code requires such alignment other code can be slower without
yading@11 99 * correct alignment, for yet other it makes no difference.
yading@11 100 */
yading@11 101 int linesize[AV_NUM_DATA_POINTERS];
yading@11 102
yading@11 103 /**
yading@11 104 * pointers to the data planes/channels.
yading@11 105 *
yading@11 106 * For video, this should simply point to data[].
yading@11 107 *
yading@11 108 * For planar audio, each channel has a separate data pointer, and
yading@11 109 * linesize[0] contains the size of each channel buffer.
yading@11 110 * For packed audio, there is just one data pointer, and linesize[0]
yading@11 111 * contains the total size of the buffer for all channels.
yading@11 112 *
yading@11 113 * Note: Both data and extended_data should always be set in a valid frame,
yading@11 114 * but for planar audio with more channels that can fit in data,
yading@11 115 * extended_data must be used in order to access all channels.
yading@11 116 */
yading@11 117 uint8_t **extended_data;
yading@11 118
yading@11 119 /**
yading@11 120 * width and height of the video frame
yading@11 121 */
yading@11 122 int width, height;
yading@11 123
yading@11 124 /**
yading@11 125 * number of audio samples (per channel) described by this frame
yading@11 126 */
yading@11 127 int nb_samples;
yading@11 128
yading@11 129 /**
yading@11 130 * format of the frame, -1 if unknown or unset
yading@11 131 * Values correspond to enum AVPixelFormat for video frames,
yading@11 132 * enum AVSampleFormat for audio)
yading@11 133 */
yading@11 134 int format;
yading@11 135
yading@11 136 /**
yading@11 137 * 1 -> keyframe, 0-> not
yading@11 138 */
yading@11 139 int key_frame;
yading@11 140
yading@11 141 /**
yading@11 142 * Picture type of the frame.
yading@11 143 */
yading@11 144 enum AVPictureType pict_type;
yading@11 145
yading@11 146 #if FF_API_AVFRAME_LAVC
yading@11 147 attribute_deprecated
yading@11 148 uint8_t *base[AV_NUM_DATA_POINTERS];
yading@11 149 #endif
yading@11 150
yading@11 151 /**
yading@11 152 * Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
yading@11 153 */
yading@11 154 AVRational sample_aspect_ratio;
yading@11 155
yading@11 156 /**
yading@11 157 * Presentation timestamp in time_base units (time when frame should be shown to user).
yading@11 158 */
yading@11 159 int64_t pts;
yading@11 160
yading@11 161 /**
yading@11 162 * PTS copied from the AVPacket that was decoded to produce this frame.
yading@11 163 */
yading@11 164 int64_t pkt_pts;
yading@11 165
yading@11 166 /**
yading@11 167 * DTS copied from the AVPacket that triggered returning this frame. (if frame threading isnt used)
yading@11 168 * This is also the Presentation time of this AVFrame calculated from
yading@11 169 * only AVPacket.dts values without pts values.
yading@11 170 */
yading@11 171 int64_t pkt_dts;
yading@11 172
yading@11 173 /**
yading@11 174 * picture number in bitstream order
yading@11 175 */
yading@11 176 int coded_picture_number;
yading@11 177 /**
yading@11 178 * picture number in display order
yading@11 179 */
yading@11 180 int display_picture_number;
yading@11 181
yading@11 182 /**
yading@11 183 * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
yading@11 184 */
yading@11 185 int quality;
yading@11 186
yading@11 187 #if FF_API_AVFRAME_LAVC
yading@11 188 attribute_deprecated
yading@11 189 int reference;
yading@11 190
yading@11 191 /**
yading@11 192 * QP table
yading@11 193 */
yading@11 194 attribute_deprecated
yading@11 195 int8_t *qscale_table;
yading@11 196 /**
yading@11 197 * QP store stride
yading@11 198 */
yading@11 199 attribute_deprecated
yading@11 200 int qstride;
yading@11 201
yading@11 202 attribute_deprecated
yading@11 203 int qscale_type;
yading@11 204
yading@11 205 /**
yading@11 206 * mbskip_table[mb]>=1 if MB didn't change
yading@11 207 * stride= mb_width = (width+15)>>4
yading@11 208 */
yading@11 209 attribute_deprecated
yading@11 210 uint8_t *mbskip_table;
yading@11 211
yading@11 212 /**
yading@11 213 * motion vector table
yading@11 214 * @code
yading@11 215 * example:
yading@11 216 * int mv_sample_log2= 4 - motion_subsample_log2;
yading@11 217 * int mb_width= (width+15)>>4;
yading@11 218 * int mv_stride= (mb_width << mv_sample_log2) + 1;
yading@11 219 * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
yading@11 220 * @endcode
yading@11 221 */
yading@11 222 attribute_deprecated
yading@11 223 int16_t (*motion_val[2])[2];
yading@11 224
yading@11 225 /**
yading@11 226 * macroblock type table
yading@11 227 * mb_type_base + mb_width + 2
yading@11 228 */
yading@11 229 attribute_deprecated
yading@11 230 uint32_t *mb_type;
yading@11 231
yading@11 232 /**
yading@11 233 * DCT coefficients
yading@11 234 */
yading@11 235 attribute_deprecated
yading@11 236 short *dct_coeff;
yading@11 237
yading@11 238 /**
yading@11 239 * motion reference frame index
yading@11 240 * the order in which these are stored can depend on the codec.
yading@11 241 */
yading@11 242 attribute_deprecated
yading@11 243 int8_t *ref_index[2];
yading@11 244 #endif
yading@11 245
yading@11 246 /**
yading@11 247 * for some private data of the user
yading@11 248 */
yading@11 249 void *opaque;
yading@11 250
yading@11 251 /**
yading@11 252 * error
yading@11 253 */
yading@11 254 uint64_t error[AV_NUM_DATA_POINTERS];
yading@11 255
yading@11 256 #if FF_API_AVFRAME_LAVC
yading@11 257 attribute_deprecated
yading@11 258 int type;
yading@11 259 #endif
yading@11 260
yading@11 261 /**
yading@11 262 * When decoding, this signals how much the picture must be delayed.
yading@11 263 * extra_delay = repeat_pict / (2*fps)
yading@11 264 */
yading@11 265 int repeat_pict;
yading@11 266
yading@11 267 /**
yading@11 268 * The content of the picture is interlaced.
yading@11 269 */
yading@11 270 int interlaced_frame;
yading@11 271
yading@11 272 /**
yading@11 273 * If the content is interlaced, is top field displayed first.
yading@11 274 */
yading@11 275 int top_field_first;
yading@11 276
yading@11 277 /**
yading@11 278 * Tell user application that palette has changed from previous frame.
yading@11 279 */
yading@11 280 int palette_has_changed;
yading@11 281
yading@11 282 #if FF_API_AVFRAME_LAVC
yading@11 283 attribute_deprecated
yading@11 284 int buffer_hints;
yading@11 285
yading@11 286 /**
yading@11 287 * Pan scan.
yading@11 288 */
yading@11 289 attribute_deprecated
yading@11 290 struct AVPanScan *pan_scan;
yading@11 291 #endif
yading@11 292
yading@11 293 /**
yading@11 294 * reordered opaque 64bit (generally an integer or a double precision float
yading@11 295 * PTS but can be anything).
yading@11 296 * The user sets AVCodecContext.reordered_opaque to represent the input at
yading@11 297 * that time,
yading@11 298 * the decoder reorders values as needed and sets AVFrame.reordered_opaque
yading@11 299 * to exactly one of the values provided by the user through AVCodecContext.reordered_opaque
yading@11 300 * @deprecated in favor of pkt_pts
yading@11 301 */
yading@11 302 int64_t reordered_opaque;
yading@11 303
yading@11 304 #if FF_API_AVFRAME_LAVC
yading@11 305 /**
yading@11 306 * @deprecated this field is unused
yading@11 307 */
yading@11 308 attribute_deprecated void *hwaccel_picture_private;
yading@11 309
yading@11 310 attribute_deprecated
yading@11 311 struct AVCodecContext *owner;
yading@11 312 attribute_deprecated
yading@11 313 void *thread_opaque;
yading@11 314
yading@11 315 /**
yading@11 316 * log2 of the size of the block which a single vector in motion_val represents:
yading@11 317 * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
yading@11 318 */
yading@11 319 attribute_deprecated
yading@11 320 uint8_t motion_subsample_log2;
yading@11 321 #endif
yading@11 322
yading@11 323 /**
yading@11 324 * Sample rate of the audio data.
yading@11 325 */
yading@11 326 int sample_rate;
yading@11 327
yading@11 328 /**
yading@11 329 * Channel layout of the audio data.
yading@11 330 */
yading@11 331 uint64_t channel_layout;
yading@11 332
yading@11 333 /**
yading@11 334 * AVBuffer references backing the data for this frame. If all elements of
yading@11 335 * this array are NULL, then this frame is not reference counted.
yading@11 336 *
yading@11 337 * There may be at most one AVBuffer per data plane, so for video this array
yading@11 338 * always contains all the references. For planar audio with more than
yading@11 339 * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
yading@11 340 * this array. Then the extra AVBufferRef pointers are stored in the
yading@11 341 * extended_buf array.
yading@11 342 */
yading@11 343 AVBufferRef *buf[AV_NUM_DATA_POINTERS];
yading@11 344
yading@11 345 /**
yading@11 346 * For planar audio which requires more than AV_NUM_DATA_POINTERS
yading@11 347 * AVBufferRef pointers, this array will hold all the references which
yading@11 348 * cannot fit into AVFrame.buf.
yading@11 349 *
yading@11 350 * Note that this is different from AVFrame.extended_data, which always
yading@11 351 * contains all the pointers. This array only contains the extra pointers,
yading@11 352 * which cannot fit into AVFrame.buf.
yading@11 353 *
yading@11 354 * This array is always allocated using av_malloc() by whoever constructs
yading@11 355 * the frame. It is freed in av_frame_unref().
yading@11 356 */
yading@11 357 AVBufferRef **extended_buf;
yading@11 358 /**
yading@11 359 * Number of elements in extended_buf.
yading@11 360 */
yading@11 361 int nb_extended_buf;
yading@11 362
yading@11 363 AVFrameSideData **side_data;
yading@11 364 int nb_side_data;
yading@11 365
yading@11 366 /**
yading@11 367 * frame timestamp estimated using various heuristics, in stream time base
yading@11 368 * Code outside libavcodec should access this field using:
yading@11 369 * av_frame_get_best_effort_timestamp(frame)
yading@11 370 * - encoding: unused
yading@11 371 * - decoding: set by libavcodec, read by user.
yading@11 372 */
yading@11 373 int64_t best_effort_timestamp;
yading@11 374
yading@11 375 /**
yading@11 376 * reordered pos from the last AVPacket that has been input into the decoder
yading@11 377 * Code outside libavcodec should access this field using:
yading@11 378 * av_frame_get_pkt_pos(frame)
yading@11 379 * - encoding: unused
yading@11 380 * - decoding: Read by user.
yading@11 381 */
yading@11 382 int64_t pkt_pos;
yading@11 383
yading@11 384 /**
yading@11 385 * duration of the corresponding packet, expressed in
yading@11 386 * AVStream->time_base units, 0 if unknown.
yading@11 387 * Code outside libavcodec should access this field using:
yading@11 388 * av_frame_get_pkt_duration(frame)
yading@11 389 * - encoding: unused
yading@11 390 * - decoding: Read by user.
yading@11 391 */
yading@11 392 int64_t pkt_duration;
yading@11 393
yading@11 394 /**
yading@11 395 * metadata.
yading@11 396 * Code outside libavcodec should access this field using:
yading@11 397 * av_frame_get_metadata(frame)
yading@11 398 * - encoding: Set by user.
yading@11 399 * - decoding: Set by libavcodec.
yading@11 400 */
yading@11 401 AVDictionary *metadata;
yading@11 402
yading@11 403 /**
yading@11 404 * decode error flags of the frame, set to a combination of
yading@11 405 * FF_DECODE_ERROR_xxx flags if the decoder produced a frame, but there
yading@11 406 * were errors during the decoding.
yading@11 407 * Code outside libavcodec should access this field using:
yading@11 408 * av_frame_get_decode_error_flags(frame)
yading@11 409 * - encoding: unused
yading@11 410 * - decoding: set by libavcodec, read by user.
yading@11 411 */
yading@11 412 int decode_error_flags;
yading@11 413 #define FF_DECODE_ERROR_INVALID_BITSTREAM 1
yading@11 414 #define FF_DECODE_ERROR_MISSING_REFERENCE 2
yading@11 415
yading@11 416 /**
yading@11 417 * number of audio channels, only used for audio.
yading@11 418 * Code outside libavcodec should access this field using:
yading@11 419 * av_frame_get_channels(frame)
yading@11 420 * - encoding: unused
yading@11 421 * - decoding: Read by user.
yading@11 422 */
yading@11 423 int channels;
yading@11 424
yading@11 425 /**
yading@11 426 * size of the corresponding packet containing the compressed
yading@11 427 * frame. It must be accessed using av_frame_get_pkt_size() and
yading@11 428 * av_frame_set_pkt_size().
yading@11 429 * It is set to a negative value if unknown.
yading@11 430 * - encoding: unused
yading@11 431 * - decoding: set by libavcodec, read by user.
yading@11 432 */
yading@11 433 int pkt_size;
yading@11 434
yading@11 435 /**
yading@11 436 * Not to be accessed directly from outside libavutil
yading@11 437 */
yading@11 438 AVBufferRef *qp_table_buf;
yading@11 439 } AVFrame;
yading@11 440
yading@11 441 /**
yading@11 442 * Accessors for some AVFrame fields.
yading@11 443 * The position of these field in the structure is not part of the ABI,
yading@11 444 * they should not be accessed directly outside libavcodec.
yading@11 445 */
yading@11 446 int64_t av_frame_get_best_effort_timestamp(const AVFrame *frame);
yading@11 447 void av_frame_set_best_effort_timestamp(AVFrame *frame, int64_t val);
yading@11 448 int64_t av_frame_get_pkt_duration (const AVFrame *frame);
yading@11 449 void av_frame_set_pkt_duration (AVFrame *frame, int64_t val);
yading@11 450 int64_t av_frame_get_pkt_pos (const AVFrame *frame);
yading@11 451 void av_frame_set_pkt_pos (AVFrame *frame, int64_t val);
yading@11 452 int64_t av_frame_get_channel_layout (const AVFrame *frame);
yading@11 453 void av_frame_set_channel_layout (AVFrame *frame, int64_t val);
yading@11 454 int av_frame_get_channels (const AVFrame *frame);
yading@11 455 void av_frame_set_channels (AVFrame *frame, int val);
yading@11 456 int av_frame_get_sample_rate (const AVFrame *frame);
yading@11 457 void av_frame_set_sample_rate (AVFrame *frame, int val);
yading@11 458 AVDictionary *av_frame_get_metadata (const AVFrame *frame);
yading@11 459 void av_frame_set_metadata (AVFrame *frame, AVDictionary *val);
yading@11 460 int av_frame_get_decode_error_flags (const AVFrame *frame);
yading@11 461 void av_frame_set_decode_error_flags (AVFrame *frame, int val);
yading@11 462 int av_frame_get_pkt_size(const AVFrame *frame);
yading@11 463 void av_frame_set_pkt_size(AVFrame *frame, int val);
yading@11 464 AVDictionary **avpriv_frame_get_metadatap(AVFrame *frame);
yading@11 465 int8_t *av_frame_get_qp_table(AVFrame *f, int *stride, int *type);
yading@11 466 int av_frame_set_qp_table(AVFrame *f, AVBufferRef *buf, int stride, int type);
yading@11 467
yading@11 468 /**
yading@11 469 * Allocate an AVFrame and set its fields to default values. The resulting
yading@11 470 * struct must be freed using av_frame_free().
yading@11 471 *
yading@11 472 * @return An AVFrame filled with default values or NULL on failure.
yading@11 473 *
yading@11 474 * @note this only allocates the AVFrame itself, not the data buffers. Those
yading@11 475 * must be allocated through other means, e.g. with av_frame_get_buffer() or
yading@11 476 * manually.
yading@11 477 */
yading@11 478 AVFrame *av_frame_alloc(void);
yading@11 479
yading@11 480 /**
yading@11 481 * Free the frame and any dynamically allocated objects in it,
yading@11 482 * e.g. extended_data. If the frame is reference counted, it will be
yading@11 483 * unreferenced first.
yading@11 484 *
yading@11 485 * @param frame frame to be freed. The pointer will be set to NULL.
yading@11 486 */
yading@11 487 void av_frame_free(AVFrame **frame);
yading@11 488
yading@11 489 /**
yading@11 490 * Setup a new reference to the data described by an given frame.
yading@11 491 *
yading@11 492 * Copy frame properties from src to dst and create a new reference for each
yading@11 493 * AVBufferRef from src.
yading@11 494 *
yading@11 495 * If src is not reference counted, new buffers are allocated and the data is
yading@11 496 * copied.
yading@11 497 *
yading@11 498 * @return 0 on success, a negative AVERROR on error
yading@11 499 */
yading@11 500 int av_frame_ref(AVFrame *dst, AVFrame *src);
yading@11 501
yading@11 502 /**
yading@11 503 * Create a new frame that references the same data as src.
yading@11 504 *
yading@11 505 * This is a shortcut for av_frame_alloc()+av_frame_ref().
yading@11 506 *
yading@11 507 * @return newly created AVFrame on success, NULL on error.
yading@11 508 */
yading@11 509 AVFrame *av_frame_clone(AVFrame *src);
yading@11 510
yading@11 511 /**
yading@11 512 * Unreference all the buffers referenced by frame and reset the frame fields.
yading@11 513 */
yading@11 514 void av_frame_unref(AVFrame *frame);
yading@11 515
yading@11 516 /**
yading@11 517 * Move everythnig contained in src to dst and reset src.
yading@11 518 */
yading@11 519 void av_frame_move_ref(AVFrame *dst, AVFrame *src);
yading@11 520
yading@11 521 /**
yading@11 522 * Allocate new buffer(s) for audio or video data.
yading@11 523 *
yading@11 524 * The following fields must be set on frame before calling this function:
yading@11 525 * - format (pixel format for video, sample format for audio)
yading@11 526 * - width and height for video
yading@11 527 * - nb_samples and channel_layout for audio
yading@11 528 *
yading@11 529 * This function will fill AVFrame.data and AVFrame.buf arrays and, if
yading@11 530 * necessary, allocate and fill AVFrame.extended_data and AVFrame.extended_buf.
yading@11 531 * For planar formats, one buffer will be allocated for each plane.
yading@11 532 *
yading@11 533 * @param frame frame in which to store the new buffers.
yading@11 534 * @param align required buffer size alignment
yading@11 535 *
yading@11 536 * @return 0 on success, a negative AVERROR on error.
yading@11 537 */
yading@11 538 int av_frame_get_buffer(AVFrame *frame, int align);
yading@11 539
yading@11 540 /**
yading@11 541 * Check if the frame data is writable.
yading@11 542 *
yading@11 543 * @return A positive value if the frame data is writable (which is true if and
yading@11 544 * only if each of the underlying buffers has only one reference, namely the one
yading@11 545 * stored in this frame). Return 0 otherwise.
yading@11 546 *
yading@11 547 * If 1 is returned the answer is valid until av_buffer_ref() is called on any
yading@11 548 * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
yading@11 549 *
yading@11 550 * @see av_frame_make_writable(), av_buffer_is_writable()
yading@11 551 */
yading@11 552 int av_frame_is_writable(AVFrame *frame);
yading@11 553
yading@11 554 /**
yading@11 555 * Ensure that the frame data is writable, avoiding data copy if possible.
yading@11 556 *
yading@11 557 * Do nothing if the frame is writable, allocate new buffers and copy the data
yading@11 558 * if it is not.
yading@11 559 *
yading@11 560 * @return 0 on success, a negative AVERROR on error.
yading@11 561 *
yading@11 562 * @see av_frame_is_writable(), av_buffer_is_writable(),
yading@11 563 * av_buffer_make_writable()
yading@11 564 */
yading@11 565 int av_frame_make_writable(AVFrame *frame);
yading@11 566
yading@11 567 /**
yading@11 568 * Copy only "metadata" fields from src to dst.
yading@11 569 *
yading@11 570 * Metadata for the purpose of this function are those fields that do not affect
yading@11 571 * the data layout in the buffers. E.g. pts, sample rate (for audio) or sample
yading@11 572 * aspect ratio (for video), but not width/height or channel layout.
yading@11 573 * Side data is also copied.
yading@11 574 */
yading@11 575 int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
yading@11 576
yading@11 577 /**
yading@11 578 * Get the buffer reference a given data plane is stored in.
yading@11 579 *
yading@11 580 * @param plane index of the data plane of interest in frame->extended_data.
yading@11 581 *
yading@11 582 * @return the buffer reference that contains the plane or NULL if the input
yading@11 583 * frame is not valid.
yading@11 584 */
yading@11 585 AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
yading@11 586
yading@11 587 /**
yading@11 588 * Add a new side data to a frame.
yading@11 589 *
yading@11 590 * @param frame a frame to which the side data should be added
yading@11 591 * @param type type of the added side data
yading@11 592 * @param size size of the side data
yading@11 593 *
yading@11 594 * @return newly added side data on success, NULL on error
yading@11 595 */
yading@11 596 AVFrameSideData *av_frame_new_side_data(AVFrame *frame,
yading@11 597 enum AVFrameSideDataType type,
yading@11 598 int size);
yading@11 599
yading@11 600 /**
yading@11 601 * @return a pointer to the side data of a given type on success, NULL if there
yading@11 602 * is no side data with such type in this frame.
yading@11 603 */
yading@11 604 AVFrameSideData *av_frame_get_side_data(AVFrame *frame,
yading@11 605 enum AVFrameSideDataType type);
yading@11 606
yading@11 607 #endif /* AVUTIL_FRAME_H */