37 #define ASSERT_LEVEL 2 83 for(ch= 0; ch<ch_count; ch++)
135 out[
i]= in + i*plane_size;
142 static int cmp(
const void *
a,
const void *
b){
143 return *(
const int *)a - *(
const int *)
b;
150 double v,
f,
a, ampa;
156 #define PUT_SAMPLE set(data, ch, k, channels, sample_fmt, v); 157 #define uint_rand(x) ((x) = (x) * 1664525 + 1013904223) 158 #define dbl_rand(x) (uint_rand(x)*2.0 / (double)UINT_MAX - 1) 163 for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
167 a +=
M_PI * 1000.0 * 2.0 / sample_rate;
172 for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
176 f = 100.0 + (((10000.0 - 100.0) * i) / sample_rate);
181 for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) {
188 for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) {
200 for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) {
202 v = sin(taba[ch]) * 0.30;
204 f = tabf1[ch] + (((tabf2[ch] - tabf1[ch]) * i) /
sample_rate);
212 for (i = 0; i < 2 * sample_rate && k < nb_samples; i++, k++) {
214 double amp = (1.0 + sin(ampa)) * 0.15;
225 int main(
int argc,
char **argv){
237 int num_tests = 10000;
239 uint32_t rand_seed = 0;
243 int specific_test= -1;
249 if (!strcmp(argv[1],
"-h") || !strcmp(argv[1],
"--help")) {
251 "num_tests Default is %d\n", num_tests);
254 num_tests = strtol(argv[1],
NULL, 0);
256 num_tests = -num_tests;
259 if(num_tests<= 0 || num_tests>max_tests)
260 num_tests = max_tests;
262 specific_test = strtol(argv[1],
NULL, 0);
266 for(i=0; i<max_tests; i++)
267 remaining_tests[i] = i;
269 for(test=0; test<num_tests; test++){
272 r = (seed * (uint64_t)(max_tests - test)) >>32;
273 FFSWAP(
int, remaining_tests[r], remaining_tests[max_tests - test - 1]);
275 qsort(remaining_tests + max_tests - num_tests, num_tests,
sizeof(remaining_tests[0]),
cmp);
276 in_sample_rate=16000;
277 for(test=0; test<num_tests; test++){
278 char in_layout_string[256];
279 char out_layout_string[256];
280 unsigned vector= remaining_tests[max_tests - test - 1];
282 int out_count, mid_count, out_ch_count;
291 if(specific_test == 0){
292 if(out_sample_rate != in_sample_rate || in_ch_layout != out_ch_layout)
300 fprintf(stderr,
"TEST: %s->%s, rate:%5d->%5d, fmt:%s->%s\n",
301 in_layout_string, out_layout_string,
302 in_sample_rate, out_sample_rate,
304 forw_ctx =
swr_alloc_set_opts(forw_ctx, out_ch_layout, out_sample_fmt, out_sample_rate,
305 in_ch_layout, in_sample_fmt, in_sample_rate,
307 backw_ctx =
swr_alloc_set_opts(backw_ctx, in_ch_layout, in_sample_fmt, in_sample_rate,
308 out_ch_layout, out_sample_fmt, out_sample_rate,
311 fprintf(stderr,
"Failed to init forw_cts\n");
315 fprintf(stderr,
"Failed to init backw_ctx\n");
324 fprintf(stderr,
"swr_init(->) failed\n");
326 fprintf(stderr,
"swr_init(<-) failed\n");
332 for(ch=0; ch<in_ch_count; ch++){
334 set(ain, ch, i, in_ch_count, in_sample_fmt, sin(i*i*3/SAMPLES));
349 shift(ain, 1, in_ch_count, in_sample_fmt);
351 shift(amid, mid_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
353 shift(amid, mid_count-tmp_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
354 shift(ain, 2, in_ch_count, in_sample_fmt);
356 shift(amid, mid_count-tmp_count, out_ch_count, out_sample_fmt); tmp_count = mid_count;
357 shift(ain, -3, in_ch_count, in_sample_fmt);
359 shift(amid, -tmp_count, out_ch_count, out_sample_fmt);
363 for(ch=0; ch<in_ch_count; ch++){
364 double sse, maxdiff=0;
370 for(i=0; i<out_count; i++){
380 sse= sum_aa + sum_bb - 2*sum_ab;
381 if(sse < 0 && sse > -0.00001) sse=0;
383 fprintf(stderr,
"[e:%f c:%f max:%f] len:%5d\n", out_count ? sqrt(sse/out_count) : 0, sum_ab/(sqrt(sum_aa*sum_bb)), maxdiff, out_count);
388 flush_count =
swr_convert(backw_ctx,aout, flush_i, 0, 0);
389 shift(aout, flush_i, in_ch_count, in_sample_fmt);
391 shift(aout, -flush_i, in_ch_count, in_sample_fmt);
393 for(ch=0; ch<in_ch_count; ch++){
394 double sse, maxdiff=0;
400 for(i=0; i<flush_count; i++){
410 sse= sum_aa + sum_bb - 2*sum_ab;
411 if(sse < 0 && sse > -0.00001) sse=0;
413 fprintf(stderr,
"[e:%f c:%f max:%f] len:%5d F:%3d\n", sqrt(sse/flush_count), sum_ab/(sqrt(sum_aa*sum_bb)), maxdiff, flush_count, flush_i);
418 fprintf(stderr,
"\n");
#define AV_CH_LAYOUT_7POINT1
int out_sample_rate
output sample rate
ptrdiff_t const GLvoid * data
#define AV_CH_LAYOUT_SURROUND
The reader does not expect b to be semantically here and if the code is changed by maybe adding a a division or other the signedness will almost certainly be mistaken To avoid this confusion a new type was SUINT is the C unsigned type but it holds a signed int to use the same example SUINT a
static int sse(MpegEncContext *s, uint8_t *src1, uint8_t *src2, int w, int h, int stride)
#define AV_CH_LAYOUT_4POINT0
#define AV_CH_LAYOUT_7POINT0
#define AV_CH_LAYOUT_STEREO
static void shift(uint8_t *a[], int index, int ch_count, enum AVSampleFormat f)
Filter the word “frame” indicates either a video frame or a group of audio as stored in an AVFrame 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 format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
#define AV_CH_LAYOUT_5POINT0
int av_get_channel_layout_nb_channels(uint64_t channel_layout)
Return the number of channels in the channel layout.
#define av_assert0(cond)
assert() equivalent, that is always enabled.
#define av_assert2(cond)
assert() equivalent, that does lie in speed critical code.
static void sum_a(const int *input, int *output, int len)
static const uint64_t layouts[]
enum AVSampleFormat out_sample_fmt
output sample format
int av_sample_fmt_is_planar(enum AVSampleFormat sample_fmt)
Check if the sample format is planar.
#define AV_CH_LAYOUT_5POINT1
libswresample public header
static void sum_b(const int *input, int *output, int len)
static __device__ float fabs(float a)
The libswresample context.
int av_opt_set_int(void *obj, const char *name, int64_t val, int search_flags)
simple assert() macros that are a bit more flexible than ISO C assert().
#define AV_CH_LAYOUT_QUAD
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.
int main(int argc, char **argv)
audio channel layout utility functions
int64_t out_ch_layout
output channel layout
struct SwrContext * swr_alloc_set_opts(struct SwrContext *s, int64_t out_ch_layout, enum AVSampleFormat out_sample_fmt, int out_sample_rate, int64_t in_ch_layout, enum AVSampleFormat in_sample_fmt, int in_sample_rate, int log_offset, void *log_ctx)
Allocate SwrContext if needed and set/reset common parameters.
int in_sample_rate
input sample rate
#define AV_CH_LAYOUT_5POINT1_BACK
#define FF_ARRAY_ELEMS(a)
void av_get_channel_layout_string(char *buf, int buf_size, int nb_channels, uint64_t channel_layout)
Return a description of a channel layout.
#define AV_LOG_INFO
Standard information.
AVSampleFormat
Audio sample formats.
static void test(const char *pattern, const char *host)
uint8_t pi<< 24) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0f/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_U8, uint8_t,(*(const uint8_t *) pi-0x80)*(1.0/(1<< 7))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S16, int16_t,(*(const int16_t *) pi >> 8)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0f/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S16, int16_t,*(const int16_t *) pi *(1.0/(1<< 15))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_S32, int32_t,(*(const int32_t *) pi >> 24)+0x80) CONV_FUNC_GROUP(AV_SAMPLE_FMT_FLT, float, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0f/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_DBL, double, AV_SAMPLE_FMT_S32, int32_t,*(const int32_t *) pi *(1.0/(1U<< 31))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_FLT, float, av_clip_uint8(lrintf(*(const float *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_FLT, float, av_clip_int16(lrintf(*(const float *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_FLT, float, av_clipl_int32(llrintf(*(const float *) pi *(1U<< 31)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_U8, uint8_t, AV_SAMPLE_FMT_DBL, double, av_clip_uint8(lrint(*(const double *) pi *(1<< 7))+0x80)) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S16, int16_t, AV_SAMPLE_FMT_DBL, double, av_clip_int16(lrint(*(const double *) pi *(1<< 15)))) CONV_FUNC_GROUP(AV_SAMPLE_FMT_S32, int32_t, AV_SAMPLE_FMT_DBL, double, av_clipl_int32(llrint(*(const double *) pi *(1U<< 31))))#define SET_CONV_FUNC_GROUP(ofmt, ifmt) static void set_generic_function(AudioConvert *ac){}void ff_audio_convert_free(AudioConvert **ac){if(!*ac) return;ff_dither_free(&(*ac) ->dc);av_freep(ac);}AudioConvert *ff_audio_convert_alloc(AVAudioResampleContext *avr, enum AVSampleFormat out_fmt, enum AVSampleFormat in_fmt, int channels, int sample_rate, int apply_map){AudioConvert *ac;int in_planar, out_planar;ac=av_mallocz(sizeof(*ac));if(!ac) return NULL;ac->avr=avr;ac->out_fmt=out_fmt;ac->in_fmt=in_fmt;ac->channels=channels;ac->apply_map=apply_map;if(avr->dither_method!=AV_RESAMPLE_DITHER_NONE &&av_get_packed_sample_fmt(out_fmt)==AV_SAMPLE_FMT_S16 &&av_get_bytes_per_sample(in_fmt) > 2){ac->dc=ff_dither_alloc(avr, out_fmt, in_fmt, channels, sample_rate, apply_map);if(!ac->dc){av_free(ac);return NULL;}return ac;}in_planar=ff_sample_fmt_is_planar(in_fmt, channels);out_planar=ff_sample_fmt_is_planar(out_fmt, channels);if(in_planar==out_planar){ac->func_type=CONV_FUNC_TYPE_FLAT;ac->planes=in_planar?ac->channels:1;}else if(in_planar) ac->func_type=CONV_FUNC_TYPE_INTERLEAVE;else ac->func_type=CONV_FUNC_TYPE_DEINTERLEAVE;set_generic_function(ac);if(ARCH_AARCH64) ff_audio_convert_init_aarch64(ac);if(ARCH_ARM) ff_audio_convert_init_arm(ac);if(ARCH_X86) ff_audio_convert_init_x86(ac);return ac;}int ff_audio_convert(AudioConvert *ac, AudioData *out, AudioData *in){int use_generic=1;int len=in->nb_samples;int p;if(ac->dc){av_log(ac->avr, AV_LOG_TRACE,"%d samples - audio_convert: %s to %s (dithered)\n", len, av_get_sample_fmt_name(ac->in_fmt), av_get_sample_fmt_name(ac->out_fmt));return ff_convert_dither(ac-> in
#define AV_CH_LAYOUT_5POINT0_BACK
enum AVSampleFormat in_sample_fmt
input sample format
int attribute_align_arg swr_convert(struct SwrContext *s, uint8_t *out_arg[SWR_CH_MAX], int out_count, const uint8_t *in_arg[SWR_CH_MAX], int in_count)
#define AV_CH_LAYOUT_7POINT1_WIDE
int av_get_bytes_per_sample(enum AVSampleFormat sample_fmt)
Return number of bytes per sample.
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...
int64_t in_ch_layout
input channel layout
common internal and external API header
static void audiogen(void *data, enum AVSampleFormat sample_fmt, int channels, int sample_rate, int nb_samples)
static void setup_array(uint8_t *out[SWR_CH_MAX], uint8_t *in, enum AVSampleFormat format, int samples)
static int cmp(const void *a, const void *b)
Filter the word “frame” indicates either a video frame or a group of audio samples
#define FFSWAP(type, a, b)
#define AV_CH_LAYOUT_MONO
mode
Use these values in ebur128_init (or'ed).
av_cold int swr_init(struct SwrContext *s)
Initialize context after user parameters have been set.