1/* 2 * Copyright (c) 2012 Justin Ruggles <justin.ruggles@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#ifndef AVRESAMPLE_AUDIO_DATA_H 22#define AVRESAMPLE_AUDIO_DATA_H 23 24#include <stdint.h> 25 26#include "libavutil/audio_fifo.h" 27#include "libavutil/log.h" 28#include "libavutil/samplefmt.h" 29#include "avresample.h" 30#include "internal.h" 31 32/** 33 * Audio buffer used for intermediate storage between conversion phases. 34 */ 35struct AudioData { 36 const AVClass *class; /**< AVClass for logging */ 37 uint8_t *data[AVRESAMPLE_MAX_CHANNELS]; /**< data plane pointers */ 38 uint8_t *buffer; /**< data buffer */ 39 unsigned int buffer_size; /**< allocated buffer size */ 40 int allocated_samples; /**< number of samples the buffer can hold */ 41 int nb_samples; /**< current number of samples */ 42 enum AVSampleFormat sample_fmt; /**< sample format */ 43 int channels; /**< channel count */ 44 int allocated_channels; /**< allocated channel count */ 45 int is_planar; /**< sample format is planar */ 46 int planes; /**< number of data planes */ 47 int sample_size; /**< bytes per sample */ 48 int stride; /**< sample byte offset within a plane */ 49 int read_only; /**< data is read-only */ 50 int allow_realloc; /**< realloc is allowed */ 51 int ptr_align; /**< minimum data pointer alignment */ 52 int samples_align; /**< allocated samples alignment */ 53 const char *name; /**< name for debug logging */ 54}; 55 56int ff_audio_data_set_channels(AudioData *a, int channels); 57 58/** 59 * Initialize AudioData using a given source. 60 * 61 * This does not allocate an internal buffer. It only sets the data pointers 62 * and audio parameters. 63 * 64 * @param a AudioData struct 65 * @param src source data pointers 66 * @param plane_size plane size, in bytes. 67 * This can be 0 if unknown, but that will lead to 68 * optimized functions not being used in many cases, 69 * which could slow down some conversions. 70 * @param channels channel count 71 * @param nb_samples number of samples in the source data 72 * @param sample_fmt sample format 73 * @param read_only indicates if buffer is read only or read/write 74 * @param name name for debug logging (can be NULL) 75 * @return 0 on success, negative AVERROR value on error 76 */ 77int ff_audio_data_init(AudioData *a, uint8_t **src, int plane_size, int channels, 78 int nb_samples, enum AVSampleFormat sample_fmt, 79 int read_only, const char *name); 80 81/** 82 * Allocate AudioData. 83 * 84 * This allocates an internal buffer and sets audio parameters. 85 * 86 * @param channels channel count 87 * @param nb_samples number of samples to allocate space for 88 * @param sample_fmt sample format 89 * @param name name for debug logging (can be NULL) 90 * @return newly allocated AudioData struct, or NULL on error 91 */ 92AudioData *ff_audio_data_alloc(int channels, int nb_samples, 93 enum AVSampleFormat sample_fmt, 94 const char *name); 95 96/** 97 * Reallocate AudioData. 98 * 99 * The AudioData must have been previously allocated with ff_audio_data_alloc(). 100 * 101 * @param a AudioData struct 102 * @param nb_samples number of samples to allocate space for 103 * @return 0 on success, negative AVERROR value on error 104 */ 105int ff_audio_data_realloc(AudioData *a, int nb_samples); 106 107/** 108 * Free AudioData. 109 * 110 * The AudioData must have been previously allocated with ff_audio_data_alloc(). 111 * 112 * @param a AudioData struct 113 */ 114void ff_audio_data_free(AudioData **a); 115 116/** 117 * Copy data from one AudioData to another. 118 * 119 * @param out output AudioData 120 * @param in input AudioData 121 * @param map channel map, NULL if not remapping 122 * @return 0 on success, negative AVERROR value on error 123 */ 124int ff_audio_data_copy(AudioData *out, AudioData *in, ChannelMapInfo *map); 125 126/** 127 * Append data from one AudioData to the end of another. 128 * 129 * @param dst destination AudioData 130 * @param dst_offset offset, in samples, to start writing, relative to the 131 * start of dst 132 * @param src source AudioData 133 * @param src_offset offset, in samples, to start copying, relative to the 134 * start of the src 135 * @param nb_samples number of samples to copy 136 * @return 0 on success, negative AVERROR value on error 137 */ 138int ff_audio_data_combine(AudioData *dst, int dst_offset, AudioData *src, 139 int src_offset, int nb_samples); 140 141/** 142 * Drain samples from the start of the AudioData. 143 * 144 * Remaining samples are shifted to the start of the AudioData. 145 * 146 * @param a AudioData struct 147 * @param nb_samples number of samples to drain 148 */ 149void ff_audio_data_drain(AudioData *a, int nb_samples); 150 151/** 152 * Add samples in AudioData to an AVAudioFifo. 153 * 154 * @param af Audio FIFO Buffer 155 * @param a AudioData struct 156 * @param offset number of samples to skip from the start of the data 157 * @param nb_samples number of samples to add to the FIFO 158 * @return number of samples actually added to the FIFO, or 159 * negative AVERROR code on error 160 */ 161int ff_audio_data_add_to_fifo(AVAudioFifo *af, AudioData *a, int offset, 162 int nb_samples); 163 164/** 165 * Read samples from an AVAudioFifo to AudioData. 166 * 167 * @param af Audio FIFO Buffer 168 * @param a AudioData struct 169 * @param nb_samples number of samples to read from the FIFO 170 * @return number of samples actually read from the FIFO, or 171 * negative AVERROR code on error 172 */ 173int ff_audio_data_read_from_fifo(AVAudioFifo *af, AudioData *a, int nb_samples); 174 175#endif /* AVRESAMPLE_AUDIO_DATA_H */ 176