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;
}