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