1 /* 2 * This file is part of FFmpeg. 3 * 4 * FFmpeg is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * FFmpeg 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 * Lesser General Public License for more details. 13 * 14 * You should have received a copy of the GNU Lesser General Public 15 * License along with FFmpeg; if not, write to the Free Software 16 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 19 /** 20 * @file 21 * audio volume filter 22 */ 23 24 #ifndef AVFILTER_VOLUME_H 25 #define AVFILTER_VOLUME_H 26 27 #include <stdint.h> 28 #include "libavutil/eval.h" 29 #include "libavutil/float_dsp.h" 30 #include "libavutil/log.h" 31 #include "libavutil/samplefmt.h" 32 33 enum PrecisionType { 34 PRECISION_FIXED = 0, 35 PRECISION_FLOAT, 36 PRECISION_DOUBLE, 37 }; 38 39 enum EvalMode { 40 EVAL_MODE_ONCE, 41 EVAL_MODE_FRAME, 42 EVAL_MODE_NB 43 }; 44 45 enum VolumeVarName { 46 VAR_N, 47 VAR_NB_CHANNELS, 48 VAR_NB_CONSUMED_SAMPLES, 49 VAR_NB_SAMPLES, 50 VAR_POS, 51 VAR_PTS, 52 VAR_SAMPLE_RATE, 53 VAR_STARTPTS, 54 VAR_STARTT, 55 VAR_T, 56 VAR_TB, 57 VAR_VOLUME, 58 VAR_VARS_NB 59 }; 60 61 enum ReplayGainType { 62 REPLAYGAIN_DROP, 63 REPLAYGAIN_IGNORE, 64 REPLAYGAIN_TRACK, 65 REPLAYGAIN_ALBUM, 66 }; 67 68 typedef struct VolumeContext { 69 const AVClass *class; 70 AVFloatDSPContext *fdsp; 71 int precision; 72 int eval_mode; 73 const char *volume_expr; 74 AVExpr *volume_pexpr; 75 double var_values[VAR_VARS_NB]; 76 77 int replaygain; 78 double replaygain_preamp; 79 int replaygain_noclip; 80 double volume; 81 int volume_i; 82 int channels; 83 int planes; 84 enum AVSampleFormat sample_fmt; 85 86 void (*scale_samples)(uint8_t *dst, const uint8_t *src, int nb_samples, 87 int volume); 88 int samples_align; 89 } VolumeContext; 90 91 void ff_volume_init_x86(VolumeContext *vol); 92 93 #endif /* AVFILTER_VOLUME_H */ 94