| 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 | |