1 /* GStreamer 2 * Copyright (C) <2015> Wim Taymans <wim.taymans@gmail.com> 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Library General Public 6 * License as published by the Free Software Foundation; either 7 * version 2 of the License, or (at your option) any later version. 8 * 9 * This library is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 12 * Library General Public License for more details. 13 * 14 * You should have received a copy of the GNU Library General Public 15 * License along with this library; if not, write to the 16 * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, 17 * Boston, MA 02110-1301, USA. 18 */ 19 20 #ifndef __GST_AUDIO_RESAMPLER_H__ 21 #define __GST_AUDIO_RESAMPLER_H__ 22 23 #include <gst/gst.h> 24 #include <gst/audio/audio.h> 25 26 G_BEGIN_DECLS 27 28 /** 29 * GstAudioResampler: 30 * 31 * Opaque #GstAudioResampler struct. 32 * 33 * Since: 1.10 34 */ 35 typedef struct _GstAudioResampler GstAudioResampler; 36 37 /** 38 * GST_AUDIO_RESAMPLER_OPT_CUTOFF: 39 * 40 * G_TYPE_DOUBLE, Cutoff parameter for the filter. 0.940 is the default. 41 */ 42 #define GST_AUDIO_RESAMPLER_OPT_CUTOFF "GstAudioResampler.cutoff" 43 /** 44 * GST_AUDIO_RESAMPLER_OPT_STOP_ATTENUATION: 45 * 46 * G_TYPE_DOUBLE, stopband attenuation in decibels. The attenuation 47 * after the stopband for the kaiser window. 85 dB is the default. 48 */ 49 #define GST_AUDIO_RESAMPLER_OPT_STOP_ATTENUATION "GstAudioResampler.stop-attenutation" 50 /** 51 * GST_AUDIO_RESAMPLER_OPT_TRANSITION_BANDWIDTH: 52 * 53 * G_TYPE_DOUBLE, transition bandwidth. The width of the 54 * transition band for the kaiser window. 0.087 is the default. 55 */ 56 #define GST_AUDIO_RESAMPLER_OPT_TRANSITION_BANDWIDTH "GstAudioResampler.transition-bandwidth" 57 58 /** 59 * GST_AUDIO_RESAMPLER_OPT_CUBIC_B: 60 * 61 * G_TYPE_DOUBLE, B parameter of the cubic filter. 62 * Values between 0.0 and 2.0 are accepted. 1.0 is the default. 63 * 64 * Below are some values of popular filters: 65 * B C 66 * Hermite 0.0 0.0 67 * Spline 1.0 0.0 68 * Catmull-Rom 0.0 1/2 69 */ 70 #define GST_AUDIO_RESAMPLER_OPT_CUBIC_B "GstAudioResampler.cubic-b" 71 /** 72 * GST_AUDIO_RESAMPLER_OPT_CUBIC_C: 73 * 74 * G_TYPE_DOUBLE, C parameter of the cubic filter. 75 * Values between 0.0 and 2.0 are accepted. 0.0 is the default. 76 * 77 * See #GST_AUDIO_RESAMPLER_OPT_CUBIC_B for some more common values 78 */ 79 #define GST_AUDIO_RESAMPLER_OPT_CUBIC_C "GstAudioResampler.cubic-c" 80 81 /** 82 * GST_AUDIO_RESAMPLER_OPT_N_TAPS: 83 * 84 * G_TYPE_INT: the number of taps to use for the filter. 85 * 0 is the default and selects the taps automatically. 86 */ 87 #define GST_AUDIO_RESAMPLER_OPT_N_TAPS "GstAudioResampler.n-taps" 88 89 /** 90 * GstAudioResamplerFilterMode: 91 * @GST_AUDIO_RESAMPLER_FILTER_MODE_INTERPOLATED: Use interpolated filter tables. This 92 * uses less memory but more CPU and is slightly less accurate but it allows for more 93 * efficient variable rate resampling with gst_audio_resampler_update(). 94 * @GST_AUDIO_RESAMPLER_FILTER_MODE_FULL: Use full filter table. This uses more memory 95 * but less CPU. 96 * @GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO: Automatically choose between interpolated 97 * and full filter tables. 98 * 99 * Select for the filter tables should be set up. 100 * 101 * Since: 1.10 102 */ 103 typedef enum { 104 GST_AUDIO_RESAMPLER_FILTER_MODE_INTERPOLATED = (0), 105 GST_AUDIO_RESAMPLER_FILTER_MODE_FULL, 106 GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO, 107 } GstAudioResamplerFilterMode; 108 /** 109 * GST_AUDIO_RESAMPLER_OPT_FILTER_MODE: 110 * 111 * GST_TYPE_AUDIO_RESAMPLER_FILTER_MODE: how the filter tables should be 112 * constructed. 113 * GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO is the default. 114 */ 115 #define GST_AUDIO_RESAMPLER_OPT_FILTER_MODE "GstAudioResampler.filter-mode" 116 /** 117 * GST_AUDIO_RESAMPLER_OPT_FILTER_MODE_THRESHOLD: 118 * 119 * G_TYPE_UINT: the amount of memory to use for full filter tables before 120 * switching to interpolated filter tables. 121 * 1048576 is the default. 122 */ 123 #define GST_AUDIO_RESAMPLER_OPT_FILTER_MODE_THRESHOLD "GstAudioResampler.filter-mode-threshold" 124 125 /** 126 * GstAudioResamplerFilterInterpolation: 127 * @GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE: no interpolation 128 * @GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR: linear interpolation of the 129 * filter coefficients. 130 * @GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC: cubic interpolation of the 131 * filter coefficients. 132 * 133 * The different filter interpolation methods. 134 * 135 * Since: 1.10 136 */ 137 typedef enum { 138 GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_NONE = (0), 139 GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_LINEAR, 140 GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC, 141 } GstAudioResamplerFilterInterpolation; 142 /** 143 * GST_AUDIO_RESAMPLER_OPT_FILTER_INTERPOLATION: 144 * 145 * GST_TYPE_AUDIO_RESAMPLER_INTERPOLATION: how the filter coefficients should be 146 * interpolated. 147 * GST_AUDIO_RESAMPLER_FILTER_INTERPOLATION_CUBIC is default. 148 */ 149 #define GST_AUDIO_RESAMPLER_OPT_FILTER_INTERPOLATION "GstAudioResampler.filter-interpolation" 150 /** 151 * GST_AUDIO_RESAMPLER_OPT_FILTER_OVERSAMPLE: 152 * 153 * G_TYPE_UINT, oversampling to use when interpolating filters 154 * 8 is the default. 155 */ 156 #define GST_AUDIO_RESAMPLER_OPT_FILTER_OVERSAMPLE "GstAudioResampler.filter-oversample" 157 158 /** 159 * GST_AUDIO_RESAMPLER_OPT_MAX_PHASE_ERROR: 160 * 161 * G_TYPE_DOUBLE: The maximum allowed phase error when switching sample 162 * rates. 163 * 0.1 is the default. 164 */ 165 #define GST_AUDIO_RESAMPLER_OPT_MAX_PHASE_ERROR "GstAudioResampler.max-phase-error" 166 167 /** 168 * GstAudioResamplerMethod: 169 * @GST_AUDIO_RESAMPLER_METHOD_NEAREST: Duplicates the samples when 170 * upsampling and drops when downsampling 171 * @GST_AUDIO_RESAMPLER_METHOD_LINEAR: Uses linear interpolation to reconstruct 172 * missing samples and averaging to downsample 173 * @GST_AUDIO_RESAMPLER_METHOD_CUBIC: Uses cubic interpolation 174 * @GST_AUDIO_RESAMPLER_METHOD_BLACKMAN_NUTTALL: Uses Blackman-Nuttall windowed sinc interpolation 175 * @GST_AUDIO_RESAMPLER_METHOD_KAISER: Uses Kaiser windowed sinc interpolation 176 * 177 * Different subsampling and upsampling methods 178 * 179 * Since: 1.10 180 */ 181 typedef enum { 182 GST_AUDIO_RESAMPLER_METHOD_NEAREST, 183 GST_AUDIO_RESAMPLER_METHOD_LINEAR, 184 GST_AUDIO_RESAMPLER_METHOD_CUBIC, 185 GST_AUDIO_RESAMPLER_METHOD_BLACKMAN_NUTTALL, 186 GST_AUDIO_RESAMPLER_METHOD_KAISER 187 } GstAudioResamplerMethod; 188 189 /** 190 * GstAudioResamplerFlags: 191 * @GST_AUDIO_RESAMPLER_FLAG_NONE: no flags 192 * @GST_AUDIO_RESAMPLER_FLAG_NON_INTERLEAVED_IN: input samples are non-interleaved. 193 * an array of blocks of samples, one for each channel, should be passed to the 194 * resample function. 195 * @GST_AUDIO_RESAMPLER_FLAG_NON_INTERLEAVED_OUT: output samples are non-interleaved. 196 * an array of blocks of samples, one for each channel, should be passed to the 197 * resample function. 198 * @GST_AUDIO_RESAMPLER_FLAG_VARIABLE_RATE: optimize for dynamic updates of the sample 199 * rates with gst_audio_resampler_update(). This will select an interpolating filter 200 * when #GST_AUDIO_RESAMPLER_FILTER_MODE_AUTO is configured. 201 * 202 * Different resampler flags. 203 * 204 * Since: 1.10 205 */ 206 typedef enum { 207 GST_AUDIO_RESAMPLER_FLAG_NONE = (0), 208 GST_AUDIO_RESAMPLER_FLAG_NON_INTERLEAVED_IN = (1 << 0), 209 GST_AUDIO_RESAMPLER_FLAG_NON_INTERLEAVED_OUT = (1 << 1), 210 GST_AUDIO_RESAMPLER_FLAG_VARIABLE_RATE = (1 << 2), 211 } GstAudioResamplerFlags; 212 213 #define GST_AUDIO_RESAMPLER_QUALITY_MIN 0 214 #define GST_AUDIO_RESAMPLER_QUALITY_MAX 10 215 #define GST_AUDIO_RESAMPLER_QUALITY_DEFAULT 4 216 217 GST_AUDIO_API 218 void gst_audio_resampler_options_set_quality (GstAudioResamplerMethod method, 219 guint quality, 220 gint in_rate, gint out_rate, 221 GstStructure *options); 222 223 GST_AUDIO_API 224 GstAudioResampler * gst_audio_resampler_new (GstAudioResamplerMethod method, 225 GstAudioResamplerFlags flags, 226 GstAudioFormat format, gint channels, 227 gint in_rate, gint out_rate, 228 GstStructure *options); 229 230 GST_AUDIO_API 231 void gst_audio_resampler_free (GstAudioResampler *resampler); 232 233 GST_AUDIO_API 234 void gst_audio_resampler_reset (GstAudioResampler *resampler); 235 236 GST_AUDIO_API 237 gboolean gst_audio_resampler_update (GstAudioResampler *resampler, 238 gint in_rate, gint out_rate, 239 GstStructure *options); 240 241 GST_AUDIO_API 242 gsize gst_audio_resampler_get_out_frames (GstAudioResampler *resampler, 243 gsize in_frames); 244 245 GST_AUDIO_API 246 gsize gst_audio_resampler_get_in_frames (GstAudioResampler *resampler, 247 gsize out_frames); 248 249 GST_AUDIO_API 250 gsize gst_audio_resampler_get_max_latency (GstAudioResampler *resampler); 251 252 GST_AUDIO_API 253 void gst_audio_resampler_resample (GstAudioResampler * resampler, 254 gpointer in[], gsize in_frames, 255 gpointer out[], gsize out_frames); 256 257 G_END_DECLS 258 259 #endif /* __GST_AUDIO_RESAMPLER_H__ */ 260