| 1 | /* | 
|---|
| 2 | * This file is part of FFmpeg. | 
|---|
| 3 | * | 
|---|
| 4 | * FFmpeg is free software; you can redistribute it and/or | 
|---|
| 5 | * modify it under the terms of the GNU Lesser General Public | 
|---|
| 6 | * License as published by the Free Software Foundation; either | 
|---|
| 7 | * version 2.1 of the License, or (at your option) any later version. | 
|---|
| 8 | * | 
|---|
| 9 | * FFmpeg is distributed in the hope that it will be useful, | 
|---|
| 10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
|---|
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
|---|
| 12 | * Lesser General Public License for more details. | 
|---|
| 13 | * | 
|---|
| 14 | * You should have received a copy of the GNU Lesser General Public | 
|---|
| 15 | * License along with FFmpeg; if not, write to the Free Software | 
|---|
| 16 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | 
|---|
| 17 | */ | 
|---|
| 18 |  | 
|---|
| 19 | #ifndef AVUTIL_SAMPLEFMT_H | 
|---|
| 20 | #define AVUTIL_SAMPLEFMT_H | 
|---|
| 21 |  | 
|---|
| 22 | #include <stdint.h> | 
|---|
| 23 |  | 
|---|
| 24 | #include "avutil.h" | 
|---|
| 25 | #include "attributes.h" | 
|---|
| 26 |  | 
|---|
| 27 | /** | 
|---|
| 28 | * @addtogroup lavu_audio | 
|---|
| 29 | * @{ | 
|---|
| 30 | * | 
|---|
| 31 | * @defgroup lavu_sampfmts Audio sample formats | 
|---|
| 32 | * | 
|---|
| 33 | * Audio sample format enumeration and related convenience functions. | 
|---|
| 34 | * @{ | 
|---|
| 35 | */ | 
|---|
| 36 |  | 
|---|
| 37 | /** | 
|---|
| 38 | * Audio sample formats | 
|---|
| 39 | * | 
|---|
| 40 | * - The data described by the sample format is always in native-endian order. | 
|---|
| 41 | *   Sample values can be expressed by native C types, hence the lack of a signed | 
|---|
| 42 | *   24-bit sample format even though it is a common raw audio data format. | 
|---|
| 43 | * | 
|---|
| 44 | * - The floating-point formats are based on full volume being in the range | 
|---|
| 45 | *   [-1.0, 1.0]. Any values outside this range are beyond full volume level. | 
|---|
| 46 | * | 
|---|
| 47 | * - The data layout as used in av_samples_fill_arrays() and elsewhere in FFmpeg | 
|---|
| 48 | *   (such as AVFrame in libavcodec) is as follows: | 
|---|
| 49 | * | 
|---|
| 50 | * @par | 
|---|
| 51 | * For planar sample formats, each audio channel is in a separate data plane, | 
|---|
| 52 | * and linesize is the buffer size, in bytes, for a single plane. All data | 
|---|
| 53 | * planes must be the same size. For packed sample formats, only the first data | 
|---|
| 54 | * plane is used, and samples for each channel are interleaved. In this case, | 
|---|
| 55 | * linesize is the buffer size, in bytes, for the 1 plane. | 
|---|
| 56 | * | 
|---|
| 57 | */ | 
|---|
| 58 | enum AVSampleFormat { | 
|---|
| 59 | AV_SAMPLE_FMT_NONE = -1, | 
|---|
| 60 | AV_SAMPLE_FMT_U8,          ///< unsigned 8 bits | 
|---|
| 61 | AV_SAMPLE_FMT_S16,         ///< signed 16 bits | 
|---|
| 62 | AV_SAMPLE_FMT_S32,         ///< signed 32 bits | 
|---|
| 63 | AV_SAMPLE_FMT_FLT,         ///< float | 
|---|
| 64 | AV_SAMPLE_FMT_DBL,         ///< double | 
|---|
| 65 |  | 
|---|
| 66 | AV_SAMPLE_FMT_U8P,         ///< unsigned 8 bits, planar | 
|---|
| 67 | AV_SAMPLE_FMT_S16P,        ///< signed 16 bits, planar | 
|---|
| 68 | AV_SAMPLE_FMT_S32P,        ///< signed 32 bits, planar | 
|---|
| 69 | AV_SAMPLE_FMT_FLTP,        ///< float, planar | 
|---|
| 70 | AV_SAMPLE_FMT_DBLP,        ///< double, planar | 
|---|
| 71 | AV_SAMPLE_FMT_S64,         ///< signed 64 bits | 
|---|
| 72 | AV_SAMPLE_FMT_S64P,        ///< signed 64 bits, planar | 
|---|
| 73 |  | 
|---|
| 74 | AV_SAMPLE_FMT_NB           ///< Number of sample formats. DO NOT USE if linking dynamically | 
|---|
| 75 | }; | 
|---|
| 76 |  | 
|---|
| 77 | /** | 
|---|
| 78 | * Return the name of sample_fmt, or NULL if sample_fmt is not | 
|---|
| 79 | * recognized. | 
|---|
| 80 | */ | 
|---|
| 81 | const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt); | 
|---|
| 82 |  | 
|---|
| 83 | /** | 
|---|
| 84 | * Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE | 
|---|
| 85 | * on error. | 
|---|
| 86 | */ | 
|---|
| 87 | enum AVSampleFormat av_get_sample_fmt(const char *name); | 
|---|
| 88 |  | 
|---|
| 89 | /** | 
|---|
| 90 | * Return the planar<->packed alternative form of the given sample format, or | 
|---|
| 91 | * AV_SAMPLE_FMT_NONE on error. If the passed sample_fmt is already in the | 
|---|
| 92 | * requested planar/packed format, the format returned is the same as the | 
|---|
| 93 | * input. | 
|---|
| 94 | */ | 
|---|
| 95 | enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar); | 
|---|
| 96 |  | 
|---|
| 97 | /** | 
|---|
| 98 | * Get the packed alternative form of the given sample format. | 
|---|
| 99 | * | 
|---|
| 100 | * If the passed sample_fmt is already in packed format, the format returned is | 
|---|
| 101 | * the same as the input. | 
|---|
| 102 | * | 
|---|
| 103 | * @return  the packed alternative form of the given sample format or | 
|---|
| 104 | AV_SAMPLE_FMT_NONE on error. | 
|---|
| 105 | */ | 
|---|
| 106 | enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt); | 
|---|
| 107 |  | 
|---|
| 108 | /** | 
|---|
| 109 | * Get the planar alternative form of the given sample format. | 
|---|
| 110 | * | 
|---|
| 111 | * If the passed sample_fmt is already in planar format, the format returned is | 
|---|
| 112 | * the same as the input. | 
|---|
| 113 | * | 
|---|
| 114 | * @return  the planar alternative form of the given sample format or | 
|---|
| 115 | AV_SAMPLE_FMT_NONE on error. | 
|---|
| 116 | */ | 
|---|
| 117 | enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt); | 
|---|
| 118 |  | 
|---|
| 119 | /** | 
|---|
| 120 | * Generate a string corresponding to the sample format with | 
|---|
| 121 | * sample_fmt, or a header if sample_fmt is negative. | 
|---|
| 122 | * | 
|---|
| 123 | * @param buf the buffer where to write the string | 
|---|
| 124 | * @param buf_size the size of buf | 
|---|
| 125 | * @param sample_fmt the number of the sample format to print the | 
|---|
| 126 | * corresponding info string, or a negative value to print the | 
|---|
| 127 | * corresponding header. | 
|---|
| 128 | * @return the pointer to the filled buffer or NULL if sample_fmt is | 
|---|
| 129 | * unknown or in case of other errors | 
|---|
| 130 | */ | 
|---|
| 131 | char *av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt); | 
|---|
| 132 |  | 
|---|
| 133 | /** | 
|---|
| 134 | * Return number of bytes per sample. | 
|---|
| 135 | * | 
|---|
| 136 | * @param sample_fmt the sample format | 
|---|
| 137 | * @return number of bytes per sample or zero if unknown for the given | 
|---|
| 138 | * sample format | 
|---|
| 139 | */ | 
|---|
| 140 | int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt); | 
|---|
| 141 |  | 
|---|
| 142 | /** | 
|---|
| 143 | * Check if the sample format is planar. | 
|---|
| 144 | * | 
|---|
| 145 | * @param sample_fmt the sample format to inspect | 
|---|
| 146 | * @return 1 if the sample format is planar, 0 if it is interleaved | 
|---|
| 147 | */ | 
|---|
| 148 | int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt); | 
|---|
| 149 |  | 
|---|
| 150 | /** | 
|---|
| 151 | * Get the required buffer size for the given audio parameters. | 
|---|
| 152 | * | 
|---|
| 153 | * @param[out] linesize calculated linesize, may be NULL | 
|---|
| 154 | * @param nb_channels   the number of channels | 
|---|
| 155 | * @param nb_samples    the number of samples in a single channel | 
|---|
| 156 | * @param sample_fmt    the sample format | 
|---|
| 157 | * @param align         buffer size alignment (0 = default, 1 = no alignment) | 
|---|
| 158 | * @return              required buffer size, or negative error code on failure | 
|---|
| 159 | */ | 
|---|
| 160 | int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples, | 
|---|
| 161 | enum AVSampleFormat sample_fmt, int align); | 
|---|
| 162 |  | 
|---|
| 163 | /** | 
|---|
| 164 | * @} | 
|---|
| 165 | * | 
|---|
| 166 | * @defgroup lavu_sampmanip Samples manipulation | 
|---|
| 167 | * | 
|---|
| 168 | * Functions that manipulate audio samples | 
|---|
| 169 | * @{ | 
|---|
| 170 | */ | 
|---|
| 171 |  | 
|---|
| 172 | /** | 
|---|
| 173 | * Fill plane data pointers and linesize for samples with sample | 
|---|
| 174 | * format sample_fmt. | 
|---|
| 175 | * | 
|---|
| 176 | * The audio_data array is filled with the pointers to the samples data planes: | 
|---|
| 177 | * for planar, set the start point of each channel's data within the buffer, | 
|---|
| 178 | * for packed, set the start point of the entire buffer only. | 
|---|
| 179 | * | 
|---|
| 180 | * The value pointed to by linesize is set to the aligned size of each | 
|---|
| 181 | * channel's data buffer for planar layout, or to the aligned size of the | 
|---|
| 182 | * buffer for all channels for packed layout. | 
|---|
| 183 | * | 
|---|
| 184 | * The buffer in buf must be big enough to contain all the samples | 
|---|
| 185 | * (use av_samples_get_buffer_size() to compute its minimum size), | 
|---|
| 186 | * otherwise the audio_data pointers will point to invalid data. | 
|---|
| 187 | * | 
|---|
| 188 | * @see enum AVSampleFormat | 
|---|
| 189 | * The documentation for AVSampleFormat describes the data layout. | 
|---|
| 190 | * | 
|---|
| 191 | * @param[out] audio_data  array to be filled with the pointer for each channel | 
|---|
| 192 | * @param[out] linesize    calculated linesize, may be NULL | 
|---|
| 193 | * @param buf              the pointer to a buffer containing the samples | 
|---|
| 194 | * @param nb_channels      the number of channels | 
|---|
| 195 | * @param nb_samples       the number of samples in a single channel | 
|---|
| 196 | * @param sample_fmt       the sample format | 
|---|
| 197 | * @param align            buffer size alignment (0 = default, 1 = no alignment) | 
|---|
| 198 | * @return                 >=0 on success or a negative error code on failure | 
|---|
| 199 | * @todo return minimum size in bytes required for the buffer in case | 
|---|
| 200 | * of success at the next bump | 
|---|
| 201 | */ | 
|---|
| 202 | int av_samples_fill_arrays(uint8_t **audio_data, int *linesize, | 
|---|
| 203 | const uint8_t *buf, | 
|---|
| 204 | int nb_channels, int nb_samples, | 
|---|
| 205 | enum AVSampleFormat sample_fmt, int align); | 
|---|
| 206 |  | 
|---|
| 207 | /** | 
|---|
| 208 | * Allocate a samples buffer for nb_samples samples, and fill data pointers and | 
|---|
| 209 | * linesize accordingly. | 
|---|
| 210 | * The allocated samples buffer can be freed by using av_freep(&audio_data[0]) | 
|---|
| 211 | * Allocated data will be initialized to silence. | 
|---|
| 212 | * | 
|---|
| 213 | * @see enum AVSampleFormat | 
|---|
| 214 | * The documentation for AVSampleFormat describes the data layout. | 
|---|
| 215 | * | 
|---|
| 216 | * @param[out] audio_data  array to be filled with the pointer for each channel | 
|---|
| 217 | * @param[out] linesize    aligned size for audio buffer(s), may be NULL | 
|---|
| 218 | * @param nb_channels      number of audio channels | 
|---|
| 219 | * @param nb_samples       number of samples per channel | 
|---|
| 220 | * @param align            buffer size alignment (0 = default, 1 = no alignment) | 
|---|
| 221 | * @return                 >=0 on success or a negative error code on failure | 
|---|
| 222 | * @todo return the size of the allocated buffer in case of success at the next bump | 
|---|
| 223 | * @see av_samples_fill_arrays() | 
|---|
| 224 | * @see av_samples_alloc_array_and_samples() | 
|---|
| 225 | */ | 
|---|
| 226 | int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels, | 
|---|
| 227 | int nb_samples, enum AVSampleFormat sample_fmt, int align); | 
|---|
| 228 |  | 
|---|
| 229 | /** | 
|---|
| 230 | * Allocate a data pointers array, samples buffer for nb_samples | 
|---|
| 231 | * samples, and fill data pointers and linesize accordingly. | 
|---|
| 232 | * | 
|---|
| 233 | * This is the same as av_samples_alloc(), but also allocates the data | 
|---|
| 234 | * pointers array. | 
|---|
| 235 | * | 
|---|
| 236 | * @see av_samples_alloc() | 
|---|
| 237 | */ | 
|---|
| 238 | int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, | 
|---|
| 239 | int nb_samples, enum AVSampleFormat sample_fmt, int align); | 
|---|
| 240 |  | 
|---|
| 241 | /** | 
|---|
| 242 | * Copy samples from src to dst. | 
|---|
| 243 | * | 
|---|
| 244 | * @param dst destination array of pointers to data planes | 
|---|
| 245 | * @param src source array of pointers to data planes | 
|---|
| 246 | * @param dst_offset offset in samples at which the data will be written to dst | 
|---|
| 247 | * @param src_offset offset in samples at which the data will be read from src | 
|---|
| 248 | * @param nb_samples number of samples to be copied | 
|---|
| 249 | * @param nb_channels number of audio channels | 
|---|
| 250 | * @param sample_fmt audio sample format | 
|---|
| 251 | */ | 
|---|
| 252 | int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset, | 
|---|
| 253 | int src_offset, int nb_samples, int nb_channels, | 
|---|
| 254 | enum AVSampleFormat sample_fmt); | 
|---|
| 255 |  | 
|---|
| 256 | /** | 
|---|
| 257 | * Fill an audio buffer with silence. | 
|---|
| 258 | * | 
|---|
| 259 | * @param audio_data  array of pointers to data planes | 
|---|
| 260 | * @param offset      offset in samples at which to start filling | 
|---|
| 261 | * @param nb_samples  number of samples to fill | 
|---|
| 262 | * @param nb_channels number of audio channels | 
|---|
| 263 | * @param sample_fmt  audio sample format | 
|---|
| 264 | */ | 
|---|
| 265 | int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples, | 
|---|
| 266 | int nb_channels, enum AVSampleFormat sample_fmt); | 
|---|
| 267 |  | 
|---|
| 268 | /** | 
|---|
| 269 | * @} | 
|---|
| 270 | * @} | 
|---|
| 271 | */ | 
|---|
| 272 | #endif /* AVUTIL_SAMPLEFMT_H */ | 
|---|
| 273 |  | 
|---|