[FFmpeg-cvslog] lavr: add C functions for mixing 2 to 1 channels with s16p format

Justin Ruggles git at videolan.org
Wed May 30 19:37:28 CEST 2012


ffmpeg | branch: master | Justin Ruggles <justin.ruggles at gmail.com> | Mon Apr 23 14:50:22 2012 -0400| [8dfc122719f3e1fa88fa9356a820843e6840df16] | committer: Justin Ruggles

lavr: add C functions for mixing 2 to 1 channels with s16p format

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=8dfc122719f3e1fa88fa9356a820843e6840df16
---

 libavresample/audio_mix.c |   50 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/libavresample/audio_mix.c b/libavresample/audio_mix.c
index 76f10ea..7ab11b0 100644
--- a/libavresample/audio_mix.c
+++ b/libavresample/audio_mix.c
@@ -115,6 +115,50 @@ static void mix_2_to_1_fltp_flt_c(float **samples, float **matrix, int len,
     }
 }
 
+static void mix_2_to_1_s16p_flt_c(int16_t **samples, float **matrix, int len,
+                                  int out_ch, int in_ch)
+{
+    int16_t *src0 = samples[0];
+    int16_t *src1 = samples[1];
+    int16_t *dst  = src0;
+    float m0      = matrix[0][0];
+    float m1      = matrix[0][1];
+
+    while (len > 4) {
+        *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1));
+        *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1));
+        *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1));
+        *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1));
+        len -= 4;
+    }
+    while (len > 0) {
+        *dst++ = av_clip_int16(lrintf(*src0++ * m0 + *src1++ * m1));
+        len--;
+    }
+}
+
+static void mix_2_to_1_s16p_q8_c(int16_t **samples, int16_t **matrix, int len,
+                                 int out_ch, int in_ch)
+{
+    int16_t *src0 = samples[0];
+    int16_t *src1 = samples[1];
+    int16_t *dst  = src0;
+    int16_t m0    = matrix[0][0];
+    int16_t m1    = matrix[0][1];
+
+    while (len > 4) {
+        *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8;
+        *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8;
+        *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8;
+        *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8;
+        len -= 4;
+    }
+    while (len > 0) {
+        *dst++ = (*src0++ * m0 + *src1++ * m1) >> 8;
+        len--;
+    }
+}
+
 static void mix_1_to_2_fltp_flt_c(float **samples, float **matrix, int len,
                                   int out_ch, int in_ch)
 {
@@ -229,6 +273,12 @@ static int mix_function_init(AudioMix *am)
     ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
                           2, 1, 1, 1, "C", mix_2_to_1_fltp_flt_c);
 
+    ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_FLT,
+                          2, 1, 1, 1, "C", mix_2_to_1_s16p_flt_c);
+
+    ff_audio_mix_set_func(am, AV_SAMPLE_FMT_S16P, AV_MIX_COEFF_TYPE_Q8,
+                          2, 1, 1, 1, "C", mix_2_to_1_s16p_q8_c);
+
     ff_audio_mix_set_func(am, AV_SAMPLE_FMT_FLTP, AV_MIX_COEFF_TYPE_FLT,
                           1, 2, 1, 1, "C", mix_1_to_2_fltp_flt_c);
 



More information about the ffmpeg-cvslog mailing list