shithub: opus

Download patch

ref: b7034ec262515c659b3b5660b1edcb31bf679274
parent: 217cdae98e44699648a215ebb527c4c3f4f171ac
author: Gregory Maxwell <[email protected]>
date: Mon Apr 30 06:22:03 EDT 2012

Make opus_demo r/w little-endian PCM independent of host byte-order.

--- a/README
+++ b/README
@@ -74,7 +74,7 @@
 -dtx                 : enable SILK DTX
 -loss <perc>         : simulate packet loss, in percent (0-100); default: 0
 
-input and output are 16-bit PCM files (machine endian) or opus bitstreams
+input and output are little endian signed 16-bit PCM files or opus bitstreams
 with simple opus_demo proprietary framing.
 
 == Testing ==
--- a/README.draft
+++ b/README.draft
@@ -45,5 +45,5 @@
 -dtx                 : enable SILK DTX
 -loss <perc>         : simulate packet loss, in percent (0-100); default: 0
 
-input and output are 16-bit PCM files (machine endian) or opus bitstreams
+input and output are little endian signed 16-bit PCM files or opus bitstreams
 with simple opus_demo propritary framing.
--- a/src/opus_demo.c
+++ b/src/opus_demo.c
@@ -211,6 +211,7 @@
     int frame_size, channels;
     opus_int32 bitrate_bps=0;
     unsigned char *data[2];
+    unsigned char *fbytes;
     opus_int32 sampling_rate;
     int use_vbr;
     int max_payload_bytes;
@@ -554,6 +555,7 @@
 
     in = (short*)malloc(max_frame_size*channels*sizeof(short));
     out = (short*)malloc(max_frame_size*channels*sizeof(short));
+    fbytes = (unsigned char*)malloc(max_frame_size*channels*sizeof(short));
     data[0] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
     if ( use_inbandfec ) {
         data[1] = (unsigned char*)calloc(max_payload_bytes,sizeof(char));
@@ -613,6 +615,7 @@
                 break;
             }
         } else {
+            int i;
             if (mode_list!=NULL)
             {
                 opus_encoder_ctl(enc, OPUS_SET_BANDWIDTH(mode_list[curr_mode][1]));
@@ -620,11 +623,17 @@
                 opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(mode_list[curr_mode][3]));
                 frame_size = mode_list[curr_mode][2];
             }
-            err = fread(in, sizeof(short)*channels, frame_size, fin);
+            err = fread(fbytes, sizeof(short)*channels, frame_size, fin);
             curr_read = err;
+            for(i=0;i<curr_read*channels;i++)
+            {
+                opus_int32 s;
+                s=fbytes[2*i+1]<<8|fbytes[2*i];
+                s=((s&0xFFFF)^0x8000)-0x8000;
+                in[i]=s;
+            }
             if (curr_read < frame_size)
             {
-                int i;
                 for (i=curr_read*channels;i<frame_size*channels;i++)
                    in[i] = 0;
                 stop = 1;
@@ -697,7 +706,15 @@
                 if (output_samples>0)
                 {
                     if (output_samples>skip) {
-                       if (fwrite(out+skip*channels, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){
+                       int i;
+                       for(i=0;i<(output_samples-skip)*channels;i++)
+                       {
+                          short s;
+                          s=out[i+(skip*channels)];
+                          fbytes[2*i]=s&0xFF;
+                          fbytes[2*i+1]=(s>>8)&0xFF;
+                       }
+                       if (fwrite(fbytes, sizeof(short)*channels, output_samples-skip, fout) != (unsigned)(output_samples-skip)){
                           fprintf(stderr, "Error writing.\n");
                           return EXIT_FAILURE;
                        }
@@ -772,5 +789,6 @@
     fclose(fout);
     free(in);
     free(out);
+    free(fbytes);
     return EXIT_SUCCESS;
 }