soxr_resample.c
Go to the documentation of this file.
1 /*
2  * audio resampling with soxr
3  * Copyright (c) 2012 Rob Sykes <robs@users.sourceforge.net>
4  *
5  * This file is part of FFmpeg.
6  *
7  * FFmpeg is free software; you can redistribute it and/or
8  * modify it under the terms of the GNU Lesser General Public
9  * License as published by the Free Software Foundation; either
10  * version 2.1 of the License, or (at your option) any later version.
11  *
12  * FFmpeg is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15  * Lesser General Public License for more details.
16  *
17  * You should have received a copy of the GNU Lesser General Public
18  * License along with FFmpeg; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20  */
21 
22 /**
23  * @file
24  * audio resampling with soxr
25  */
26 
27 #include "libavutil/log.h"
28 #include "swresample_internal.h"
29 
30 #include <soxr.h>
31 
32 static struct ResampleContext *create(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear,
33  double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby){
34  soxr_error_t error;
35 
36  soxr_datatype_t type =
37  format == AV_SAMPLE_FMT_S16P? SOXR_INT16_S :
38  format == AV_SAMPLE_FMT_S16 ? SOXR_INT16_I :
39  format == AV_SAMPLE_FMT_S32P? SOXR_INT32_S :
40  format == AV_SAMPLE_FMT_S32 ? SOXR_INT32_I :
41  format == AV_SAMPLE_FMT_FLTP? SOXR_FLOAT32_S :
42  format == AV_SAMPLE_FMT_FLT ? SOXR_FLOAT32_I :
43  format == AV_SAMPLE_FMT_DBLP? SOXR_FLOAT64_S :
44  format == AV_SAMPLE_FMT_DBL ? SOXR_FLOAT64_I : (soxr_datatype_t)-1;
45 
46  soxr_io_spec_t io_spec = soxr_io_spec(type, type);
47 
48  soxr_quality_spec_t q_spec = soxr_quality_spec((int)((precision-2)/4), (SOXR_HI_PREC_CLOCK|SOXR_ROLLOFF_NONE)*!!cheby);
49  q_spec.precision = linear? 0 : precision;
50 #if !defined SOXR_VERSION /* Deprecated @ March 2013: */
51  q_spec.bw_pc = cutoff? FFMAX(FFMIN(cutoff,.995),.8)*100 : q_spec.bw_pc;
52 #else
53  q_spec.passband_end = cutoff? FFMAX(FFMIN(cutoff,.995),.8) : q_spec.passband_end;
54 #endif
55 
56  soxr_delete((soxr_t)c);
57  c = (struct ResampleContext *)
58  soxr_create(in_rate, out_rate, 0, &error, &io_spec, &q_spec, 0);
59  if (!c)
60  av_log(NULL, AV_LOG_ERROR, "soxr_create: %s\n", error);
61  return c;
62 }
63 
64 static void destroy(struct ResampleContext * *c){
65  soxr_delete((soxr_t)*c);
66  *c = NULL;
67 }
68 
69 static int flush(struct SwrContext *s){
70  soxr_process((soxr_t)s->resample, NULL, 0, NULL, NULL, 0, NULL);
71  return 0;
72 }
73 
74 static int process(
75  struct ResampleContext * c, AudioData *dst, int dst_size,
76  AudioData *src, int src_size, int *consumed){
77  size_t idone, odone;
78  soxr_error_t error = soxr_set_error((soxr_t)c, soxr_set_num_channels((soxr_t)c, src->ch_count));
79  error = soxr_process((soxr_t)c, src->ch, (size_t)src_size,
80  &idone, dst->ch, (size_t)dst_size, &odone);
81  *consumed = (int)idone;
82  return error? -1 : odone;
83 }
84 
85 static int64_t get_delay(struct SwrContext *s, int64_t base){
86  double delay_s = soxr_delay((soxr_t)s->resample) / s->out_sample_rate;
87  return (int64_t)(delay_s * base + .5);
88 }
89 
90 struct Resampler const soxr_resampler={
91  create, destroy, process, flush, NULL /* set_compensation */, get_delay,
92 };
93 
static struct ResampleContext * create(struct ResampleContext *c, int out_rate, int in_rate, int filter_size, int phase_shift, int linear, double cutoff, enum AVSampleFormat format, enum SwrFilterType filter_type, int kaiser_beta, double precision, int cheby)
Definition: soxr_resample.c:32
const char * s
Definition: avisynth_c.h:668
int out_sample_rate
output sample rate
Audio buffer used for intermediate storage between conversion phases.
Definition: oss_audio.c:46
int ch_count
number of channels
SwrFilterType
Resampling Filter Types.
Definition: swresample.h:134
static int64_t get_delay(struct SwrContext *s, int64_t base)
Definition: soxr_resample.c:85
struct ResampleContext * resample
resampling context
signed 16 bits
Definition: samplefmt.h:52
static int process(struct ResampleContext *c, AudioData *dst, int dst_size, AudioData *src, int src_size, int *consumed)
Definition: soxr_resample.c:74
enum AVResampleFilterType filter_type
signed 32 bits, planar
Definition: samplefmt.h:59
float, planar
Definition: samplefmt.h:60
void av_log(void *avcl, int level, const char *fmt,...)
Definition: log.c:246
#define FFMAX(a, b)
Definition: common.h:56
signed 32 bits
Definition: samplefmt.h:53
#define FFMIN(a, b)
Definition: common.h:58
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 format(the sample packing is implied by the sample format) and sample rate.The lists are not just lists
static int flush(struct SwrContext *s)
Definition: soxr_resample.c:69
static void destroy(struct ResampleContext **c)
Definition: soxr_resample.c:64
NULL
Definition: eval.c:55
AVS_Value src
Definition: avisynth_c.h:523
#define AV_LOG_ERROR
Something went wrong and cannot losslessly be recovered.
Definition: log.h:148
#define type
static double c[64]
AVSampleFormat
Audio Sample Formats.
Definition: samplefmt.h:49
else dst[i][x+y *dst_stride[i]]
Definition: vf_mcdeint.c:160
signed 16 bits, planar
Definition: samplefmt.h:58
uint8_t * ch[SWR_CH_MAX]
samples buffer per channel
double, planar
Definition: samplefmt.h:61
struct Resampler const soxr_resampler
Definition: soxr_resample.c:90