FFmpeg
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
avcodec.c
Go to the documentation of this file.
1 /*
2  * Copyright 2011 Stefano Sabatini | stefasab at gmail.com
3  *
4  * This file is part of FFmpeg.
5  *
6  * FFmpeg is free software; you can redistribute it and/or
7  * modify it under the terms of the GNU Lesser General Public
8  * License as published by the Free Software Foundation; either
9  * version 2.1 of the License, or (at your option) any later version.
10  *
11  * FFmpeg is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14  * Lesser General Public License for more details.
15  *
16  * You should have received a copy of the GNU Lesser General Public
17  * License along with FFmpeg; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
19  */
20 
21 /**
22  * @file
23  * libavcodec/libavfilter gluing utilities
24  */
25 
26 #include "avcodec.h"
27 #include "libavutil/avassert.h"
29 #include "libavutil/opt.h"
30 
31 #if FF_API_AVFILTERBUFFER
33 AVFilterBufferRef *avfilter_get_video_buffer_ref_from_frame(const AVFrame *frame,
34  int perms)
35 {
36  AVFilterBufferRef *picref =
38  frame->width, frame->height,
39  frame->format);
40  if (!picref)
41  return NULL;
42  if (avfilter_copy_frame_props(picref, frame) < 0) {
43  picref->buf->data[0] = NULL;
44  avfilter_unref_bufferp(&picref);
45  }
46  return picref;
47 }
48 
49 AVFilterBufferRef *avfilter_get_audio_buffer_ref_from_frame(const AVFrame *frame,
50  int perms)
51 {
52  AVFilterBufferRef *samplesref;
53  int channels = av_frame_get_channels(frame);
54  int64_t layout = av_frame_get_channel_layout(frame);
55 
56  if (layout && av_get_channel_layout_nb_channels(layout) != av_frame_get_channels(frame)) {
57  av_log(NULL, AV_LOG_ERROR, "Layout indicates a different number of channels than actually present\n");
58  return NULL;
59  }
60 
61  samplesref = avfilter_get_audio_buffer_ref_from_arrays_channels(
62  (uint8_t **)frame->extended_data, frame->linesize[0], perms,
63  frame->nb_samples, frame->format, channels, layout);
64  if (!samplesref)
65  return NULL;
66  if (avfilter_copy_frame_props(samplesref, frame) < 0) {
67  samplesref->buf->data[0] = NULL;
68  avfilter_unref_bufferp(&samplesref);
69  }
70  return samplesref;
71 }
72 
73 AVFilterBufferRef *avfilter_get_buffer_ref_from_frame(enum AVMediaType type,
74  const AVFrame *frame,
75  int perms)
76 {
77  switch (type) {
78  case AVMEDIA_TYPE_VIDEO:
79  return avfilter_get_video_buffer_ref_from_frame(frame, perms);
80  case AVMEDIA_TYPE_AUDIO:
81  return avfilter_get_audio_buffer_ref_from_frame(frame, perms);
82  default:
83  return NULL;
84  }
85 }
86 
87 int avfilter_copy_buf_props(AVFrame *dst, const AVFilterBufferRef *src)
88 {
89  int planes, nb_channels;
90 
91  if (!dst)
92  return AVERROR(EINVAL);
93  /* abort in case the src is NULL and dst is not, avoid inconsistent state in dst */
94  av_assert0(src);
95 
96  memcpy(dst->data, src->data, sizeof(dst->data));
97  memcpy(dst->linesize, src->linesize, sizeof(dst->linesize));
98 
99  dst->pts = src->pts;
100  dst->format = src->format;
101  av_frame_set_pkt_pos(dst, src->pos);
102 
103  switch (src->type) {
104  case AVMEDIA_TYPE_VIDEO:
105  av_assert0(src->video);
106  dst->width = src->video->w;
107  dst->height = src->video->h;
108  dst->sample_aspect_ratio = src->video->sample_aspect_ratio;
109  dst->interlaced_frame = src->video->interlaced;
110  dst->top_field_first = src->video->top_field_first;
111  dst->key_frame = src->video->key_frame;
112  dst->pict_type = src->video->pict_type;
113  break;
114  case AVMEDIA_TYPE_AUDIO:
115  av_assert0(src->audio);
116  nb_channels = av_get_channel_layout_nb_channels(src->audio->channel_layout);
117  planes = av_sample_fmt_is_planar(src->format) ? nb_channels : 1;
118 
119  if (planes > FF_ARRAY_ELEMS(dst->data)) {
120  dst->extended_data = av_mallocz_array(planes, sizeof(*dst->extended_data));
121  if (!dst->extended_data)
122  return AVERROR(ENOMEM);
123  memcpy(dst->extended_data, src->extended_data,
124  planes * sizeof(*dst->extended_data));
125  } else
126  dst->extended_data = dst->data;
127  dst->nb_samples = src->audio->nb_samples;
128  av_frame_set_sample_rate (dst, src->audio->sample_rate);
130  av_frame_set_channels (dst, src->audio->channels);
131  break;
132  default:
133  return AVERROR(EINVAL);
134  }
135 
136  return 0;
137 }
139 #endif
void av_frame_set_channels(AVFrame *frame, int val)
#define NULL
Definition: coverity.c:32
This structure describes decoded (raw) audio or video data.
Definition: frame.h:171
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
Definition: avassert.h:37
uint8_t
AVOptions.
libavcodec/libavfilter gluing utilities
int64_t pts
Presentation timestamp in time_base units (time when frame should be shown to user).
Definition: frame.h:257
static AVFrame * frame
int interlaced_frame
The content of the picture is interlaced.
Definition: frame.h:367
#define av_log(a,...)
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:110
void av_frame_set_channel_layout(AVFrame *frame, int64_t val)
int width
width and height of the video frame
Definition: frame.h:220
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:176
#define AVERROR(e)
Definition: error.h:43
simple assert() macros that are a bit more flexible than ISO C assert().
uint64_t channel_layout
Channel layout of the audio data.
Definition: frame.h:427
int channels
number of audio channels, only used for audio.
Definition: frame.h:565
audio channel layout utility functions
enum AVPictureType pict_type
Picture type of the frame.
Definition: frame.h:242
void av_frame_set_pkt_pos(AVFrame *frame, int64_t val)
#define FF_ARRAY_ELEMS(a)
int format
format of the frame, -1 if unknown or unset Values correspond to enum AVPixelFormat for video frames...
Definition: frame.h:232
AVS_Value src
Definition: avisynth_c.h:482
int linesize[AV_NUM_DATA_POINTERS]
For video, size in bytes of each picture line.
Definition: frame.h:199
AVRational sample_aspect_ratio
Sample aspect ratio for the video frame, 0/1 if unknown/unspecified.
Definition: frame.h:252
GLint GLenum type
Definition: opengl_enc.c:105
int sample_rate
Sample rate of the audio data.
Definition: frame.h:422
int av_frame_get_channels(const AVFrame *frame)
AVFilterBufferRef * avfilter_get_video_buffer_ref_from_arrays(uint8_t *const data[4], const int linesize[4], int perms, int w, int h, enum AVPixelFormat format)
Definition: video.c:64
AVMediaType
Definition: avutil.h:191
int64_t av_frame_get_channel_layout(const AVFrame *frame)
uint8_t * data[AV_NUM_DATA_POINTERS]
pointer to the picture/channel planes.
Definition: frame.h:182
#define FF_DISABLE_DEPRECATION_WARNINGS
Definition: internal.h:79
#define FF_ENABLE_DEPRECATION_WARNINGS
Definition: internal.h:80
int top_field_first
If the content is interlaced, is top field displayed first.
Definition: frame.h:372
int key_frame
1 -> keyframe, 0-> not
Definition: frame.h:237
void av_frame_set_sample_rate(AVFrame *frame, int val)
uint64_t layout
static void * av_mallocz_array(size_t nmemb, size_t size)
Definition: mem.h:228
int height
Definition: frame.h:220
int nb_channels
uint8_t ** extended_data
pointers to the data planes/channels.
Definition: frame.h:215
int nb_samples
number of audio samples (per channel) described by this frame
Definition: frame.h:225