samplefmt.c
Go to the documentation of this file.
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 #include "common.h"
20 #include "samplefmt.h"
21 
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 
26 typedef struct SampleFmtInfo {
27  char name[8];
28  int bits;
29  int planar;
30  enum AVSampleFormat altform; ///< planar<->packed alternative form
32 
33 /** this table gives more information about formats */
35  [AV_SAMPLE_FMT_U8] = { .name = "u8", .bits = 8, .planar = 0, .altform = AV_SAMPLE_FMT_U8P },
36  [AV_SAMPLE_FMT_S16] = { .name = "s16", .bits = 16, .planar = 0, .altform = AV_SAMPLE_FMT_S16P },
37  [AV_SAMPLE_FMT_S32] = { .name = "s32", .bits = 32, .planar = 0, .altform = AV_SAMPLE_FMT_S32P },
38  [AV_SAMPLE_FMT_FLT] = { .name = "flt", .bits = 32, .planar = 0, .altform = AV_SAMPLE_FMT_FLTP },
39  [AV_SAMPLE_FMT_DBL] = { .name = "dbl", .bits = 64, .planar = 0, .altform = AV_SAMPLE_FMT_DBLP },
40  [AV_SAMPLE_FMT_U8P] = { .name = "u8p", .bits = 8, .planar = 1, .altform = AV_SAMPLE_FMT_U8 },
41  [AV_SAMPLE_FMT_S16P] = { .name = "s16p", .bits = 16, .planar = 1, .altform = AV_SAMPLE_FMT_S16 },
42  [AV_SAMPLE_FMT_S32P] = { .name = "s32p", .bits = 32, .planar = 1, .altform = AV_SAMPLE_FMT_S32 },
43  [AV_SAMPLE_FMT_FLTP] = { .name = "fltp", .bits = 32, .planar = 1, .altform = AV_SAMPLE_FMT_FLT },
44  [AV_SAMPLE_FMT_DBLP] = { .name = "dblp", .bits = 64, .planar = 1, .altform = AV_SAMPLE_FMT_DBL },
45 };
46 
47 const char *av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
48 {
49  if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
50  return NULL;
51  return sample_fmt_info[sample_fmt].name;
52 }
53 
55 {
56  int i;
57 
58  for (i = 0; i < AV_SAMPLE_FMT_NB; i++)
59  if (!strcmp(sample_fmt_info[i].name, name))
60  return i;
61  return AV_SAMPLE_FMT_NONE;
62 }
63 
65 {
66  if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
67  return AV_SAMPLE_FMT_NONE;
68  if (sample_fmt_info[sample_fmt].planar == planar)
69  return sample_fmt;
70  return sample_fmt_info[sample_fmt].altform;
71 }
72 
74 {
75  if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
76  return AV_SAMPLE_FMT_NONE;
77  if (sample_fmt_info[sample_fmt].planar)
78  return sample_fmt_info[sample_fmt].altform;
79  return sample_fmt;
80 }
81 
83 {
84  if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
85  return AV_SAMPLE_FMT_NONE;
86  if (sample_fmt_info[sample_fmt].planar)
87  return sample_fmt;
88  return sample_fmt_info[sample_fmt].altform;
89 }
90 
91 char *av_get_sample_fmt_string (char *buf, int buf_size, enum AVSampleFormat sample_fmt)
92 {
93  /* print header */
94  if (sample_fmt < 0)
95  snprintf(buf, buf_size, "name " " depth");
96  else if (sample_fmt < AV_SAMPLE_FMT_NB) {
97  SampleFmtInfo info = sample_fmt_info[sample_fmt];
98  snprintf (buf, buf_size, "%-6s" " %2d ", info.name, info.bits);
99  }
100 
101  return buf;
102 }
103 
105 {
106  return sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB ?
107  0 : sample_fmt_info[sample_fmt].bits >> 3;
108 }
109 
110 #if FF_API_GET_BITS_PER_SAMPLE_FMT
112 {
113  return sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB ?
114  0 : sample_fmt_info[sample_fmt].bits;
115 }
116 #endif
117 
119 {
120  if (sample_fmt < 0 || sample_fmt >= AV_SAMPLE_FMT_NB)
121  return 0;
122  return sample_fmt_info[sample_fmt].planar;
123 }
124 
125 int av_samples_get_buffer_size(int *linesize, int nb_channels, int nb_samples,
126  enum AVSampleFormat sample_fmt, int align)
127 {
128  int line_size;
129  int sample_size = av_get_bytes_per_sample(sample_fmt);
130  int planar = av_sample_fmt_is_planar(sample_fmt);
131 
132  /* validate parameter ranges */
133  if (!sample_size || nb_samples <= 0 || nb_channels <= 0)
134  return AVERROR(EINVAL);
135 
136  /* auto-select alignment if not specified */
137  if (!align) {
138  align = 1;
139  nb_samples = FFALIGN(nb_samples, 32);
140  }
141 
142  /* check for integer overflow */
143  if (nb_channels > INT_MAX / align ||
144  (int64_t)nb_channels * nb_samples > (INT_MAX - (align * nb_channels)) / sample_size)
145  return AVERROR(EINVAL);
146 
147  line_size = planar ? FFALIGN(nb_samples * sample_size, align) :
148  FFALIGN(nb_samples * sample_size * nb_channels, align);
149  if (linesize)
150  *linesize = line_size;
151 
152  return planar ? line_size * nb_channels : line_size;
153 }
154 
155 int av_samples_fill_arrays(uint8_t **audio_data, int *linesize,
156  const uint8_t *buf, int nb_channels, int nb_samples,
157  enum AVSampleFormat sample_fmt, int align)
158 {
159  int ch, planar, buf_size, line_size;
160 
161  planar = av_sample_fmt_is_planar(sample_fmt);
162  buf_size = av_samples_get_buffer_size(&line_size, nb_channels, nb_samples,
163  sample_fmt, align);
164  if (buf_size < 0)
165  return buf_size;
166 
167  audio_data[0] = (uint8_t *)buf;
168  for (ch = 1; planar && ch < nb_channels; ch++)
169  audio_data[ch] = audio_data[ch-1] + line_size;
170 
171  if (linesize)
172  *linesize = line_size;
173 
174 #if FF_API_SAMPLES_UTILS_RETURN_ZERO
175  return 0;
176 #else
177  return buf_size;
178 #endif
179 }
180 
181 int av_samples_alloc(uint8_t **audio_data, int *linesize, int nb_channels,
182  int nb_samples, enum AVSampleFormat sample_fmt, int align)
183 {
184  uint8_t *buf;
185  int size = av_samples_get_buffer_size(NULL, nb_channels, nb_samples,
186  sample_fmt, align);
187  if (size < 0)
188  return size;
189 
190  buf = av_malloc(size);
191  if (!buf)
192  return AVERROR(ENOMEM);
193 
194  size = av_samples_fill_arrays(audio_data, linesize, buf, nb_channels,
195  nb_samples, sample_fmt, align);
196  if (size < 0) {
197  av_free(buf);
198  return size;
199  }
200 
201  av_samples_set_silence(audio_data, 0, nb_samples, nb_channels, sample_fmt);
202 
203 #if FF_API_SAMPLES_UTILS_RETURN_ZERO
204  return 0;
205 #else
206  return size;
207 #endif
208 }
209 
210 int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels,
211  int nb_samples, enum AVSampleFormat sample_fmt, int align)
212 {
213  int ret, nb_planes = av_sample_fmt_is_planar(sample_fmt) ? nb_channels : 1;
214 
215  *audio_data = av_calloc(nb_planes, sizeof(**audio_data));
216  if (!*audio_data)
217  return AVERROR(ENOMEM);
218  ret = av_samples_alloc(*audio_data, linesize, nb_channels,
219  nb_samples, sample_fmt, align);
220  if (ret < 0)
221  av_freep(audio_data);
222  return ret;
223 }
224 
225 int av_samples_copy(uint8_t **dst, uint8_t * const *src, int dst_offset,
226  int src_offset, int nb_samples, int nb_channels,
227  enum AVSampleFormat sample_fmt)
228 {
229  int planar = av_sample_fmt_is_planar(sample_fmt);
230  int planes = planar ? nb_channels : 1;
231  int block_align = av_get_bytes_per_sample(sample_fmt) * (planar ? 1 : nb_channels);
232  int data_size = nb_samples * block_align;
233  int i;
234 
235  dst_offset *= block_align;
236  src_offset *= block_align;
237 
238  if((dst[0] < src[0] ? src[0] - dst[0] : dst[0] - src[0]) >= data_size) {
239  for (i = 0; i < planes; i++)
240  memcpy(dst[i] + dst_offset, src[i] + src_offset, data_size);
241  } else {
242  for (i = 0; i < planes; i++)
243  memmove(dst[i] + dst_offset, src[i] + src_offset, data_size);
244  }
245 
246  return 0;
247 }
248 
249 int av_samples_set_silence(uint8_t **audio_data, int offset, int nb_samples,
250  int nb_channels, enum AVSampleFormat sample_fmt)
251 {
252  int planar = av_sample_fmt_is_planar(sample_fmt);
253  int planes = planar ? nb_channels : 1;
254  int block_align = av_get_bytes_per_sample(sample_fmt) * (planar ? 1 : nb_channels);
255  int data_size = nb_samples * block_align;
256  int fill_char = (sample_fmt == AV_SAMPLE_FMT_U8 ||
257  sample_fmt == AV_SAMPLE_FMT_U8P) ? 0x80 : 0x00;
258  int i;
259 
260  offset *= block_align;
261 
262  for (i = 0; i < planes; i++)
263  memset(audio_data[i] + offset, fill_char, data_size);
264 
265  return 0;
266 }
Number of sample formats. DO NOT USE if linking dynamically.
Definition: samplefmt.h:63
int av_samples_alloc_array_and_samples(uint8_t ***audio_data, int *linesize, int nb_channels, int nb_samples, enum AVSampleFormat sample_fmt, int align)
Allocate a data pointers array, samples buffer for nb_samples samples, and fill data pointers and lin...
Definition: samplefmt.c:210
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.
Definition: samplefmt.c:125
struct SampleFmtInfo SampleFmtInfo
enum AVSampleFormat altform
planar<->packed alternative form
Definition: samplefmt.c:30
signed 16 bits
Definition: samplefmt.h:52
#define FFALIGN(x, a)
Definition: common.h:63
static const SampleFmtInfo sample_fmt_info[AV_SAMPLE_FMT_NB]
this table gives more information about formats
Definition: samplefmt.c:34
void av_freep(void *arg)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc() and set the pointer ...
Definition: mem.c:198
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.
Definition: samplefmt.c:155
uint8_t
AV_SAMPLE_FMT_U8
enum AVSampleFormat av_get_planar_sample_fmt(enum AVSampleFormat sample_fmt)
Get the planar alternative form of the given sample format.
Definition: samplefmt.c:82
signed 32 bits, planar
Definition: samplefmt.h:59
float, planar
Definition: samplefmt.h:60
void av_free(void *ptr)
Free a memory block which has been allocated with av_malloc(z)() or av_realloc(). ...
Definition: mem.c:183
static const uint8_t offset[127][2]
Definition: vf_spp.c:70
int size
signed 32 bits
Definition: samplefmt.h:53
MIPS optimizations info
Definition: mips.txt:2
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.
Definition: samplefmt.c:249
ret
Definition: avfilter.c:821
enum AVSampleFormat av_get_packed_sample_fmt(enum AVSampleFormat sample_fmt)
Get the packed alternative form of the given sample format.
Definition: samplefmt.c:73
const char * av_get_sample_fmt_name(enum AVSampleFormat sample_fmt)
Return the name of sample_fmt, or NULL if sample_fmt is not recognized.
Definition: samplefmt.c:47
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
Definition: samplefmt.c:104
const AVS_VideoInfo int align
Definition: avisynth_c.h:695
NULL
Definition: eval.c:55
AVS_Value src
Definition: avisynth_c.h:523
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...
Definition: samplefmt.c:181
int av_get_bits_per_sample_fmt(enum AVSampleFormat sample_fmt)
Definition: samplefmt.c:111
char * av_get_sample_fmt_string(char *buf, int buf_size, enum AVSampleFormat sample_fmt)
Generate a string corresponding to the sample format with sample_fmt, or a header if sample_fmt is ne...
Definition: samplefmt.c:91
int av_samples_copy(uint8_t **dst, uint8_t *const *src, int dst_offset, int src_offset, int nb_samples, int nb_channels, enum AVSampleFormat sample_fmt)
Copy samples from src to dst.
Definition: samplefmt.c:225
void * buf
Definition: avisynth_c.h:594
void * av_malloc(size_t size)
Allocate a block of size bytes with alignment suitable for all memory accesses (including vectors if ...
Definition: mem.c:73
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
Definition: samplefmt.c:118
synthesis window for stochastic i
#define snprintf
Definition: snprintf.h:34
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFilterBuffer structure Format for each input and each output the list of supported formats For video that means pixel format For audio that means channel sample they are references to shared objects When the negotiation mechanism computes the intersection of the formats supported at each end of a all references to both lists are replaced with a reference to the intersection And when a single format is eventually chosen for a link amongst the remaining all references to the list are updated That means that if a filter requires that its input and output have the same format amongst a supported all it has to do is use a reference to the same list of formats query_formats can leave some formats unset and return AVERROR(EAGAIN) to cause the negotiation mechanism toagain later.That can be used by filters with complex requirements to use the format negotiated on one link to set the formats supported on another.Buffer references ownership and permissions
void * av_calloc(size_t nmemb, size_t size)
Allocate a block of nmemb * size bytes with alignment suitable for all memory accesses (including vec...
Definition: mem.c:213
common internal and external API header
char name[8]
Definition: samplefmt.c:27
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
unsigned 8 bits, planar
Definition: samplefmt.h:57
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
signed 16 bits, planar
Definition: samplefmt.h:58
int nb_channels
enum AVSampleFormat av_get_alt_sample_fmt(enum AVSampleFormat sample_fmt, int planar)
Return the planar<->packed alternative form of the given sample format, or AV_SAMPLE_FMT_NONE on erro...
Definition: samplefmt.c:64
double, planar
Definition: samplefmt.h:61
enum AVSampleFormat av_get_sample_fmt(const char *name)
Return a sample format corresponding to name, or AV_SAMPLE_FMT_NONE on error.
Definition: samplefmt.c:54