2 * Copyright (c) Stefano Sabatini | stefasab at gmail.com
3 * Copyright (c) S.N. Hemanth Meenakshisundaram | smeenaks at ucsd.edu
5 * This file is part of FFmpeg.
7 * FFmpeg is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * FFmpeg is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with FFmpeg; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
22 #include "libavutil/avassert.h"
23 #include "libavutil/channel_layout.h"
24 #include "libavutil/common.h"
25 #include "libavcodec/avcodec.h"
31 int avfilter_ref_get_channels(AVFilterBufferRef
*ref
)
33 return ref
->audio
? ref
->audio
->channels
: 0;
36 AVFrame
*ff_null_get_audio_buffer(AVFilterLink
*link
, int nb_samples
)
38 return ff_get_audio_buffer(link
->dst
->outputs
[0], nb_samples
);
41 AVFrame
*ff_default_get_audio_buffer(AVFilterLink
*link
, int nb_samples
)
43 AVFrame
*frame
= av_frame_alloc();
44 int channels
= link
->channels
;
47 av_assert0(channels
== av_get_channel_layout_nb_channels(link
->channel_layout
) || !av_get_channel_layout_nb_channels(link
->channel_layout
));
52 frame
->nb_samples
= nb_samples
;
53 frame
->format
= link
->format
;
54 av_frame_set_channels(frame
, link
->channels
);
55 frame
->channel_layout
= link
->channel_layout
;
56 frame
->sample_rate
= link
->sample_rate
;
57 ret
= av_frame_get_buffer(frame
, 0);
59 av_frame_free(&frame
);
63 av_samples_set_silence(frame
->extended_data
, 0, nb_samples
, channels
,
70 AVFrame
*ff_get_audio_buffer(AVFilterLink
*link
, int nb_samples
)
74 if (link
->dstpad
->get_audio_buffer
)
75 ret
= link
->dstpad
->get_audio_buffer(link
, nb_samples
);
78 ret
= ff_default_get_audio_buffer(link
, nb_samples
);
83 #if FF_API_AVFILTERBUFFER
84 AVFilterBufferRef
* avfilter_get_audio_buffer_ref_from_arrays_channels(uint8_t **data
,
85 int linesize
,int perms
,
87 enum AVSampleFormat sample_fmt
,
89 uint64_t channel_layout
)
92 AVFilterBuffer
*samples
= av_mallocz(sizeof(*samples
));
93 AVFilterBufferRef
*samplesref
= av_mallocz(sizeof(*samplesref
));
95 if (!samples
|| !samplesref
)
99 av_assert0(channel_layout
== 0 ||
100 channels
== av_get_channel_layout_nb_channels(channel_layout
));
102 samplesref
->buf
= samples
;
103 samplesref
->buf
->free
= ff_avfilter_default_free_buffer
;
104 if (!(samplesref
->audio
= av_mallocz(sizeof(*samplesref
->audio
))))
107 samplesref
->audio
->nb_samples
= nb_samples
;
108 samplesref
->audio
->channel_layout
= channel_layout
;
109 samplesref
->audio
->channels
= channels
;
111 planes
= av_sample_fmt_is_planar(sample_fmt
) ? channels
: 1;
113 /* make sure the buffer gets read permission or it's useless for output */
114 samplesref
->perms
= perms
| AV_PERM_READ
;
116 samples
->refcount
= 1;
117 samplesref
->type
= AVMEDIA_TYPE_AUDIO
;
118 samplesref
->format
= sample_fmt
;
120 memcpy(samples
->data
, data
,
121 FFMIN(FF_ARRAY_ELEMS(samples
->data
), planes
)*sizeof(samples
->data
[0]));
122 memcpy(samplesref
->data
, samples
->data
, sizeof(samples
->data
));
124 samples
->linesize
[0] = samplesref
->linesize
[0] = linesize
;
126 if (planes
> FF_ARRAY_ELEMS(samples
->data
)) {
127 samples
-> extended_data
= av_mallocz_array(sizeof(*samples
->extended_data
),
129 samplesref
->extended_data
= av_mallocz_array(sizeof(*samplesref
->extended_data
),
132 if (!samples
->extended_data
|| !samplesref
->extended_data
)
135 memcpy(samples
-> extended_data
, data
, sizeof(*data
)*planes
);
136 memcpy(samplesref
->extended_data
, data
, sizeof(*data
)*planes
);
138 samples
->extended_data
= samples
->data
;
139 samplesref
->extended_data
= samplesref
->data
;
142 samplesref
->pts
= AV_NOPTS_VALUE
;
147 if (samples
&& samples
->extended_data
!= samples
->data
)
148 av_freep(&samples
->extended_data
);
150 av_freep(&samplesref
->audio
);
151 if (samplesref
->extended_data
!= samplesref
->data
)
152 av_freep(&samplesref
->extended_data
);
154 av_freep(&samplesref
);
159 AVFilterBufferRef
* avfilter_get_audio_buffer_ref_from_arrays(uint8_t **data
,
160 int linesize
,int perms
,
162 enum AVSampleFormat sample_fmt
,
163 uint64_t channel_layout
)
165 int channels
= av_get_channel_layout_nb_channels(channel_layout
);
166 return avfilter_get_audio_buffer_ref_from_arrays_channels(data
, linesize
, perms
,
167 nb_samples
, sample_fmt
,
168 channels
, channel_layout
);