Commit 2f0f005c authored by Jan Gerber's avatar Jan Gerber
Browse files

update 6to2 patch

parent b22a9086
......@@ -4,13 +4,13 @@ common="--enable-version3 --enable-gpl --enable-postproc --disable-muxers --disa
common="$common --disable-ffmpeg --disable-ffplay --disable-ffserver --disable-ffprobe --disable-doc"
#optional, if you have those libs installed:
#extra="--enable-libopencore-amrnb --enable-libopencore-amrwb"
#extra="$extra --enable-libopencore-amrnb --enable-libopencore-amrwb"
#apt-get install liba52-dev libgsm1-dev
#extra="$extra --enable-libgsm"
#optional, if you have libvpx installed:
#extra="--enable-libvpx"
#extra="$extra --enable-libvpx"
#linux
options="$common --enable-pthreads $extra"
......
Index: libavcodec/resample.c
===================================================================
--- libavcodec/resample.c (revision 22168)
+++ libavcodec/resample.c (working copy)
@@ -52,6 +52,17 @@
unsigned buffer_size[2]; ///< sizes of allocated buffers
};
diff --git a/libavcodec/resample.c b/libavcodec/resample.c
index 9e6defe..8c4eebe 100644
--- a/libavcodec/resample.c
+++ b/libavcodec/resample.c
@@ -108,6 +108,39 @@ static void mono_to_stereo(short *output, short *input, int n1)
}
}
+/*
+5.1 to stereo input: [fl, fr, c, lfe, rl, rr]
+- Left = front_left + rear_gain * rear_left + center_gain * center
+- Right = front_right + rear_gain * rear_right + center_gain * center
+Where rear_gain is usually around 0.5-1.0 and
+ center_gain is almost always 0.7 (-3 dB)
+*/
+static short clip_short(int v) {
+ if (v < -32768)
+ v = -32768;
+ else if (v > 32767)
+ v = 32767;
+ return (short) v;
+}
+static void surround_to_stereo(short **output, short *input, int channels, int samples)
+{
+ int i;
+ short l, r;
+
+ for (i = 0; i < samples; i++) {
+ int fl,fr,c,rl,rr,lfe;
+ fl = input[0];
+ fr = input[1];
+ c = input[2];
+ lfe = input[3];
+ rl = input[4];
+ rr = input[5];
+
/* n1: number of samples */
static void stereo_to_mono(short *output, short *input, int n1)
{
@@ -103,14 +114,43 @@
}
}
-/* XXX: should use more abstract 'N' channels system */
-static void stereo_split(short *output1, short *output2, short *input, int n)
-{
+/* XXX: make this better. channels will always be >= 2.
+ - Left = front_left + rear_gain * rear_left + center_gain * center
+ - Right = front_right + rear_gain * rear_right + center_gain * center
+ where rear_gain is usually around 0.5-1.0 and center_gain is almost always 0.7 (-3 dB) if I recall correctly. */
+static void multi_to_stereo_split(short *output1, short *output2, short *input, int n, int channels) {
int i;
+ short l,r;
for(i=0;i<n;i++) {
- *output1++ = *input++;
- *output2++ = *input++;
+ if (channels == 2) {
+ /* simple stereo to stereo. Input is: l, r */
+ l = input[0];
+ r = input[1];
+ } else if (channels == 6) {
+ /* 5.1 to stereo input: [fl, fr, c, lfe, rl, rr] */
+ int fl,fr,c,rl,rr,lfe;
+ fl = input[0];
+ fr = input[1];
+ c = input[2];
+ lfe = input[3];
+ rl = input[4];
+ rr = input[5];
+
+ l = clip_short(fl + (0.5 * rl) + (0.7 * c));
+ r = clip_short(fr + (0.5 * rr) + (0.7 * c));
+ } else {
+ /* channels must be 3-5, or >= 7. l, c, r, ? */
+ l = input[0];
+ r = input[2];
+ }
+ l = av_clip_int16(fl + (0.5 * rl) + (0.7 * c));
+ r = av_clip_int16(fr + (0.5 * rr) + (0.7 * c));
+
+ /* output l & r. */
+ *output1++ = l;
+ *output2++ = r;
+ *output[0]++ = l;
+ *output[1]++ = r;
+
+ /* increment input. */
+ input += channels;
}
}
@@ -150,9 +190,9 @@
+ }
+}
+
static void deinterleave(short **output, short *input, int channels, int samples)
{
ReSampleContext *s;
- if ( input_channels > 2)
+ if ((input_channels > 2) && (input_channels != 6))
{
- av_log(NULL, AV_LOG_ERROR, "Resampling with input channels greater than 2 unsupported.\n");
+ av_log(NULL, AV_LOG_ERROR, "Resampling with input channels other than 1,2, or 6 is unsupported.\n");
return NULL;
}
@@ -312,7 +352,7 @@
} else if (s->output_channels >= 2) {
int i, j;
@@ -301,6 +334,10 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
} else if (s->output_channels >= 2 && s->input_channels == 1) {
buftmp3[0] = bufout[0];
buftmp3[1] = bufout[1];
- stereo_split(buftmp2[0], buftmp2[1], input, nb_samples);
+ multi_to_stereo_split(buftmp2[0], buftmp2[1], input, nb_samples, s->input_channels);
} else {
buftmp3[0] = output;
memcpy(buftmp2[0], input, nb_samples*sizeof(short));
memcpy(buftmp2[0], input, nb_samples * sizeof(short));
+ } else if (s->input_channels == 6 && s->output_channels ==2) {
+ buftmp3[0] = bufout[0];
+ buftmp3[1] = bufout[1];
+ surround_to_stereo(buftmp2, input, s->input_channels, nb_samples);
} else if (s->output_channels >= s->input_channels && s->input_channels >= 2) {
for (i = 0; i < s->input_channels; i++) {
buftmp3[i] = bufout[i];
@@ -330,7 +367,8 @@ int audio_resample(ReSampleContext *s, short *output, short *input, int nb_sampl
mono_to_stereo(output, buftmp3[0], nb_samples1);
} else if (s->output_channels == 6 && s->input_channels == 2) {
ac3_5p1_mux(output, buftmp3[0], buftmp3[1], nb_samples1);
- } else if (s->output_channels == s->input_channels && s->input_channels >= 2) {
+ } else if ((s->output_channels == s->input_channels && s->input_channels >= 2) ||
+ (s->output_channels == 2 && s->input_channels == 6)) {
interleave(output, buftmp3, s->output_channels, nb_samples1);
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment