shithub: opus-tools

Download patch

ref: 9b957b19f95515b9ec920e3d522fba1cf2856023
parent: 9bfd0e480f741f4e8b26b1286a4cd4d0dc7afdbb
author: Jean-Marc Valin <jmvalin@jmvalin.ca>
date: Sun May 5 13:10:00 EDT 2013

Converts opusenc to the new multistream surround encoder API

Channel mapping is now determined automatically by libopus.
This breaks the --uncoupled option because opusenc no longer
has any control over the mapping.

--- a/src/opusenc.c
+++ b/src/opusenc.c
@@ -349,8 +349,6 @@
   int                comment_padding=512;
   int                serialno;
   opus_int32         lookahead=0;
-  unsigned char      mapping[256];
-  int                force_narrow=0;
 #ifdef WIN_UNICODE
    int argc_utf8;
    char **argv_utf8;
@@ -386,8 +384,6 @@
   srand(((getpid()&65535)<<15)^start_time);
   serialno=rand();
 
-  for(i=0;i<256;i++)mapping[i]=i;
-
   opus_version=opus_get_version_string();
   /*Vendor string should just be the encoder library,
     the ENCODER comment specifies the tool used.*/
@@ -644,8 +640,8 @@
     exit(1);
   }
 
-  if(downmix==0&&inopt.channels>2&&bitrate>0&&bitrate<(32000*inopt.channels)){
-    if(!quiet)fprintf(stderr,"Notice: Surround bitrate less than 32kbit/sec/channel, downmixing.\n");
+  if(downmix==0&&inopt.channels>2&&bitrate>0&&bitrate<(16000*inopt.channels)){
+    if(!quiet)fprintf(stderr,"Notice: Surround bitrate less than 16kbit/sec/channel, downmixing.\n");
     downmix=inopt.channels>8?1:2;
   }
 
@@ -678,59 +674,25 @@
 
   /*OggOpus headers*/ /*FIXME: broke forcemono*/
   header.channels=chan;
-  header.nb_streams=header.channels;
-  header.nb_coupled=0;
-  if(header.channels<=8&&!uncoupled){
-    static const unsigned char opusenc_streams[8][10]={
-      /*Coupled, NB_bitmap, mapping...*/
-      /*1*/ {0,   0, 0},
-      /*2*/ {1,   0, 0,1},
-      /*3*/ {1,   0, 0,2,1},
-      /*4*/ {2,   0, 0,1,2,3},
-      /*5*/ {2,   0, 0,4,1,2,3},
-      /*6*/ {2,1<<3, 0,4,1,2,3,5},
-      /*7*/ {2,1<<4, 0,4,1,2,3,5,6},
-      /*6*/ {3,1<<4, 0,6,1,2,3,4,5,7}
-    };
-    for(i=0;i<header.channels;i++)mapping[i]=opusenc_streams[header.channels-1][i+2];
-    force_narrow=opusenc_streams[header.channels-1][1];
-    header.nb_coupled=opusenc_streams[header.channels-1][0];
-    header.nb_streams=header.channels-header.nb_coupled;
-  }
-  header.channel_mapping=header.channels>8?255:header.nb_streams>1;
-  if(header.channel_mapping>0)for(i=0;i<header.channels;i++)header.stream_map[i]=mapping[i];
+  header.channel_mapping=header.channels>8?255:chan>2;
   header.input_sample_rate=rate;
   header.gain=inopt.gain;
 
-  min_bytes=max_frame_bytes=(1275*3+7)*header.nb_streams;
-  packet=malloc(sizeof(unsigned char)*max_frame_bytes);
-  if(packet==NULL){
-    fprintf(stderr,"Error allocating packet buffer.\n");
-    exit(1);
-  }
-
   /*Initialize OPUS encoder*/
   /*Framesizes <10ms can only use the MDCT modes, so we switch on RESTRICTED_LOWDELAY
     to save the extra 2.5ms of codec lookahead when we'll be using only small frames.*/
-  st=opus_multistream_encoder_create(coding_rate, chan, header.nb_streams, header.nb_coupled,
-     mapping, frame_size<480/(48000/coding_rate)?OPUS_APPLICATION_RESTRICTED_LOWDELAY:OPUS_APPLICATION_AUDIO, &ret);
+  st=opus_multistream_surround_encoder_create(coding_rate, chan, header.channel_mapping, &header.nb_streams, &header.nb_coupled,
+     header.stream_map, frame_size<480/(48000/coding_rate)?OPUS_APPLICATION_RESTRICTED_LOWDELAY:OPUS_APPLICATION_AUDIO, &ret);
   if(ret!=OPUS_OK){
     fprintf(stderr, "Error cannot create encoder: %s\n", opus_strerror(ret));
     exit(1);
   }
 
-  if(force_narrow!=0){
-    for(i=0;i<header.nb_streams;i++){
-      if(force_narrow&(1<<i)){
-        OpusEncoder *oe;
-        opus_multistream_encoder_ctl(st,OPUS_MULTISTREAM_GET_ENCODER_STATE(i,&oe));
-        ret=opus_encoder_ctl(oe, OPUS_SET_MAX_BANDWIDTH(OPUS_BANDWIDTH_NARROWBAND));
-        if(ret!=OPUS_OK){
-          fprintf(stderr,"Error OPUS_SET_MAX_BANDWIDTH on stream %d returned: %s\n",i,opus_strerror(ret));
-          exit(1);
-        }
-      }
-    }
+  min_bytes=max_frame_bytes=(1275*3+7)*header.nb_streams;
+  packet=malloc(sizeof(unsigned char)*max_frame_bytes);
+  if(packet==NULL){
+    fprintf(stderr,"Error allocating packet buffer.\n");
+    exit(1);
   }
 
   if(bitrate<0){