1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Copyright (c) 2002 Fabrice Bellard 3cabdff1aSopenharmony_ci * Copyright (c) 2012 Justin Ruggles <justin.ruggles@gmail.com> 4cabdff1aSopenharmony_ci * 5cabdff1aSopenharmony_ci * This file is part of FFmpeg. 6cabdff1aSopenharmony_ci * 7cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 8cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 9cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 10cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 11cabdff1aSopenharmony_ci * 12cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 13cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 14cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15cabdff1aSopenharmony_ci * Lesser General Public License for more details. 16cabdff1aSopenharmony_ci * 17cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 18cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 19cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 20cabdff1aSopenharmony_ci */ 21cabdff1aSopenharmony_ci 22cabdff1aSopenharmony_ci#include <stdint.h> 23cabdff1aSopenharmony_ci#include <stdio.h> 24cabdff1aSopenharmony_ci 25cabdff1aSopenharmony_ci#include "libavutil/avstring.h" 26cabdff1aSopenharmony_ci#include "libavutil/common.h" 27cabdff1aSopenharmony_ci#include "libavutil/lfg.h" 28cabdff1aSopenharmony_ci#include "libavutil/libm.h" 29cabdff1aSopenharmony_ci#include "libavutil/log.h" 30cabdff1aSopenharmony_ci#include "libavutil/mem.h" 31cabdff1aSopenharmony_ci#include "libavutil/opt.h" 32cabdff1aSopenharmony_ci#include "libavutil/samplefmt.h" 33cabdff1aSopenharmony_ci 34cabdff1aSopenharmony_ci#include "libavresample/avresample.h" 35cabdff1aSopenharmony_ci 36cabdff1aSopenharmony_cistatic double dbl_rand(AVLFG *lfg) 37cabdff1aSopenharmony_ci{ 38cabdff1aSopenharmony_ci return 2.0 * (av_lfg_get(lfg) / (double)UINT_MAX) - 1.0; 39cabdff1aSopenharmony_ci} 40cabdff1aSopenharmony_ci 41cabdff1aSopenharmony_ci#define PUT_FUNC(name, fmt, type, expr) \ 42cabdff1aSopenharmony_cistatic void put_sample_ ## name(void **data, enum AVSampleFormat sample_fmt,\ 43cabdff1aSopenharmony_ci int channels, int sample, int ch, \ 44cabdff1aSopenharmony_ci double v_dbl) \ 45cabdff1aSopenharmony_ci{ \ 46cabdff1aSopenharmony_ci type v = expr; \ 47cabdff1aSopenharmony_ci type **out = (type **)data; \ 48cabdff1aSopenharmony_ci if (av_sample_fmt_is_planar(sample_fmt)) \ 49cabdff1aSopenharmony_ci out[ch][sample] = v; \ 50cabdff1aSopenharmony_ci else \ 51cabdff1aSopenharmony_ci out[0][sample * channels + ch] = v; \ 52cabdff1aSopenharmony_ci} 53cabdff1aSopenharmony_ci 54cabdff1aSopenharmony_ciPUT_FUNC(u8, AV_SAMPLE_FMT_U8, uint8_t, av_clip_uint8 ( lrint(v_dbl * (1 << 7)) + 128)) 55cabdff1aSopenharmony_ciPUT_FUNC(s16, AV_SAMPLE_FMT_S16, int16_t, av_clip_int16 ( lrint(v_dbl * (1 << 15)))) 56cabdff1aSopenharmony_ciPUT_FUNC(s32, AV_SAMPLE_FMT_S32, int32_t, av_clipl_int32(llrint(v_dbl * (1U << 31)))) 57cabdff1aSopenharmony_ciPUT_FUNC(flt, AV_SAMPLE_FMT_FLT, float, v_dbl) 58cabdff1aSopenharmony_ciPUT_FUNC(dbl, AV_SAMPLE_FMT_DBL, double, v_dbl) 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_cistatic void put_sample(void **data, enum AVSampleFormat sample_fmt, 61cabdff1aSopenharmony_ci int channels, int sample, int ch, double v_dbl) 62cabdff1aSopenharmony_ci{ 63cabdff1aSopenharmony_ci switch (av_get_packed_sample_fmt(sample_fmt)) { 64cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_U8: 65cabdff1aSopenharmony_ci put_sample_u8(data, sample_fmt, channels, sample, ch, v_dbl); 66cabdff1aSopenharmony_ci break; 67cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_S16: 68cabdff1aSopenharmony_ci put_sample_s16(data, sample_fmt, channels, sample, ch, v_dbl); 69cabdff1aSopenharmony_ci break; 70cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_S32: 71cabdff1aSopenharmony_ci put_sample_s32(data, sample_fmt, channels, sample, ch, v_dbl); 72cabdff1aSopenharmony_ci break; 73cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_FLT: 74cabdff1aSopenharmony_ci put_sample_flt(data, sample_fmt, channels, sample, ch, v_dbl); 75cabdff1aSopenharmony_ci break; 76cabdff1aSopenharmony_ci case AV_SAMPLE_FMT_DBL: 77cabdff1aSopenharmony_ci put_sample_dbl(data, sample_fmt, channels, sample, ch, v_dbl); 78cabdff1aSopenharmony_ci break; 79cabdff1aSopenharmony_ci } 80cabdff1aSopenharmony_ci} 81cabdff1aSopenharmony_ci 82cabdff1aSopenharmony_cistatic void audiogen(AVLFG *rnd, void **data, enum AVSampleFormat sample_fmt, 83cabdff1aSopenharmony_ci int channels, int sample_rate, int nb_samples) 84cabdff1aSopenharmony_ci{ 85cabdff1aSopenharmony_ci int i, ch, k; 86cabdff1aSopenharmony_ci double v, f, a, ampa; 87cabdff1aSopenharmony_ci double tabf1[AVRESAMPLE_MAX_CHANNELS]; 88cabdff1aSopenharmony_ci double tabf2[AVRESAMPLE_MAX_CHANNELS]; 89cabdff1aSopenharmony_ci double taba[AVRESAMPLE_MAX_CHANNELS]; 90cabdff1aSopenharmony_ci 91cabdff1aSopenharmony_ci#define PUT_SAMPLE put_sample(data, sample_fmt, channels, k, ch, v); 92cabdff1aSopenharmony_ci 93cabdff1aSopenharmony_ci k = 0; 94cabdff1aSopenharmony_ci 95cabdff1aSopenharmony_ci /* 1 second of single freq sine at 1000 Hz */ 96cabdff1aSopenharmony_ci a = 0; 97cabdff1aSopenharmony_ci for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) { 98cabdff1aSopenharmony_ci v = sin(a) * 0.30; 99cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 100cabdff1aSopenharmony_ci PUT_SAMPLE 101cabdff1aSopenharmony_ci a += M_PI * 1000.0 * 2.0 / sample_rate; 102cabdff1aSopenharmony_ci } 103cabdff1aSopenharmony_ci 104cabdff1aSopenharmony_ci /* 1 second of varying frequency between 100 and 10000 Hz */ 105cabdff1aSopenharmony_ci a = 0; 106cabdff1aSopenharmony_ci for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) { 107cabdff1aSopenharmony_ci v = sin(a) * 0.30; 108cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 109cabdff1aSopenharmony_ci PUT_SAMPLE 110cabdff1aSopenharmony_ci f = 100.0 + (((10000.0 - 100.0) * i) / sample_rate); 111cabdff1aSopenharmony_ci a += M_PI * f * 2.0 / sample_rate; 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci /* 0.5 second of low amplitude white noise */ 115cabdff1aSopenharmony_ci for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) { 116cabdff1aSopenharmony_ci v = dbl_rand(rnd) * 0.30; 117cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 118cabdff1aSopenharmony_ci PUT_SAMPLE 119cabdff1aSopenharmony_ci } 120cabdff1aSopenharmony_ci 121cabdff1aSopenharmony_ci /* 0.5 second of high amplitude white noise */ 122cabdff1aSopenharmony_ci for (i = 0; i < sample_rate / 2 && k < nb_samples; i++, k++) { 123cabdff1aSopenharmony_ci v = dbl_rand(rnd); 124cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) 125cabdff1aSopenharmony_ci PUT_SAMPLE 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci 128cabdff1aSopenharmony_ci /* 1 second of unrelated ramps for each channel */ 129cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 130cabdff1aSopenharmony_ci taba[ch] = 0; 131cabdff1aSopenharmony_ci tabf1[ch] = 100 + av_lfg_get(rnd) % 5000; 132cabdff1aSopenharmony_ci tabf2[ch] = 100 + av_lfg_get(rnd) % 5000; 133cabdff1aSopenharmony_ci } 134cabdff1aSopenharmony_ci for (i = 0; i < 1 * sample_rate && k < nb_samples; i++, k++) { 135cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 136cabdff1aSopenharmony_ci v = sin(taba[ch]) * 0.30; 137cabdff1aSopenharmony_ci PUT_SAMPLE 138cabdff1aSopenharmony_ci f = tabf1[ch] + (((tabf2[ch] - tabf1[ch]) * i) / sample_rate); 139cabdff1aSopenharmony_ci taba[ch] += M_PI * f * 2.0 / sample_rate; 140cabdff1aSopenharmony_ci } 141cabdff1aSopenharmony_ci } 142cabdff1aSopenharmony_ci 143cabdff1aSopenharmony_ci /* 2 seconds of 500 Hz with varying volume */ 144cabdff1aSopenharmony_ci a = 0; 145cabdff1aSopenharmony_ci ampa = 0; 146cabdff1aSopenharmony_ci for (i = 0; i < 2 * sample_rate && k < nb_samples; i++, k++) { 147cabdff1aSopenharmony_ci for (ch = 0; ch < channels; ch++) { 148cabdff1aSopenharmony_ci double amp = (1.0 + sin(ampa)) * 0.15; 149cabdff1aSopenharmony_ci if (ch & 1) 150cabdff1aSopenharmony_ci amp = 0.30 - amp; 151cabdff1aSopenharmony_ci v = sin(a) * amp; 152cabdff1aSopenharmony_ci PUT_SAMPLE 153cabdff1aSopenharmony_ci a += M_PI * 500.0 * 2.0 / sample_rate; 154cabdff1aSopenharmony_ci ampa += M_PI * 2.0 / sample_rate; 155cabdff1aSopenharmony_ci } 156cabdff1aSopenharmony_ci } 157cabdff1aSopenharmony_ci} 158cabdff1aSopenharmony_ci 159cabdff1aSopenharmony_ci/* formats, rates, and layouts are ordered for priority in testing. 160cabdff1aSopenharmony_ci e.g. 'avresample-test 4 2 2' will test all input/output combinations of 161cabdff1aSopenharmony_ci S16/FLTP/S16P/FLT, 48000/44100, and stereo/mono */ 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_cistatic const enum AVSampleFormat formats[] = { 164cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S16, 165cabdff1aSopenharmony_ci AV_SAMPLE_FMT_FLTP, 166cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S16P, 167cabdff1aSopenharmony_ci AV_SAMPLE_FMT_FLT, 168cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32P, 169cabdff1aSopenharmony_ci AV_SAMPLE_FMT_S32, 170cabdff1aSopenharmony_ci AV_SAMPLE_FMT_U8P, 171cabdff1aSopenharmony_ci AV_SAMPLE_FMT_U8, 172cabdff1aSopenharmony_ci AV_SAMPLE_FMT_DBLP, 173cabdff1aSopenharmony_ci AV_SAMPLE_FMT_DBL, 174cabdff1aSopenharmony_ci}; 175cabdff1aSopenharmony_ci 176cabdff1aSopenharmony_cistatic const int rates[] = { 177cabdff1aSopenharmony_ci 48000, 178cabdff1aSopenharmony_ci 44100, 179cabdff1aSopenharmony_ci 16000 180cabdff1aSopenharmony_ci}; 181cabdff1aSopenharmony_ci 182cabdff1aSopenharmony_cistatic const uint64_t layouts[] = { 183cabdff1aSopenharmony_ci AV_CH_LAYOUT_STEREO, 184cabdff1aSopenharmony_ci AV_CH_LAYOUT_MONO, 185cabdff1aSopenharmony_ci AV_CH_LAYOUT_5POINT1, 186cabdff1aSopenharmony_ci AV_CH_LAYOUT_7POINT1, 187cabdff1aSopenharmony_ci}; 188cabdff1aSopenharmony_ci 189cabdff1aSopenharmony_ciint main(int argc, char **argv) 190cabdff1aSopenharmony_ci{ 191cabdff1aSopenharmony_ci AVAudioResampleContext *s; 192cabdff1aSopenharmony_ci AVLFG rnd; 193cabdff1aSopenharmony_ci int ret = 0; 194cabdff1aSopenharmony_ci uint8_t *in_buf = NULL; 195cabdff1aSopenharmony_ci uint8_t *out_buf = NULL; 196cabdff1aSopenharmony_ci unsigned int in_buf_size; 197cabdff1aSopenharmony_ci unsigned int out_buf_size; 198cabdff1aSopenharmony_ci uint8_t *in_data[AVRESAMPLE_MAX_CHANNELS] = { 0 }; 199cabdff1aSopenharmony_ci uint8_t *out_data[AVRESAMPLE_MAX_CHANNELS] = { 0 }; 200cabdff1aSopenharmony_ci int in_linesize; 201cabdff1aSopenharmony_ci int out_linesize; 202cabdff1aSopenharmony_ci uint64_t in_ch_layout; 203cabdff1aSopenharmony_ci int in_channels; 204cabdff1aSopenharmony_ci enum AVSampleFormat in_fmt; 205cabdff1aSopenharmony_ci int in_rate; 206cabdff1aSopenharmony_ci uint64_t out_ch_layout; 207cabdff1aSopenharmony_ci int out_channels; 208cabdff1aSopenharmony_ci enum AVSampleFormat out_fmt; 209cabdff1aSopenharmony_ci int out_rate; 210cabdff1aSopenharmony_ci int num_formats, num_rates, num_layouts; 211cabdff1aSopenharmony_ci int i, j, k, l, m, n; 212cabdff1aSopenharmony_ci 213cabdff1aSopenharmony_ci num_formats = 2; 214cabdff1aSopenharmony_ci num_rates = 2; 215cabdff1aSopenharmony_ci num_layouts = 2; 216cabdff1aSopenharmony_ci if (argc > 1) { 217cabdff1aSopenharmony_ci if (!av_strncasecmp(argv[1], "-h", 3)) { 218cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "Usage: avresample-test [<num formats> " 219cabdff1aSopenharmony_ci "[<num sample rates> [<num channel layouts>]]]\n" 220cabdff1aSopenharmony_ci "Default is 2 2 2\n"); 221cabdff1aSopenharmony_ci return 0; 222cabdff1aSopenharmony_ci } 223cabdff1aSopenharmony_ci num_formats = strtol(argv[1], NULL, 0); 224cabdff1aSopenharmony_ci num_formats = av_clip(num_formats, 1, FF_ARRAY_ELEMS(formats)); 225cabdff1aSopenharmony_ci } 226cabdff1aSopenharmony_ci if (argc > 2) { 227cabdff1aSopenharmony_ci num_rates = strtol(argv[2], NULL, 0); 228cabdff1aSopenharmony_ci num_rates = av_clip(num_rates, 1, FF_ARRAY_ELEMS(rates)); 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci if (argc > 3) { 231cabdff1aSopenharmony_ci num_layouts = strtol(argv[3], NULL, 0); 232cabdff1aSopenharmony_ci num_layouts = av_clip(num_layouts, 1, FF_ARRAY_ELEMS(layouts)); 233cabdff1aSopenharmony_ci } 234cabdff1aSopenharmony_ci 235cabdff1aSopenharmony_ci av_log_set_level(AV_LOG_DEBUG); 236cabdff1aSopenharmony_ci 237cabdff1aSopenharmony_ci av_lfg_init(&rnd, 0xC0FFEE); 238cabdff1aSopenharmony_ci 239cabdff1aSopenharmony_ci in_buf_size = av_samples_get_buffer_size(&in_linesize, 8, 48000 * 6, 240cabdff1aSopenharmony_ci AV_SAMPLE_FMT_DBLP, 0); 241cabdff1aSopenharmony_ci out_buf_size = in_buf_size; 242cabdff1aSopenharmony_ci 243cabdff1aSopenharmony_ci in_buf = av_malloc(in_buf_size); 244cabdff1aSopenharmony_ci if (!in_buf) 245cabdff1aSopenharmony_ci goto end; 246cabdff1aSopenharmony_ci out_buf = av_malloc(out_buf_size); 247cabdff1aSopenharmony_ci if (!out_buf) 248cabdff1aSopenharmony_ci goto end; 249cabdff1aSopenharmony_ci 250cabdff1aSopenharmony_ci s = avresample_alloc_context(); 251cabdff1aSopenharmony_ci if (!s) { 252cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "Error allocating AVAudioResampleContext\n"); 253cabdff1aSopenharmony_ci ret = 1; 254cabdff1aSopenharmony_ci goto end; 255cabdff1aSopenharmony_ci } 256cabdff1aSopenharmony_ci 257cabdff1aSopenharmony_ci for (i = 0; i < num_formats; i++) { 258cabdff1aSopenharmony_ci in_fmt = formats[i]; 259cabdff1aSopenharmony_ci for (k = 0; k < num_layouts; k++) { 260cabdff1aSopenharmony_ci in_ch_layout = layouts[k]; 261cabdff1aSopenharmony_ci in_channels = av_get_channel_layout_nb_channels(in_ch_layout); 262cabdff1aSopenharmony_ci for (m = 0; m < num_rates; m++) { 263cabdff1aSopenharmony_ci in_rate = rates[m]; 264cabdff1aSopenharmony_ci 265cabdff1aSopenharmony_ci ret = av_samples_fill_arrays(in_data, &in_linesize, in_buf, 266cabdff1aSopenharmony_ci in_channels, in_rate * 6, 267cabdff1aSopenharmony_ci in_fmt, 0); 268cabdff1aSopenharmony_ci if (ret < 0) { 269cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "failed in_data fill arrays\n"); 270cabdff1aSopenharmony_ci goto end; 271cabdff1aSopenharmony_ci } 272cabdff1aSopenharmony_ci audiogen(&rnd, (void **)in_data, in_fmt, in_channels, in_rate, in_rate * 6); 273cabdff1aSopenharmony_ci 274cabdff1aSopenharmony_ci for (j = 0; j < num_formats; j++) { 275cabdff1aSopenharmony_ci out_fmt = formats[j]; 276cabdff1aSopenharmony_ci for (l = 0; l < num_layouts; l++) { 277cabdff1aSopenharmony_ci out_ch_layout = layouts[l]; 278cabdff1aSopenharmony_ci out_channels = av_get_channel_layout_nb_channels(out_ch_layout); 279cabdff1aSopenharmony_ci for (n = 0; n < num_rates; n++) { 280cabdff1aSopenharmony_ci out_rate = rates[n]; 281cabdff1aSopenharmony_ci 282cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "%s to %s, %d to %d channels, %d Hz to %d Hz\n", 283cabdff1aSopenharmony_ci av_get_sample_fmt_name(in_fmt), av_get_sample_fmt_name(out_fmt), 284cabdff1aSopenharmony_ci in_channels, out_channels, in_rate, out_rate); 285cabdff1aSopenharmony_ci 286cabdff1aSopenharmony_ci ret = av_samples_fill_arrays(out_data, &out_linesize, 287cabdff1aSopenharmony_ci out_buf, out_channels, 288cabdff1aSopenharmony_ci out_rate * 6, out_fmt, 0); 289cabdff1aSopenharmony_ci if (ret < 0) { 290cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "failed out_data fill arrays\n"); 291cabdff1aSopenharmony_ci goto end; 292cabdff1aSopenharmony_ci } 293cabdff1aSopenharmony_ci 294cabdff1aSopenharmony_ci av_opt_set_int(s, "in_channel_layout", in_ch_layout, 0); 295cabdff1aSopenharmony_ci av_opt_set_int(s, "in_sample_fmt", in_fmt, 0); 296cabdff1aSopenharmony_ci av_opt_set_int(s, "in_sample_rate", in_rate, 0); 297cabdff1aSopenharmony_ci av_opt_set_int(s, "out_channel_layout", out_ch_layout, 0); 298cabdff1aSopenharmony_ci av_opt_set_int(s, "out_sample_fmt", out_fmt, 0); 299cabdff1aSopenharmony_ci av_opt_set_int(s, "out_sample_rate", out_rate, 0); 300cabdff1aSopenharmony_ci 301cabdff1aSopenharmony_ci av_opt_set_int(s, "internal_sample_fmt", AV_SAMPLE_FMT_FLTP, 0); 302cabdff1aSopenharmony_ci 303cabdff1aSopenharmony_ci ret = avresample_open(s); 304cabdff1aSopenharmony_ci if (ret < 0) { 305cabdff1aSopenharmony_ci av_log(s, AV_LOG_ERROR, "Error opening context\n"); 306cabdff1aSopenharmony_ci goto end; 307cabdff1aSopenharmony_ci } 308cabdff1aSopenharmony_ci 309cabdff1aSopenharmony_ci ret = avresample_convert(s, out_data, out_linesize, out_rate * 6, 310cabdff1aSopenharmony_ci in_data, in_linesize, in_rate * 6); 311cabdff1aSopenharmony_ci if (ret < 0) { 312cabdff1aSopenharmony_ci char errbuf[256]; 313cabdff1aSopenharmony_ci av_strerror(ret, errbuf, sizeof(errbuf)); 314cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_ERROR, "%s\n", errbuf); 315cabdff1aSopenharmony_ci goto end; 316cabdff1aSopenharmony_ci } 317cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "Converted %d samples to %d samples\n", 318cabdff1aSopenharmony_ci in_rate * 6, ret); 319cabdff1aSopenharmony_ci if (avresample_get_delay(s) > 0) 320cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "%d delay samples not converted\n", 321cabdff1aSopenharmony_ci avresample_get_delay(s)); 322cabdff1aSopenharmony_ci if (avresample_available(s) > 0) 323cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "%d samples available for output\n", 324cabdff1aSopenharmony_ci avresample_available(s)); 325cabdff1aSopenharmony_ci av_log(NULL, AV_LOG_INFO, "\n"); 326cabdff1aSopenharmony_ci 327cabdff1aSopenharmony_ci avresample_close(s); 328cabdff1aSopenharmony_ci } 329cabdff1aSopenharmony_ci } 330cabdff1aSopenharmony_ci } 331cabdff1aSopenharmony_ci } 332cabdff1aSopenharmony_ci } 333cabdff1aSopenharmony_ci } 334cabdff1aSopenharmony_ci 335cabdff1aSopenharmony_ci ret = 0; 336cabdff1aSopenharmony_ci 337cabdff1aSopenharmony_ciend: 338cabdff1aSopenharmony_ci av_freep(&in_buf); 339cabdff1aSopenharmony_ci av_freep(&out_buf); 340cabdff1aSopenharmony_ci avresample_free(&s); 341cabdff1aSopenharmony_ci return ret; 342cabdff1aSopenharmony_ci} 343