Properly support > 8 channels
[libopusenc.git] / src / opusenc.c
index 7efbe4a..2b21eb7 100644 (file)
@@ -48,8 +48,6 @@
 /* Bump this when we change the ABI. */
 #define OPE_ABI_VERSION 0
 
-#define MAX_CHANNELS 8
-
 #define LPC_PADDING 120
 #define LPC_ORDER 24
 #define LPC_INPUT 480
@@ -435,17 +433,15 @@ static void encode_buffer(OggOpusEnc *enc) {
     assert(nbBytes > 0);
     enc->curr_granule += enc->frame_size;
     do {
+      unsigned char *p;
       opus_int64 granulepos;
       granulepos=enc->curr_granule-enc->streams->granule_offset;
       e_o_s=enc->curr_granule >= end_granule48k;
       cont = 0;
       if (e_o_s) granulepos=end_granule48k-enc->streams->granule_offset;
-      {
-        unsigned char *p;
-        p = oggp_get_packet_buffer(enc->oggp, MAX_PACKET_SIZE);
-        memcpy(p, packet, nbBytes);
-        oggp_commit_packet(enc->oggp, nbBytes, granulepos, e_o_s);
-      }
+      p = oggp_get_packet_buffer(enc->oggp, MAX_PACKET_SIZE);
+      memcpy(p, packet, nbBytes);
+      oggp_commit_packet(enc->oggp, nbBytes, granulepos, e_o_s);
       if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, packet, nbBytes, 0);
       /* FIXME: Also flush on too many segments. */
       if (e_o_s) oe_flush_page(enc);
@@ -468,12 +464,9 @@ static void encode_buffer(OggOpusEnc *enc) {
         init_stream(enc);
         if (enc->chaining_keyframe) {
           opus_int64 granulepos2=enc->curr_granule - enc->streams->granule_offset - enc->frame_size;
-          {
-            unsigned char *p;
-            p = oggp_get_packet_buffer(enc->oggp, MAX_PACKET_SIZE);
-            memcpy(p, enc->chaining_keyframe, enc->chaining_keyframe_length);
-            oggp_commit_packet(enc->oggp, enc->chaining_keyframe_length, granulepos2, 0);
-          }
+          p = oggp_get_packet_buffer(enc->oggp, MAX_PACKET_SIZE);
+          memcpy(p, enc->chaining_keyframe, enc->chaining_keyframe_length);
+          oggp_commit_packet(enc->oggp, enc->chaining_keyframe_length, granulepos2, 0);
           if (enc->packet_callback) enc->packet_callback(enc->packet_callback_data, enc->chaining_keyframe, enc->chaining_keyframe_length, 0);
         }
         end_granule48k = (enc->streams->end_granule*48000 + enc->rate - 1)/enc->rate + enc->global_granule_offset;
@@ -532,7 +525,7 @@ int ope_encoder_write_float(OggOpusEnc *enc, const float *pcm, int samples_per_c
   return OPE_OK;
 }
 
-#define CONVERT_BUFFER 256
+#define CONVERT_BUFFER 4096
 
 /* Add/encode any number of int16 samples to the file. */
 int ope_encoder_write(OggOpusEnc *enc, const opus_int16 *pcm, int samples_per_channel) {
@@ -548,8 +541,8 @@ int ope_encoder_write(OggOpusEnc *enc, const opus_int16 *pcm, int samples_per_ch
     spx_uint32_t in_samples, out_samples;
     out_samples = BUFFER_SAMPLES-enc->buffer_end;
     if (enc->re != NULL) {
-      float buf[CONVERT_BUFFER*MAX_CHANNELS];
-      in_samples = MIN(CONVERT_BUFFER, samples_per_channel);
+      float buf[CONVERT_BUFFER];
+      in_samples = MIN(CONVERT_BUFFER/channels, samples_per_channel);
       for (i=0;i<channels*(int)in_samples;i++) {
         buf[i] = (1.f/32768)*pcm[i];
       }