---
libavcodec/avcodec.h | 369 +-----------------------------------
libavutil/Makefile | 1 +
libavutil/frame.c | 342 +++++++++++++++++++++++++++++++++
libavutil/frame.h | 514 ++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 858 insertions(+), 368 deletions(-)
create mode 100644 libavutil/frame.c
create mode 100644 libavutil/frame.h
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 149364b..40626a0 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -31,6 +31,7 @@
#include "libavutil/avutil.h"
#include "libavutil/cpu.h"
#include "libavutil/dict.h"
+#include "libavutil/frame.h"
#include "libavutil/log.h"
#include "libavutil/pixfmt.h"
#include "libavutil/rational.h"
@@ -780,35 +781,6 @@ typedef struct RcOverride{
#define MB_TYPE_CBP 0x00020000
//Note bits 24-31 are reserved for codec specific use (h264 ref0, mpeg1 0mv,
...)
-/**
- * Pan Scan area.
- * This specifies the area which should be displayed.
- * Note there may be multiple such areas for one frame.
- */
-typedef struct AVPanScan{
- /**
- * id
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int id;
-
- /**
- * width and height in 1/16 pel
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int width;
- int height;
-
- /**
- * position of the top left corner in 1/16 pel for up to 3 fields/frames
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int16_t position[3][2];
-}AVPanScan;
-
#define FF_QSCALE_TYPE_MPEG1 0
#define FF_QSCALE_TYPE_MPEG2 1
#define FF_QSCALE_TYPE_H264 2
@@ -982,345 +954,6 @@ enum AVSideDataParamChangeFlags {
* @}
*/
-/**
- * Audio Video Frame.
- * New fields can be added to the end of AVFRAME with minor version
- * bumps. Removal, reordering and changes to existing fields require
- * a major version bump.
- * sizeof(AVFrame) must not be used outside libav*.
- */
-typedef struct AVFrame {
-#define AV_NUM_DATA_POINTERS 8
- /**
- * pointer to the picture/channel planes.
- * This might be different from the first allocated byte
- * - encoding: Set by user
- * - decoding: set by AVCodecContext.get_buffer()
- */
- uint8_t *data[AV_NUM_DATA_POINTERS];
-
- /**
- * Size, in bytes, of the data for each picture/channel plane.
- *
- * For audio, only linesize[0] may be set. For planar audio, each channel
- * plane must be the same size.
- *
- * - encoding: Set by user
- * - decoding: set by AVCodecContext.get_buffer()
- */
- int linesize[AV_NUM_DATA_POINTERS];
-
- /**
- * pointers to the data planes/channels.
- *
- * For video, this should simply point to data[].
- *
- * For planar audio, each channel has a separate data pointer, and
- * linesize[0] contains the size of each channel buffer.
- * For packed audio, there is just one data pointer, and linesize[0]
- * contains the total size of the buffer for all channels.
- *
- * Note: Both data and extended_data will always be set by get_buffer(),
- * but for planar audio with more channels that can fit in data,
- * extended_data must be used by the decoder in order to access all
- * channels.
- *
- * encoding: set by user
- * decoding: set by AVCodecContext.get_buffer()
- */
- uint8_t **extended_data;
-
- /**
- * width and height of the video frame
- * - encoding: unused
- * - decoding: Read by user.
- */
- int width, height;
-
- /**
- * number of audio samples (per channel) described by this frame
- * - encoding: Set by user
- * - decoding: Set by libavcodec
- */
- int nb_samples;
-
- /**
- * format of the frame, -1 if unknown or unset
- * Values correspond to enum AVPixelFormat for video frames,
- * enum AVSampleFormat for audio)
- * - encoding: unused
- * - decoding: Read by user.
- */
- int format;
-
- /**
- * 1 -> keyframe, 0-> not
- * - encoding: Set by libavcodec.
- * - decoding: Set by libavcodec.
- */
- int key_frame;
-
- /**
- * Picture type of the frame, see ?_TYPE below.
- * - encoding: Set by libavcodec. for coded_picture (and set by user for
input).
- * - decoding: Set by libavcodec.
- */
- enum AVPictureType pict_type;
-
- /**
- * pointer to the first allocated byte of the picture. Can be used in
get_buffer/release_buffer.
- * This isn't used by libavcodec unless the default get/release_buffer()
is used.
- * - encoding:
- * - decoding:
- */
- uint8_t *base[AV_NUM_DATA_POINTERS];
-
- /**
- * sample aspect ratio for the video frame, 0/1 if unknown/unspecified
- * - encoding: unused
- * - decoding: Read by user.
- */
- AVRational sample_aspect_ratio;
-
- /**
- * presentation timestamp in time_base units (time when frame should be
shown to user)
- * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
- * - encoding: MUST be set by user.
- * - decoding: Set by libavcodec.
- */
- int64_t pts;
-
- /**
- * reordered pts from the last AVPacket that has been input into the
decoder
- * - encoding: unused
- * - decoding: Read by user.
- */
- int64_t pkt_pts;
-
- /**
- * dts from the last AVPacket that has been input into the decoder
- * - encoding: unused
- * - decoding: Read by user.
- */
- int64_t pkt_dts;
-
- /**
- * picture number in bitstream order
- * - encoding: set by
- * - decoding: Set by libavcodec.
- */
- int coded_picture_number;
- /**
- * picture number in display order
- * - encoding: set by
- * - decoding: Set by libavcodec.
- */
- int display_picture_number;
-
- /**
- * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
- * - encoding: Set by libavcodec. for coded_picture (and set by user for
input).
- * - decoding: Set by libavcodec.
- */
- int quality;
-
- /**
- * is this picture used as reference
- * The values for this are the same as the MpegEncContext.picture_structure
- * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
- * Set to 4 for delayed, non-reference frames.
- * - encoding: unused
- * - decoding: Set by libavcodec. (before get_buffer() call)).
- */
- int reference;
-
- /**
- * QP table
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- int8_t *qscale_table;
- /**
- * QP store stride
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- int qstride;
-
- /**
- *
- */
- int qscale_type;
-
- /**
- * mbskip_table[mb]>=1 if MB didn't change
- * stride= mb_width = (width+15)>>4
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- uint8_t *mbskip_table;
-
- /**
- * motion vector table
- * @code
- * example:
- * int mv_sample_log2= 4 - motion_subsample_log2;
- * int mb_width= (width+15)>>4;
- * int mv_stride= (mb_width << mv_sample_log2) + 1;
- * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
- * @endcode
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int16_t (*motion_val[2])[2];
-
- /**
- * macroblock type table
- * mb_type_base + mb_width + 2
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- uint32_t *mb_type;
-
- /**
- * DCT coefficients
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- short *dct_coeff;
-
- /**
- * motion reference frame index
- * the order in which these are stored can depend on the codec.
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int8_t *ref_index[2];
-
- /**
- * for some private data of the user
- * - encoding: unused
- * - decoding: Set by user.
- */
- void *opaque;
-
- /**
- * error
- * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
- * - decoding: unused
- */
- uint64_t error[AV_NUM_DATA_POINTERS];
-
- /**
- * type of the buffer (to keep track of who has to deallocate data[*])
- * - encoding: Set by the one who allocates it.
- * - decoding: Set by the one who allocates it.
- * Note: User allocated (direct rendering) & internal buffers cannot
coexist currently.
- */
- int type;
-
- /**
- * When decoding, this signals how much the picture must be delayed.
- * extra_delay = repeat_pict / (2*fps)
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- int repeat_pict;
-
- /**
- * The content of the picture is interlaced.
- * - encoding: Set by user.
- * - decoding: Set by libavcodec. (default 0)
- */
- int interlaced_frame;
-
- /**
- * If the content is interlaced, is top field displayed first.
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- int top_field_first;
-
- /**
- * Tell user application that palette has changed from previous frame.
- * - encoding: ??? (no palette-enabled encoder yet)
- * - decoding: Set by libavcodec. (default 0).
- */
- int palette_has_changed;
-
- /**
- * codec suggestion on buffer type if != 0
- * - encoding: unused
- * - decoding: Set by libavcodec. (before get_buffer() call)).
- */
- int buffer_hints;
-
- /**
- * Pan scan.
- * - encoding: Set by user.
- * - decoding: Set by libavcodec.
- */
- AVPanScan *pan_scan;
-
- /**
- * reordered opaque 64bit (generally an integer or a double precision float
- * PTS but can be anything).
- * The user sets AVCodecContext.reordered_opaque to represent the input at
- * that time,
- * the decoder reorders values as needed and sets AVFrame.reordered_opaque
- * to exactly one of the values provided by the user through
AVCodecContext.reordered_opaque
- * @deprecated in favor of pkt_pts
- * - encoding: unused
- * - decoding: Read by user.
- */
- int64_t reordered_opaque;
-
-#if FF_API_AVFRAME_LAVC
- /**
- * @deprecated this field is unused
- */
- attribute_deprecated void *hwaccel_picture_private;
-#endif
-
- /**
- * the AVCodecContext which ff_thread_get_buffer() was last called on
- * - encoding: Set by libavcodec.
- * - decoding: Set by libavcodec.
- */
- struct AVCodecContext *owner;
-
- /**
- * used by multithreading to store frame-specific info
- * - encoding: Set by libavcodec.
- * - decoding: Set by libavcodec.
- */
- void *thread_opaque;
-
- /**
- * log2 of the size of the block which a single vector in motion_val
represents:
- * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
- * - encoding: unused
- * - decoding: Set by libavcodec.
- */
- uint8_t motion_subsample_log2;
-
- /**
- * Sample rate of the audio data.
- *
- * - encoding: unused
- * - decoding: set by get_buffer()
- */
- int sample_rate;
-
- /**
- * Channel layout of the audio data.
- *
- * - encoding: unused
- * - decoding: set by get_buffer()
- */
- uint64_t channel_layout;
-} AVFrame;
-
struct AVCodecInternal;
enum AVFieldOrder {
diff --git a/libavutil/Makefile b/libavutil/Makefile
index f9e3794..b4b32fc 100644
--- a/libavutil/Makefile
+++ b/libavutil/Makefile
@@ -68,6 +68,7 @@ OBJS = adler32.o
\
fifo.o \
file.o \
float_dsp.o \
+ frame.o \
imgutils.o \
intfloat_readwrite.o \
intmath.o \
diff --git a/libavutil/frame.c b/libavutil/frame.c
new file mode 100644
index 0000000..79e70e9
--- /dev/null
+++ b/libavutil/frame.c
@@ -0,0 +1,342 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#include "audioconvert.h"
+#include "buffer.h"
+#include "common.h"
+#include "frame.h"
+#include "imgutils.h"
+#include "mem.h"
+#include "samplefmt.h"
+
+void av_get_frame_defaults(AVFrame *frame)
+{
+ if (frame->extended_data != frame->data)
+ av_freep(&frame->extended_data);
+
+ memset(frame, 0, sizeof(*frame));
+
+ frame->pts = AV_NOPTS_VALUE;
+ frame->key_frame = 1;
+ frame->sample_aspect_ratio = (AVRational) {0, 1 };
+ frame->format = -1; /* unknown */
+ frame->extended_data = frame->data;
+}
+
+AVFrame *av_frame_alloc(void)
+{
+ AVFrame *frame = av_mallocz(sizeof(AVFrame));
+
+ if (frame == NULL)
+ return NULL;
+
+ av_get_frame_defaults(frame);
+
+ return frame;
+}
+
+void av_frame_free(AVFrame **frame)
+{
+ if (!frame || !*frame)
+ return;
+
+ av_frame_unref(*frame);
+ av_freep(frame);
+}
+
+int av_frame_set_audio_buffer(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t
*buf,
+ int buf_size, int align)
+{
+ int ch, planar, needed_size, ret = 0;
+
+ needed_size = av_samples_get_buffer_size(NULL, nb_channels,
+ frame->nb_samples, sample_fmt,
+ align);
+ if (buf_size < needed_size)
+ return AVERROR(EINVAL);
+
+ planar = av_sample_fmt_is_planar(sample_fmt);
+ if (planar && nb_channels > AV_NUM_DATA_POINTERS) {
+ if (!(frame->extended_data = av_mallocz(nb_channels *
+
sizeof(*frame->extended_data))))
+ return AVERROR(ENOMEM);
+ } else {
+ frame->extended_data = frame->data;
+ }
+
+ if ((ret = av_samples_fill_arrays(frame->extended_data,
&frame->linesize[0],
+ buf, nb_channels, frame->nb_samples,
+ sample_fmt, align)) < 0) {
+ if (frame->extended_data != frame->data)
+ av_free(frame->extended_data);
+ return ret;
+ }
+ if (frame->extended_data != frame->data) {
+ for (ch = 0; ch < AV_NUM_DATA_POINTERS; ch++)
+ frame->data[ch] = frame->extended_data[ch];
+ }
+
+ return ret;
+}
+
+
+static int dup_audio_frame(AVFrame *dst, AVFrame *src)
+{
+ int ch = av_get_channel_layout_nb_channels(src->channel_layout);
+ int buf_size, ret;
+
+ *dst = *src;
+
+ buf_size = av_samples_get_buffer_size(NULL, ch, src->nb_samples,
src->format, 0);
+ if (buf_size < 0)
+ return buf_size;
+
+ dst->buf[0] = av_buffer_alloc(buf_size);
+ if (!dst->buf[0])
+ return AVERROR(ENOMEM);
+
+ ret = av_frame_set_audio_buffer(dst, ch, src->format, dst->buf[0]->data,
+ buf_size, 0);
+ if (ret < 0) {
+ av_buffer_unref(&dst->buf[0]);
+ return AVERROR(ENOMEM);
+ }
+
+ av_samples_copy(dst->extended_data, src->extended_data, 0, 0,
+ dst->nb_samples, ch, dst->format);
+
+ return 0;
+}
+
+static int dup_video_frame(AVFrame *dst, AVFrame *src)
+{
+ int buf_size;;
+
+ *dst = *src;
+ dst->extended_data = dst->data;
+
+ buf_size = av_image_alloc(dst->data, dst->linesize, dst->width,
dst->height,
+ dst->format, 16);
+ if (buf_size < 0)
+ return buf_size;
+
+ dst->buf[0] = av_buffer_create(dst->data[0], buf_size,
+ av_buffer_default_free, NULL);
+ if (!dst->buf[0]) {
+ av_freep(&dst->data[0]);
+ return AVERROR(ENOMEM);
+ }
+
+ av_image_copy(dst->data, dst->linesize, src->data, src->linesize,
+ dst->format, dst->width, dst->height);
+
+ return 0;
+}
+
+int av_frame_ref(AVFrame *dst, AVFrame *src)
+{
+ AVBufferRef *buf[AV_NUM_DATA_POINTERS] = { NULL }, **extended_buf = NULL;
+ uint8_t **extended_data = NULL;
+ int i, ret = 0;
+
+ /* duplicate the frame data if it's not refcounted */
+ if (!src->buf[0]) {
+ if (src->nb_samples)
+ return dup_audio_frame(dst, src);
+ else
+ return dup_video_frame(dst, src);
+ }
+
+ /* ref the buffers */
+ for (i = 0; i < FF_ARRAY_ELEMS(src->buf) && src->buf[i]; i++) {
+ buf[i] = av_buffer_ref(src->buf[i]);
+ if (!buf[i]) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ }
+
+ if (dst->extended_buf) {
+ extended_buf = av_mallocz(sizeof(*extended_buf) *
src->nb_extended_buf);
+ if (!extended_buf) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+
+ for (i = 0; i < src->nb_extended_buf; i++) {
+ extended_buf[i] = av_buffer_ref(src->extended_buf[i]);
+ if (!extended_buf[i]) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ }
+ }
+
+ /* duplicate extended data */
+ if (src->extended_data != src->data) {
+ int ch = av_get_channel_layout_nb_channels(src->channel_layout);
+
+ if (!ch) {
+ ret = AVERROR(EINVAL);
+ goto fail;
+ }
+
+ extended_data = av_malloc(sizeof(*extended_data) * ch);
+ if (!extended_data) {
+ ret = AVERROR(ENOMEM);
+ goto fail;
+ }
+ memcpy(extended_data, src->extended_data, sizeof(*extended_data) * ch);
+ }
+
+ *dst = *src;
+ memcpy(dst->buf, buf, sizeof(buf));
+ dst->extended_data = extended_data ? extended_data : dst->data;
+ dst->extended_buf = extended_buf;
+
+ return 0;
+
+fail:
+ for (i = 0; i < FF_ARRAY_ELEMS(buf); i++)
+ av_buffer_unref(&buf[i]);
+ if (extended_buf) {
+ for (i = 0; i < src->nb_extended_buf; i++)
+ av_buffer_unref(&extended_buf[i]);
+ }
+ av_freep(&extended_buf);
+ av_freep(&extended_data);
+
+ return ret;
+}
+
+AVFrame *av_frame_clone(AVFrame *src)
+{
+ AVFrame *ret = av_frame_alloc();
+
+ if (!ret)
+ return NULL;
+
+ if (av_frame_ref(ret, src) < 0)
+ av_frame_free(&ret);
+
+ return ret;
+}
+
+void av_frame_unref(AVFrame *frame)
+{
+ int i;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(frame->buf); i++)
+ av_buffer_unref(&frame->buf[i]);
+ for (i = 0; i < frame->nb_extended_buf; i++)
+ av_buffer_unref(&frame->extended_buf[i]);
+ av_freep(&frame->extended_buf);
+ av_get_frame_defaults(frame);
+}
+
+void av_frame_move_ref(AVFrame *dst, AVFrame *src)
+{
+ *dst = *src;
+ if (src->extended_data == src->data)
+ dst->extended_data = dst->data;
+ memset(src, 0, sizeof(*src));
+ av_get_frame_defaults(src);
+}
+
+int av_frame_is_writable(AVFrame *frame)
+{
+ int i, ret = 1;
+
+ /* assume non-refcounted frames are not writable */
+ if (!frame->buf[0])
+ return 0;
+
+ for (i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++)
+ ret &= !!av_buffer_is_writable(frame->buf[i]);
+ for (i = 0; i < frame->nb_extended_buf; i++)
+ ret &= !!av_buffer_is_writable(frame->extended_buf[i]);
+
+ return ret;
+}
+
+int av_frame_make_writable(AVFrame *frame)
+{
+ AVFrame tmp;
+ int ret;
+
+ if (!frame->buf[0])
+ return AVERROR(EINVAL);
+
+ if (av_frame_is_writable(frame))
+ return 0;
+
+ tmp = *frame;
+ if (frame->data == frame->extended_data)
+ tmp.extended_data = tmp.data;
+
+ ret = frame->nb_samples ? dup_audio_frame(frame, &tmp) :
+ dup_video_frame(frame, &tmp);
+
+ av_frame_unref(&tmp);
+
+ return ret;
+}
+
+int av_frame_copy_props(AVFrame *dst, const AVFrame *src)
+{
+ dst->key_frame = src->key_frame;
+ dst->pict_type = src->pict_type;
+ dst->sample_aspect_ratio = src->sample_aspect_ratio;
+ dst->pts = src->pts;
+ dst->interlaced_frame = src->interlaced_frame;
+ dst->top_field_first = src->top_field_first;
+ dst->sample_rate = src->sample_rate;
+
+}
+
+AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane)
+{
+ uint8_t *data;
+ int planes, i;
+
+ if (frame->nb_samples) {
+ int channels =
av_get_channel_layout_nb_channels(frame->channel_layout);
+ if (!channels)
+ return NULL;
+ planes = av_sample_fmt_is_planar(frame->format) ? channels : 1;
+ } else
+ planes = 4;
+
+ if (plane < 0 || plane >= planes || !frame->extended_data[plane])
+ return NULL;
+ data = frame->extended_data[plane];
+
+ for (i = 0; i < FF_ARRAY_ELEMS(frame->buf) && frame->buf[i]; i++) {
+ AVBufferRef *buf = frame->buf[i];
+ if (data >= buf->data && data < buf->data + buf->size)
+ return buf;
+ }
+ for (i = 0; i < frame->nb_extended_buf; i++) {
+ AVBufferRef *buf = frame->extended_buf[i];
+ if (data >= buf->data && data < buf->data + buf->size)
+ return buf;
+ }
+ return NULL;
+}
diff --git a/libavutil/frame.h b/libavutil/frame.h
new file mode 100644
index 0000000..08d63a2
--- /dev/null
+++ b/libavutil/frame.h
@@ -0,0 +1,514 @@
+/*
+ *
+ * This file is part of Libav.
+ *
+ * Libav is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * Libav is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with Libav; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ */
+
+#ifndef AVUTIL_FRAME_H
+#define AVUTIL_FRAME_H
+
+#include <stdint.h>
+
+#include "libavcodec/version.h"
+
+#include "avutil.h"
+#include "buffer.h"
+#include "rational.h"
+#include "samplefmt.h"
+
+/**
+ * Pan Scan area.
+ * This specifies the area which should be displayed.
+ * Note there may be multiple such areas for one frame.
+ */
+typedef struct AVPanScan{
+ /**
+ * id
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int id;
+
+ /**
+ * width and height in 1/16 pel
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int width;
+ int height;
+
+ /**
+ * position of the top left corner in 1/16 pel for up to 3 fields/frames
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t position[3][2];
+}AVPanScan;
+
+
+/**
+ * Audio Video Frame.
+ * New fields can be added to the end of AVFRAME with minor version
+ * bumps. Removal, reordering and changes to existing fields require
+ * a major version bump.
+ * sizeof(AVFrame) must not be used outside libav*.
+ */
+typedef struct AVFrame {
+#define AV_NUM_DATA_POINTERS 8
+ /**
+ * pointer to the picture/channel planes.
+ * This might be different from the first allocated byte
+ * - encoding: Set by user
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t *data[AV_NUM_DATA_POINTERS];
+
+ /**
+ * Size, in bytes, of the data for each picture/channel plane.
+ *
+ * For audio, only linesize[0] may be set. For planar audio, each channel
+ * plane must be the same size.
+ *
+ * - encoding: Set by user
+ * - decoding: set by AVCodecContext.get_buffer()
+ */
+ int linesize[AV_NUM_DATA_POINTERS];
+
+ /**
+ * pointers to the data planes/channels.
+ *
+ * For video, this should simply point to data[].
+ *
+ * For planar audio, each channel has a separate data pointer, and
+ * linesize[0] contains the size of each channel buffer.
+ * For packed audio, there is just one data pointer, and linesize[0]
+ * contains the total size of the buffer for all channels.
+ *
+ * Note: Both data and extended_data will always be set by get_buffer(),
+ * but for planar audio with more channels that can fit in data,
+ * extended_data must be used by the decoder in order to access all
+ * channels.
+ *
+ * encoding: set by user
+ * decoding: set by AVCodecContext.get_buffer()
+ */
+ uint8_t **extended_data;
+
+ /**
+ * width and height of the video frame
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int width, height;
+
+ /**
+ * number of audio samples (per channel) described by this frame
+ * - encoding: Set by user
+ * - decoding: Set by libavcodec
+ */
+ int nb_samples;
+
+ /**
+ * format of the frame, -1 if unknown or unset
+ * Values correspond to enum AVPixelFormat for video frames,
+ * enum AVSampleFormat for audio)
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int format;
+
+ /**
+ * 1 -> keyframe, 0-> not
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ int key_frame;
+
+ /**
+ * Picture type of the frame, see ?_TYPE below.
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for
input).
+ * - decoding: Set by libavcodec.
+ */
+ enum AVPictureType pict_type;
+
+ /**
+ * pointer to the first allocated byte of the picture. Can be used in
get_buffer/release_buffer.
+ * This isn't used by libavcodec unless the default get/release_buffer()
is used.
+ * - encoding:
+ * - decoding:
+ */
+ uint8_t *base[AV_NUM_DATA_POINTERS];
+
+ /**
+ * sample aspect ratio for the video frame, 0/1 if unknown/unspecified
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ AVRational sample_aspect_ratio;
+
+ /**
+ * presentation timestamp in time_base units (time when frame should be
shown to user)
+ * If AV_NOPTS_VALUE then frame_rate = 1/time_base will be assumed.
+ * - encoding: MUST be set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int64_t pts;
+
+ /**
+ * reordered pts from the last AVPacket that has been input into the
decoder
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_pts;
+
+ /**
+ * dts from the last AVPacket that has been input into the decoder
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t pkt_dts;
+
+ /**
+ * picture number in bitstream order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int coded_picture_number;
+ /**
+ * picture number in display order
+ * - encoding: set by
+ * - decoding: Set by libavcodec.
+ */
+ int display_picture_number;
+
+ /**
+ * quality (between 1 (good) and FF_LAMBDA_MAX (bad))
+ * - encoding: Set by libavcodec. for coded_picture (and set by user for
input).
+ * - decoding: Set by libavcodec.
+ */
+ int quality;
+
+ /**
+ * is this picture used as reference
+ * The values for this are the same as the MpegEncContext.picture_structure
+ * variable, that is 1->top field, 2->bottom field, 3->frame/both fields.
+ * Set to 4 for delayed, non-reference frames.
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int reference;
+
+ /**
+ * QP table
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *qscale_table;
+ /**
+ * QP store stride
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int qstride;
+
+ /**
+ *
+ */
+ int qscale_type;
+
+ /**
+ * mbskip_table[mb]>=1 if MB didn't change
+ * stride= mb_width = (width+15)>>4
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t *mbskip_table;
+
+ /**
+ * motion vector table
+ * @code
+ * example:
+ * int mv_sample_log2= 4 - motion_subsample_log2;
+ * int mb_width= (width+15)>>4;
+ * int mv_stride= (mb_width << mv_sample_log2) + 1;
+ * motion_val[direction][x + y*mv_stride][0->mv_x, 1->mv_y];
+ * @endcode
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int16_t (*motion_val[2])[2];
+
+ /**
+ * macroblock type table
+ * mb_type_base + mb_width + 2
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ uint32_t *mb_type;
+
+ /**
+ * DCT coefficients
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ short *dct_coeff;
+
+ /**
+ * motion reference frame index
+ * the order in which these are stored can depend on the codec.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int8_t *ref_index[2];
+
+ /**
+ * for some private data of the user
+ * - encoding: unused
+ * - decoding: Set by user.
+ */
+ void *opaque;
+
+ /**
+ * error
+ * - encoding: Set by libavcodec. if flags&CODEC_FLAG_PSNR.
+ * - decoding: unused
+ */
+ uint64_t error[AV_NUM_DATA_POINTERS];
+
+ /**
+ * type of the buffer (to keep track of who has to deallocate data[*])
+ * - encoding: Set by the one who allocates it.
+ * - decoding: Set by the one who allocates it.
+ * Note: User allocated (direct rendering) & internal buffers cannot
coexist currently.
+ */
+ int type;
+
+ /**
+ * When decoding, this signals how much the picture must be delayed.
+ * extra_delay = repeat_pict / (2*fps)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ int repeat_pict;
+
+ /**
+ * The content of the picture is interlaced.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec. (default 0)
+ */
+ int interlaced_frame;
+
+ /**
+ * If the content is interlaced, is top field displayed first.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ int top_field_first;
+
+ /**
+ * Tell user application that palette has changed from previous frame.
+ * - encoding: ??? (no palette-enabled encoder yet)
+ * - decoding: Set by libavcodec. (default 0).
+ */
+ int palette_has_changed;
+
+ /**
+ * codec suggestion on buffer type if != 0
+ * - encoding: unused
+ * - decoding: Set by libavcodec. (before get_buffer() call)).
+ */
+ int buffer_hints;
+
+ /**
+ * Pan scan.
+ * - encoding: Set by user.
+ * - decoding: Set by libavcodec.
+ */
+ AVPanScan *pan_scan;
+
+ /**
+ * reordered opaque 64bit (generally an integer or a double precision float
+ * PTS but can be anything).
+ * The user sets AVCodecContext.reordered_opaque to represent the input at
+ * that time,
+ * the decoder reorders values as needed and sets AVFrame.reordered_opaque
+ * to exactly one of the values provided by the user through
AVCodecContext.reordered_opaque
+ * @deprecated in favor of pkt_pts
+ * - encoding: unused
+ * - decoding: Read by user.
+ */
+ int64_t reordered_opaque;
+
+#if FF_API_AVFRAME_LAVC
+ /**
+ * @deprecated this field is unused
+ */
+ attribute_deprecated void *hwaccel_picture_private;
+#endif
+
+ /**
+ * the AVCodecContext which ff_thread_get_buffer() was last called on
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ struct AVCodecContext *owner;
+
+ /**
+ * used by multithreading to store frame-specific info
+ * - encoding: Set by libavcodec.
+ * - decoding: Set by libavcodec.
+ */
+ void *thread_opaque;
+
+ /**
+ * log2 of the size of the block which a single vector in motion_val
represents:
+ * (4->16x16, 3->8x8, 2-> 4x4, 1-> 2x2)
+ * - encoding: unused
+ * - decoding: Set by libavcodec.
+ */
+ uint8_t motion_subsample_log2;
+
+ /**
+ * Sample rate of the audio data.
+ *
+ * - encoding: unused
+ * - decoding: set by get_buffer()
+ */
+ int sample_rate;
+
+ /**
+ * Channel layout of the audio data.
+ *
+ * - encoding: unused
+ * - decoding: set by get_buffer()
+ */
+ uint64_t channel_layout;
+
+ /**
+ * AVBuffer references backing the data for this frame. If all elements of
+ * this array are NULL, then this frame is not reference counted.
+ *
+ * There may be at most one AVBuffer per data plane, so for video this
array
+ * always contains all the references. For planar audio with more than
+ * AV_NUM_DATA_POINTERS channels, there may be more buffers than can fit in
+ * this array. Then the extra AVBufferRef pointers are stored in the
+ * extended_buf array.
+ */
+ AVBufferRef *buf[AV_NUM_DATA_POINTERS];
+
+ /**
+ * For planar audio which requires more than AV_NUM_DATA_POINTERS
+ * AVBufferRef pointers, this array will hold all the references which
+ * cannot fit into AVFrame.buf.
+ *
+ * Note that this is different from AVFrame.extended_data, which always
+ * contains all the pointers. This array only contains the extra pointers,
+ * which cannot fit into AVFrame.buf.
+ *
+ * This array is always allocated using av_malloc() by whoever constructs
+ * the frame. It is freed in av_frame_unref().
+ */
+ AVBufferRef **extended_buf;
+ /**
+ * Number of elements in extended_buf.
+ */
+ int nb_extended_buf;
+} AVFrame;
+
+/**
+ * Allocate an AVFrame and set its fields to default values. The resulting
+ * struct must be freed using av_frame_free().
+ *
+ * @return An AVFrame filled with default values or NULL on failure.
+ */
+AVFrame *av_frame_alloc(void);
+
+/**
+ * Set the fields of the given AVFrame to default values.
+ *
+ * @param frame The AVFrame of which the fields should be set to default
values.
+ */
+void av_get_frame_defaults(AVFrame *frame);
+
+/**
+ * Free the frame and any dynamically allocated objects in it,
+ * e.g. extended_data.
+ *
+ * @param frame frame to be freed. The pointer will be set to NULL.
+ */
+void av_frame_free(AVFrame **frame);
+
+int av_frame_set_audio_buffer(AVFrame *frame, int nb_channels,
+ enum AVSampleFormat sample_fmt, const uint8_t
*buf,
+ int buf_size, int align);
+
+/**
+ * Copy frame properties from src to dst and create a new reference for each
+ * AVBufferRef from src.
+ *
+ * If src is not reference counted, new buffers are allocated and the data is
+ * copied.
+ *
+ * @return 0 on success, a negative AVERROR on error
+ */
+int av_frame_ref(AVFrame *dst, AVFrame *src);
+
+/**
+ * Create a new frame that references the same data as src.
+ *
+ * This is a shortcut for av_frame_alloc()+av_frame_ref().
+ */
+AVFrame *av_frame_clone(AVFrame *src);
+
+/**
+ * Unreference all the buffers referenced by frame and reset the frame.
+ */
+void av_frame_unref(AVFrame *frame);
+
+void av_frame_move_ref(AVFrame *dst, AVFrame *src);
+
+/**
+ * Check if the frame data is writable.
+ *
+ * @return A positive value if the frame data is writable (which is true IFF
+ * each of the underlying buffers has only one reference, namely the one stored
+ * in this frame). Return 0 otherwise.
+ *
+ * If 1 is returned the answer is valid until av_buffer_ref() is called on any
+ * of the underlying AVBufferRefs (e.g. through av_frame_ref() or directly).
+ *
+ * @see av_frame_make_writable(), av_buffer_is_writable()
+ */
+int av_frame_is_writable(AVFrame *frame);
+
+/**
+ * Ensure that the frame data is writable, avoiding data copy if possible.
+ *
+ * Do nothing if the frame is writable, allocate new buffers and copy the data
+ * if it is not.
+ *
+ * @return 0 on success, a negative AVERROR on error.
+ *
+ * @see av_frame_is_writable(), av_buffer_is_writable(),
+ * av_buffer_make_writable()
+ */
+int av_frame_make_writable(AVFrame *frame);
+
+int av_frame_copy_props(AVFrame *dst, const AVFrame *src);
+
+AVBufferRef *av_frame_get_plane_buffer(AVFrame *frame, int plane);
+
+#endif /* AVUTIL_FRAME_H */
--
1.7.10.4
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel