avconv: deprecate the -vol option
authorJustin Ruggles <justin.ruggles@gmail.com>
Tue, 2 Oct 2012 20:08:20 +0000 (16:08 -0400)
committerJustin Ruggles <justin.ruggles@gmail.com>
Wed, 5 Dec 2012 16:23:37 +0000 (11:23 -0500)
Remove the code for volume scaling in avconv.c and instead auto-insert a
volume filter into the beginning of the filter chain.

avconv.c
avconv_filter.c

index b2e1f04..444e74d 100644 (file)
--- a/avconv.c
+++ b/avconv.c
@@ -1081,7 +1081,6 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
 {
     AVFrame *decoded_frame;
     AVCodecContext *avctx = ist->st->codec;
-    int bps = av_get_bytes_per_sample(ist->st->codec->sample_fmt);
     int i, ret, resample_changed;
 
     if (!ist->decoded_frame && !(ist->decoded_frame = avcodec_alloc_frame()))
@@ -1106,64 +1105,6 @@ static int decode_audio(InputStream *ist, AVPacket *pkt, int *got_output)
         pkt->pts           = AV_NOPTS_VALUE;
     }
 
-    // preprocess audio (volume)
-    if (audio_volume != 256) {
-        int decoded_data_size = decoded_frame->nb_samples * avctx->channels * bps;
-        void *samples = decoded_frame->data[0];
-        switch (avctx->sample_fmt) {
-        case AV_SAMPLE_FMT_U8:
-        {
-            uint8_t *volp = samples;
-            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
-                int v = (((*volp - 128) * audio_volume + 128) >> 8) + 128;
-                *volp++ = av_clip_uint8(v);
-            }
-            break;
-        }
-        case AV_SAMPLE_FMT_S16:
-        {
-            int16_t *volp = samples;
-            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
-                int v = ((*volp) * audio_volume + 128) >> 8;
-                *volp++ = av_clip_int16(v);
-            }
-            break;
-        }
-        case AV_SAMPLE_FMT_S32:
-        {
-            int32_t *volp = samples;
-            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
-                int64_t v = (((int64_t)*volp * audio_volume + 128) >> 8);
-                *volp++ = av_clipl_int32(v);
-            }
-            break;
-        }
-        case AV_SAMPLE_FMT_FLT:
-        {
-            float *volp = samples;
-            float scale = audio_volume / 256.f;
-            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
-                *volp++ *= scale;
-            }
-            break;
-        }
-        case AV_SAMPLE_FMT_DBL:
-        {
-            double *volp = samples;
-            double scale = audio_volume / 256.;
-            for (i = 0; i < (decoded_data_size / sizeof(*volp)); i++) {
-                *volp++ *= scale;
-            }
-            break;
-        }
-        default:
-            av_log(NULL, AV_LOG_FATAL,
-                   "Audio volume adjustment on sample format %s is not supported.\n",
-                   av_get_sample_fmt_name(ist->st->codec->sample_fmt));
-            exit(1);
-        }
-    }
-
     rate_emu_sleep(ist);
 
     resample_changed = ist->resample_sample_fmt     != decoded_frame->format         ||
index 8f430b0..e9412ab 100644 (file)
@@ -452,6 +452,29 @@ static int configure_input_audio_filter(FilterGraph *fg, InputFilter *ifilter,
         first_filter = async;
         pad_idx = 0;
     }
+    if (audio_volume != 256) {
+        AVFilterContext *volume;
+
+        av_log(NULL, AV_LOG_WARNING, "-vol has been deprecated. Use the volume "
+               "audio filter instead.\n");
+
+        snprintf(args, sizeof(args), "volume=%f", audio_volume / 256.0);
+
+        snprintf(name, sizeof(name), "graph %d volume for input stream %d:%d",
+                 fg->index, ist->file_index, ist->st->index);
+        ret = avfilter_graph_create_filter(&volume,
+                                           avfilter_get_by_name("volume"),
+                                           name, args, NULL, fg->graph);
+        if (ret < 0)
+            return ret;
+
+        ret = avfilter_link(volume, 0, first_filter, pad_idx);
+        if (ret < 0)
+            return ret;
+
+        first_filter = volume;
+        pad_idx = 0;
+    }
     if ((ret = avfilter_link(ifilter->filter, 0, first_filter, pad_idx)) < 0)
         return ret;