2 * Copyright (C) 2011-2013 Michael Niedermayer (michaelni@gmx.at)
4 * This file is part of libswresample
6 * libswresample is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * libswresample is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with libswresample; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "libavutil/opt.h"
22 #include "swresample_internal.h"
27 #define C15DB 1.189207115
29 #define C_15DB 0.840896415
30 #define C_30DB M_SQRT1_2
31 #define C_45DB 0.594603558
34 #define OFFSET(x) offsetof(SwrContext,x)
35 #define PARAM AV_OPT_FLAG_AUDIO_PARAM
37 static const AVOption options
[]={
38 {"ich" , "set input channel count" , OFFSET( in
.ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
39 {"in_channel_count" , "set input channel count" , OFFSET( in
.ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
40 {"och" , "set output channel count" , OFFSET(out
.ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
41 {"out_channel_count" , "set output channel count" , OFFSET(out
.ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
42 {"uch" , "set used channel count" , OFFSET(used_ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
43 {"used_channel_count" , "set used channel count" , OFFSET(used_ch_count
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_CH_MAX
, PARAM
},
44 {"isr" , "set input sample rate" , OFFSET( in_sample_rate
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , INT_MAX
, PARAM
},
45 {"in_sample_rate" , "set input sample rate" , OFFSET( in_sample_rate
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , INT_MAX
, PARAM
},
46 {"osr" , "set output sample rate" , OFFSET(out_sample_rate
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , INT_MAX
, PARAM
},
47 {"out_sample_rate" , "set output sample rate" , OFFSET(out_sample_rate
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , INT_MAX
, PARAM
},
48 {"isf" , "set input sample format" , OFFSET( in_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
49 {"in_sample_fmt" , "set input sample format" , OFFSET( in_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
50 {"osf" , "set output sample format" , OFFSET(out_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
51 {"out_sample_fmt" , "set output sample format" , OFFSET(out_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
52 {"tsf" , "set internal sample format" , OFFSET(int_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
53 {"internal_sample_fmt" , "set internal sample format" , OFFSET(int_sample_fmt
), AV_OPT_TYPE_SAMPLE_FMT
, {.i64
=AV_SAMPLE_FMT_NONE
}, -1 , INT_MAX
, PARAM
},
54 {"icl" , "set input channel layout" , OFFSET( in_ch_layout
), AV_OPT_TYPE_CHANNEL_LAYOUT
, {.i64
=0 }, 0 , INT64_MAX
, PARAM
, "channel_layout"},
55 {"in_channel_layout" , "set input channel layout" , OFFSET( in_ch_layout
), AV_OPT_TYPE_CHANNEL_LAYOUT
, {.i64
=0 }, 0 , INT64_MAX
, PARAM
, "channel_layout"},
56 {"ocl" , "set output channel layout" , OFFSET(out_ch_layout
), AV_OPT_TYPE_CHANNEL_LAYOUT
, {.i64
=0 }, 0 , INT64_MAX
, PARAM
, "channel_layout"},
57 {"out_channel_layout" , "set output channel layout" , OFFSET(out_ch_layout
), AV_OPT_TYPE_CHANNEL_LAYOUT
, {.i64
=0 }, 0 , INT64_MAX
, PARAM
, "channel_layout"},
58 {"clev" , "set center mix level" , OFFSET(clev
), AV_OPT_TYPE_FLOAT
, {.dbl
=C_30DB
}, -32 , 32 , PARAM
},
59 {"center_mix_level" , "set center mix level" , OFFSET(clev
), AV_OPT_TYPE_FLOAT
, {.dbl
=C_30DB
}, -32 , 32 , PARAM
},
60 {"slev" , "set surround mix level" , OFFSET(slev
), AV_OPT_TYPE_FLOAT
, {.dbl
=C_30DB
}, -32 , 32 , PARAM
},
61 {"surround_mix_level" , "set surround mix Level" , OFFSET(slev
), AV_OPT_TYPE_FLOAT
, {.dbl
=C_30DB
}, -32 , 32 , PARAM
},
62 {"lfe_mix_level" , "set LFE mix level" , OFFSET(lfe_mix_level
), AV_OPT_TYPE_FLOAT
, {.dbl
=0 }, -32 , 32 , PARAM
},
63 {"rmvol" , "set rematrix volume" , OFFSET(rematrix_volume
), AV_OPT_TYPE_FLOAT
, {.dbl
=1.0 }, -1000 , 1000 , PARAM
},
64 {"rematrix_volume" , "set rematrix volume" , OFFSET(rematrix_volume
), AV_OPT_TYPE_FLOAT
, {.dbl
=1.0 }, -1000 , 1000 , PARAM
},
65 {"rematrix_maxval" , "set rematrix maxval" , OFFSET(rematrix_maxval
), AV_OPT_TYPE_FLOAT
, {.dbl
=0.0 }, 0 , 1000 , PARAM
},
67 {"flags" , "set flags" , OFFSET(flags
), AV_OPT_TYPE_FLAGS
, {.i64
=0 }, 0 , UINT_MAX
, PARAM
, "flags"},
68 {"swr_flags" , "set flags" , OFFSET(flags
), AV_OPT_TYPE_FLAGS
, {.i64
=0 }, 0 , UINT_MAX
, PARAM
, "flags"},
69 {"res" , "force resampling" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_FLAG_RESAMPLE
}, INT_MIN
, INT_MAX
, PARAM
, "flags"},
71 {"dither_scale" , "set dither scale" , OFFSET(dither
.scale
), AV_OPT_TYPE_FLOAT
, {.dbl
=1 }, 0 , INT_MAX
, PARAM
},
73 {"dither_method" , "set dither method" , OFFSET(dither
.method
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_DITHER_NB
-1, PARAM
, "dither_method"},
74 {"rectangular" , "select rectangular dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_RECTANGULAR
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
75 {"triangular" , "select triangular dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_TRIANGULAR
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
76 {"triangular_hp" , "select triangular dither with high pass" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_TRIANGULAR_HIGHPASS
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
77 {"lipshitz" , "select lipshitz noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_LIPSHITZ
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
78 {"shibata" , "select shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_SHIBATA
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
79 {"low_shibata" , "select low shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_LOW_SHIBATA
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
80 {"high_shibata" , "select high shibata noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_HIGH_SHIBATA
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
81 {"f_weighted" , "select f-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_F_WEIGHTED
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
82 {"modified_e_weighted" , "select modified-e-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_MODIFIED_E_WEIGHTED
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
83 {"improved_e_weighted" , "select improved-e-weighted noise shaping dither" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_DITHER_NS_IMPROVED_E_WEIGHTED
}, INT_MIN
, INT_MAX
, PARAM
, "dither_method"},
85 {"filter_size" , "set swr resampling filter size", OFFSET(filter_size
) , AV_OPT_TYPE_INT
, {.i64
=32 }, 0 , INT_MAX
, PARAM
},
86 {"phase_shift" , "set swr resampling phase shift", OFFSET(phase_shift
) , AV_OPT_TYPE_INT
, {.i64
=10 }, 0 , 24 , PARAM
},
87 {"linear_interp" , "enable linear interpolation" , OFFSET(linear_interp
) , AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , 1 , PARAM
},
88 {"cutoff" , "set cutoff frequency ratio" , OFFSET(cutoff
) , AV_OPT_TYPE_DOUBLE
,{.dbl
=0. }, 0 , 1 , PARAM
},
90 /* duplicate option in order to work with avconv */
91 {"resample_cutoff" , "set cutoff frequency ratio" , OFFSET(cutoff
) , AV_OPT_TYPE_DOUBLE
,{.dbl
=0. }, 0 , 1 , PARAM
},
93 {"resampler" , "set resampling Engine" , OFFSET(engine
) , AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , SWR_ENGINE_NB
-1, PARAM
, "resampler"},
94 {"swr" , "select SW Resampler" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_ENGINE_SWR
}, INT_MIN
, INT_MAX
, PARAM
, "resampler"},
95 {"soxr" , "select SoX Resampler" , 0 , AV_OPT_TYPE_CONST
, {.i64
=SWR_ENGINE_SOXR
}, INT_MIN
, INT_MAX
, PARAM
, "resampler"},
96 {"precision" , "set soxr resampling precision (in bits)"
97 , OFFSET(precision
) , AV_OPT_TYPE_DOUBLE
,{.dbl
=20.0 }, 15.0 , 33.0 , PARAM
},
98 {"cheby" , "enable soxr Chebyshev passband & higher-precision irrational ratio approximation"
99 , OFFSET(cheby
) , AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , 1 , PARAM
},
100 {"min_comp" , "set minimum difference between timestamps and audio data (in seconds) below which no timestamp compensation of either kind is applied"
101 , OFFSET(min_compensation
),AV_OPT_TYPE_FLOAT
,{.dbl
=FLT_MAX
}, 0 , FLT_MAX
, PARAM
},
102 {"min_hard_comp" , "set minimum difference between timestamps and audio data (in seconds) to trigger padding/trimming the data."
103 , OFFSET(min_hard_compensation
),AV_OPT_TYPE_FLOAT
,{.dbl
=0.1 }, 0 , INT_MAX
, PARAM
},
104 {"comp_duration" , "set duration (in seconds) over which data is stretched/squeezed to make it match the timestamps."
105 , OFFSET(soft_compensation_duration
),AV_OPT_TYPE_FLOAT
,{.dbl
=1 }, 0 , INT_MAX
, PARAM
},
106 {"max_soft_comp" , "set maximum factor by which data is stretched/squeezed to make it match the timestamps."
107 , OFFSET(max_soft_compensation
),AV_OPT_TYPE_FLOAT
,{.dbl
=0 }, INT_MIN
, INT_MAX
, PARAM
},
108 {"async" , "simplified 1 parameter audio timestamp matching, 0(disabled), 1(filling and trimming), >1(maximum stretch/squeeze in samples per second)"
109 , OFFSET(async
) , AV_OPT_TYPE_FLOAT
,{.dbl
=0 }, INT_MIN
, INT_MAX
, PARAM
},
110 {"first_pts" , "Assume the first pts should be this value (in samples)."
111 , OFFSET(firstpts_in_samples
), AV_OPT_TYPE_INT64
,{.i64
=AV_NOPTS_VALUE
}, INT64_MIN
,INT64_MAX
, PARAM
},
113 { "matrix_encoding" , "set matrixed stereo encoding" , OFFSET(matrix_encoding
), AV_OPT_TYPE_INT
,{.i64
= AV_MATRIX_ENCODING_NONE
}, AV_MATRIX_ENCODING_NONE
, AV_MATRIX_ENCODING_NB
-1, PARAM
, "matrix_encoding" },
114 { "none", "select none", 0, AV_OPT_TYPE_CONST
, { .i64
= AV_MATRIX_ENCODING_NONE
}, INT_MIN
, INT_MAX
, PARAM
, "matrix_encoding" },
115 { "dolby", "select Dolby", 0, AV_OPT_TYPE_CONST
, { .i64
= AV_MATRIX_ENCODING_DOLBY
}, INT_MIN
, INT_MAX
, PARAM
, "matrix_encoding" },
116 { "dplii", "select Dolby Pro Logic II", 0, AV_OPT_TYPE_CONST
, { .i64
= AV_MATRIX_ENCODING_DPLII
}, INT_MIN
, INT_MAX
, PARAM
, "matrix_encoding" },
118 { "filter_type" , "select swr filter type" , OFFSET(filter_type
) , AV_OPT_TYPE_INT
, { .i64
= SWR_FILTER_TYPE_KAISER
}, SWR_FILTER_TYPE_CUBIC
, SWR_FILTER_TYPE_KAISER
, PARAM
, "filter_type" },
119 { "cubic" , "select cubic" , 0 , AV_OPT_TYPE_CONST
, { .i64
= SWR_FILTER_TYPE_CUBIC
}, INT_MIN
, INT_MAX
, PARAM
, "filter_type" },
120 { "blackman_nuttall", "select Blackman Nuttall Windowed Sinc", 0 , AV_OPT_TYPE_CONST
, { .i64
= SWR_FILTER_TYPE_BLACKMAN_NUTTALL
}, INT_MIN
, INT_MAX
, PARAM
, "filter_type" },
121 { "kaiser" , "select Kaiser Windowed Sinc" , 0 , AV_OPT_TYPE_CONST
, { .i64
= SWR_FILTER_TYPE_KAISER
}, INT_MIN
, INT_MAX
, PARAM
, "filter_type" },
123 { "kaiser_beta" , "set swr Kaiser Window Beta" , OFFSET(kaiser_beta
) , AV_OPT_TYPE_INT
, {.i64
=9 }, 2 , 16 , PARAM
},
125 { "output_sample_bits" , "set swr number of output sample bits", OFFSET(dither
.output_sample_bits
), AV_OPT_TYPE_INT
, {.i64
=0 }, 0 , 64 , PARAM
},
129 static const char* context_to_name(void* ptr
) {
133 static const AVClass av_class
= {
134 .class_name
= "SWResampler",
135 .item_name
= context_to_name
,
137 .version
= LIBAVUTIL_VERSION_INT
,
138 .log_level_offset_offset
= OFFSET(log_level_offset
),
139 .parent_log_context_offset
= OFFSET(log_ctx
),
140 .category
= AV_CLASS_CATEGORY_SWRESAMPLER
,
143 const AVClass
*swr_get_class(void)
148 av_cold
struct SwrContext
*swr_alloc(void){
149 SwrContext
*s
= av_mallocz(sizeof(SwrContext
));
151 s
->av_class
= &av_class
;
152 av_opt_set_defaults(s
);