changeset 1408:4d67eb341a0c libavcodec

AC3 encoding patch ba (Ross Martin <ffmpeg at ross dot interwrx dot com>)
author michaelni
date Wed, 20 Aug 2003 07:57:00 +0000
parents 69f4f4fb8a50
children 62ea3b7d00f0
files ac3enc.c resample.c
diffstat 2 files changed, 60 insertions(+), 12 deletions(-) [+]
line wrap: on
line diff
--- a/ac3enc.c	Wed Aug 20 07:35:23 2003 +0000
+++ b/ac3enc.c	Wed Aug 20 07:57:00 2003 +0000
@@ -978,7 +978,7 @@
                                int8_t global_exp[AC3_MAX_CHANNELS],
                                int block_num)
 {
-    int ch, nb_groups, group_size, i, baie;
+    int ch, nb_groups, group_size, i, baie, rbnd;
     uint8_t *p;
     uint16_t qmant[AC3_MAX_CHANNELS][N/2];
     int exp0, exp1;
@@ -1000,14 +1000,28 @@
         put_bits(&s->pb, 1, 0); /* no new coupling strategy */
     }
 
-    if (s->acmod == 2) {
-        put_bits(&s->pb, 1, 0); /* no matrixing (but should be used in the future) */
-    }
+    if (s->acmod == 2)
+      {
+	if(block_num==0)
+	  {
+	    /* first block must define rematrixing (rematstr)  */
+	    put_bits(&s->pb, 1, 1); 
+	    
+	    /* dummy rematrixing rematflg(1:4)=0 */
+	    for (rbnd=0;rbnd<4;rbnd++)
+	      put_bits(&s->pb, 1, 0); 
+	  }
+	else 
+	  {
+	    /* no matrixing (but should be used in the future) */
+	    put_bits(&s->pb, 1, 0);
+	  } 
+      }
 
 #if defined(DEBUG) 
     {
-        static int count = 0;
-        printf("Block #%d (%d)\n", block_num, count++);
+      static int count = 0;
+      printf("Block #%d (%d)\n", block_num, count++);
     }
 #endif
     /* exponent strategy */
@@ -1329,7 +1343,8 @@
     frame = s->pb.buf;
     n = 2 * s->frame_size - (pbBufPtr(&s->pb) - frame) - 2;
     assert(n >= 0);
-    memset(pbBufPtr(&s->pb), 0, n);
+    if(n>0)
+      memset(pbBufPtr(&s->pb), 0, n);
     
     /* Now we must compute both crcs : this is not so easy for crc1
        because it is at the beginning of the data... */
--- a/resample.c	Wed Aug 20 07:35:23 2003 +0000
+++ b/resample.c	Wed Aug 20 07:57:00 2003 +0000
@@ -194,6 +194,23 @@
     }
 }
 
+static void ac3_5p1_mux(short *output, short *input1, short *input2, int n)
+{
+    int i;
+    short l,r;
+
+    for(i=0;i<n;i++) {
+      l=*input1++;
+      r=*input2++;
+      *output++ = l;           /* left */
+      *output++ = (l/2)+(r/2); /* center */
+      *output++ = r;           /* right */
+      *output++ = 0;           /* left surround */
+      *output++ = 0;           /* right surroud */
+      *output++ = 0;           /* low freq */
+    }
+}
+
 static int mono_resample(ReSampleChannelContext *s, short *output, short *input, int nb_samples)
 {
     short *buf1;
@@ -225,12 +242,18 @@
     ReSampleContext *s;
     int i;
     
-    if (output_channels > 2 || input_channels > 2)
-        return NULL;
+    if ( input_channels > 2)
+      {
+	printf("Resampling with input channels greater than 2 unsupported.");
+	return NULL;
+      }
 
     s = av_mallocz(sizeof(ReSampleContext));
     if (!s)
-        return NULL;
+      {
+	printf("Can't allocate memory for resample context.");
+	return NULL;
+      }
 
     s->ratio = (float)output_rate / (float)input_rate;
     
@@ -241,6 +264,14 @@
     if (s->output_channels < s->filter_channels)
         s->filter_channels = s->output_channels;
 
+/*
+ * ac3 output is the only case where filter_channels could be greater than 2.
+ * input channels can't be greater than 2, so resample the 2 channels and then
+ * expand to 6 channels after the resampling.
+ */
+    if(s->filter_channels>2)
+      s->filter_channels = 2;
+
     for(i=0;i<s->filter_channels;i++) {
         init_mono_resample(&s->channel_ctx[i], s->ratio);
     }
@@ -279,10 +310,10 @@
         buftmp2[0] = bufin[0];
         buftmp3[0] = output;
         stereo_to_mono(buftmp2[0], input, nb_samples);
-    } else if (s->output_channels == 2 && s->input_channels == 1) {
+    } else if (s->output_channels >= 2 && s->input_channels == 1) {
         buftmp2[0] = input;
         buftmp3[0] = bufout[0];
-    } else if (s->output_channels == 2) {
+    } else if (s->output_channels >= 2) {
         buftmp2[0] = bufin[0];
         buftmp2[1] = bufin[1];
         buftmp3[0] = bufout[0];
@@ -303,6 +334,8 @@
         mono_to_stereo(output, buftmp3[0], nb_samples1);
     } else if (s->output_channels == 2) {
         stereo_mux(output, buftmp3[0], buftmp3[1], nb_samples1);
+    } else if (s->output_channels == 6) {
+        ac3_5p1_mux(output, buftmp3[0], buftmp3[1], nb_samples1);
     }
 
     av_free(bufin[0]);