41 for (p = 0; p <
a->planes; p++) {
43 while ((intptr_t)
a->data[p] % cur_align)
45 if (cur_align < min_align)
46 min_align = cur_align;
48 a->ptr_align = min_align;
80 memset(
a, 0,
sizeof(*
a));
89 if (!
a->sample_size) {
95 a->stride =
a->sample_size * (
a->is_planar ? 1 :
channels);
97 for (p = 0; p < (
a->is_planar ?
channels : 1); p++) {
104 a->allocated_samples = nb_samples * !read_only;
105 a->nb_samples = nb_samples;
106 a->sample_fmt = sample_fmt;
109 a->read_only = read_only;
110 a->allow_realloc = 0;
114 a->samples_align = plane_size /
a->stride;
133 if (!
a->sample_size) {
139 a->stride =
a->sample_size * (
a->is_planar ? 1 :
channels);
142 a->sample_fmt = sample_fmt;
146 a->allow_realloc = 1;
149 if (nb_samples > 0) {
164 int ret, new_buf_size, plane_size, p;
167 if (
a->allocated_samples >= nb_samples)
171 if (
a->read_only || !
a->allow_realloc)
175 a->allocated_channels, nb_samples,
177 if (new_buf_size < 0)
183 if (
a->nb_samples > 0 &&
a->is_planar) {
187 nb_samples,
a->sample_fmt, 0);
191 for (p = 0; p <
a->planes; p++)
192 memcpy(new_data[p],
a->data[p],
a->nb_samples *
a->stride);
195 memcpy(
a->data, new_data,
sizeof(new_data));
196 a->buffer =
a->data[0];
203 a->allocated_channels, nb_samples,
208 a->buffer_size = new_buf_size;
209 a->allocated_samples = nb_samples;
212 a->samples_align = plane_size /
a->stride;
233 if (
map && !
src->is_planar) {
239 if (!
src->nb_samples) {
252 for (p = 0; p <
src->planes; p++) {
253 if (
map->channel_map[p] >= 0)
254 memcpy(dst->
data[p],
src->data[
map->channel_map[p]],
255 src->nb_samples *
src->stride);
258 if (
map->do_copy ||
map->do_zero) {
259 for (p = 0; p <
src->planes; p++) {
260 if (
map->channel_copy[p])
261 memcpy(dst->
data[p], dst->
data[
map->channel_copy[p]],
262 src->nb_samples *
src->stride);
263 else if (
map->channel_zero[p])
269 for (p = 0; p <
src->planes; p++)
270 memcpy(dst->
data[p],
src->data[p],
src->nb_samples *
src->stride);
279 int src_offset,
int nb_samples)
281 int ret, p, dst_offset2, dst_move_size;
290 if (dst_offset < 0 || dst_offset > dst->
nb_samples ||
291 src_offset < 0 || src_offset >
src->nb_samples) {
293 src_offset, dst_offset);
298 if (nb_samples >
src->nb_samples - src_offset)
299 nb_samples =
src->nb_samples - src_offset;
316 dst_offset2 = dst_offset + nb_samples;
319 for (p = 0; p <
src->planes; p++) {
320 if (dst_move_size > 0) {
321 memmove(dst->
data[p] + dst_offset2 * dst->
stride,
323 dst_move_size * dst->
stride);
325 memcpy(dst->
data[p] + dst_offset * dst->
stride,
326 src->data[p] + src_offset *
src->stride,
327 nb_samples *
src->stride);
336 if (
a->nb_samples <= nb_samples) {
341 int move_offset =
a->stride * nb_samples;
342 int move_size =
a->stride * (
a->nb_samples - nb_samples);
344 for (p = 0; p <
a->planes; p++)
345 memmove(
a->data[p],
a->data[p] + move_offset, move_size);
347 a->nb_samples -= nb_samples;
359 offset_size =
offset *
a->stride;
360 for (p = 0; p <
a->planes; p++)
361 offset_data[p] =
a->data[p] + offset_size;
int ff_sample_fmt_is_planar(enum AVSampleFormat sample_fmt, int channels)
int ff_audio_data_combine(AudioData *dst, int dst_offset, AudioData *src, int src_offset, int nb_samples)
Append data from one AudioData to the end of another.
static void calc_ptr_alignment(AudioData *a)
void ff_audio_data_drain(AudioData *a, int nb_samples)
Drain samples from the start of the AudioData.
int ff_audio_data_set_channels(AudioData *a, int channels)
int ff_audio_data_read_from_fifo(AVAudioFifo *af, AudioData *a, int nb_samples)
Read samples from an AVAudioFifo to AudioData.
AudioData * ff_audio_data_alloc(int channels, int nb_samples, enum AVSampleFormat sample_fmt, const char *name)
Allocate AudioData.
static const AVClass audio_data_class
int ff_audio_data_realloc(AudioData *a, int nb_samples)
Reallocate AudioData.
int ff_audio_data_copy(AudioData *dst, AudioData *src, ChannelMapInfo *map)
Copy data from one AudioData to another.
void ff_audio_data_free(AudioData **a)
Free AudioData.
int ff_audio_data_init(AudioData *a, uint8_t *const *src, int plane_size, int channels, int nb_samples, enum AVSampleFormat sample_fmt, int read_only, const char *name)
Initialize AudioData using a given source.
int ff_audio_data_add_to_fifo(AVAudioFifo *af, AudioData *a, int offset, int nb_samples)
Add samples in AudioData to an AVAudioFifo.
#define AVRESAMPLE_MAX_CHANNELS
int av_audio_fifo_write(AVAudioFifo *af, void **data, int nb_samples)
Write data to an AVAudioFifo.
int av_audio_fifo_read(AVAudioFifo *af, void **data, int nb_samples)
Read data from an AVAudioFifo.
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
const char * av_default_item_name(void *ptr)
Return the context name.
void * av_mallocz(size_t size)
Allocate a memory block with alignment suitable for all memory accesses (including vectors if availab...
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Get the required buffer size for the given audio parameters.
AVSampleFormat
Audio sample formats.
int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Allocate a samples buffer for nb_samples samples, and fill data pointers and linesize accordingly.
int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, const uint8_t *buf, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Fill plane data pointers and linesize for samples with sample format sample_fmt.
int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Fill an audio buffer with silence.
#define LIBAVUTIL_VERSION_INT
const VDPAUPixFmtMap * map
Memory handling functions.
Context for an Audio FIFO Buffer.
Describe the class of an AVClass context structure.
const char * class_name
The name of the class; usually it is the same name as the context structure type to which the AVClass...
Audio buffer used for intermediate storage between conversion phases.
int nb_samples
current number of samples
int stride
sample byte offset within a plane
enum AVSampleFormat sample_fmt
sample format
uint8_t * data[AVRESAMPLE_MAX_CHANNELS]
data plane pointers
int read_only
data is read-only
int channels
channel count
static const uint8_t offset[127][2]