Skip to content
Snippets Groups Projects
Commit e85a6f5c authored by Jean-Marc Valin's avatar Jean-Marc Valin
Browse files

Makes opus_demo rubust to the encoder using variable frame duration

Also, the encode+decode mode now produces an output of the same size
as the original.
parent 2a5f0565
No related branches found
No related tags found
No related merge requests found
...@@ -221,6 +221,8 @@ int main(int argc, char *argv[]) ...@@ -221,6 +221,8 @@ int main(int argc, char *argv[])
short *in, *out; short *in, *out;
int application=OPUS_APPLICATION_AUDIO; int application=OPUS_APPLICATION_AUDIO;
double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg; double bits=0.0, bits_max=0.0, bits_act=0.0, bits2=0.0, nrg;
double tot_samples=0;
opus_uint64 tot_in, tot_out;
int bandwidth=-1; int bandwidth=-1;
const char *bandwidth_string; const char *bandwidth_string;
int lost = 0, lost_prev = 1; int lost = 0, lost_prev = 1;
...@@ -239,6 +241,8 @@ int main(int argc, char *argv[]) ...@@ -239,6 +241,8 @@ int main(int argc, char *argv[])
int curr_mode=0; int curr_mode=0;
int curr_mode_count=0; int curr_mode_count=0;
int mode_switch_time = 48000; int mode_switch_time = 48000;
int nb_encoded;
int remaining=0;
if (argc < 5 ) if (argc < 5 )
{ {
...@@ -246,6 +250,7 @@ int main(int argc, char *argv[]) ...@@ -246,6 +250,7 @@ int main(int argc, char *argv[])
return EXIT_FAILURE; return EXIT_FAILURE;
} }
tot_in=tot_out=0;
fprintf(stderr, "%s\n", opus_get_version_string()); fprintf(stderr, "%s\n", opus_get_version_string());
args = 1; args = 1;
...@@ -617,22 +622,28 @@ int main(int argc, char *argv[]) ...@@ -617,22 +622,28 @@ int main(int argc, char *argv[])
opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(mode_list[curr_mode][3])); opus_encoder_ctl(enc, OPUS_SET_FORCE_CHANNELS(mode_list[curr_mode][3]));
frame_size = mode_list[curr_mode][2]; frame_size = mode_list[curr_mode][2];
} }
err = fread(fbytes, sizeof(short)*channels, frame_size, fin); err = fread(fbytes, sizeof(short)*channels, frame_size-remaining, fin);
curr_read = err; curr_read = err;
tot_in += curr_read;
for(i=0;i<curr_read*channels;i++) for(i=0;i<curr_read*channels;i++)
{ {
opus_int32 s; opus_int32 s;
s=fbytes[2*i+1]<<8|fbytes[2*i]; s=fbytes[2*i+1]<<8|fbytes[2*i];
s=((s&0xFFFF)^0x8000)-0x8000; s=((s&0xFFFF)^0x8000)-0x8000;
in[i]=s; in[i+remaining*channels]=s;
} }
if (curr_read < frame_size) if (curr_read+remaining < frame_size)
{ {
for (i=curr_read*channels;i<frame_size*channels;i++) for (i=(curr_read+remaining)*channels;i<frame_size*channels;i++)
in[i] = 0; in[i] = 0;
stop = 1; if (encode_only || decode_only)
stop = 1;
} }
len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes); len[toggle] = opus_encode(enc, in, frame_size, data[toggle], max_payload_bytes);
nb_encoded = opus_packet_get_samples_per_frame(data[toggle], sampling_rate)*opus_packet_get_nb_frames(data[toggle], len[toggle]);
remaining = frame_size-nb_encoded;
for(i=0;i<remaining*channels;i++)
in[i] = in[nb_encoded*channels+i];
if (sweep_bps!=0) if (sweep_bps!=0)
{ {
bitrate_bps += sweep_bps; bitrate_bps += sweep_bps;
...@@ -681,6 +692,7 @@ int main(int argc, char *argv[]) ...@@ -681,6 +692,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "Error writing.\n"); fprintf(stderr, "Error writing.\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
tot_samples += nb_encoded;
} else { } else {
int output_samples; int output_samples;
lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc); lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc);
...@@ -703,6 +715,11 @@ int main(int argc, char *argv[]) ...@@ -703,6 +715,11 @@ int main(int argc, char *argv[])
} }
if (output_samples>0) if (output_samples>0)
{ {
if (!decode_only && tot_out + output_samples > tot_in)
{
stop=1;
output_samples = tot_in-tot_out;
}
if (output_samples>skip) { if (output_samples>skip) {
int i; int i;
for(i=0;i<(output_samples-skip)*channels;i++) for(i=0;i<(output_samples-skip)*channels;i++)
...@@ -716,6 +733,7 @@ int main(int argc, char *argv[]) ...@@ -716,6 +733,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "Error writing.\n"); fprintf(stderr, "Error writing.\n");
return EXIT_FAILURE; return EXIT_FAILURE;
} }
tot_out += output_samples-skip;
} }
if (output_samples<skip) skip -= output_samples; if (output_samples<skip) skip -= output_samples;
else skip = 0; else skip = 0;
...@@ -723,6 +741,7 @@ int main(int argc, char *argv[]) ...@@ -723,6 +741,7 @@ int main(int argc, char *argv[])
fprintf(stderr, "error decoding frame: %s\n", fprintf(stderr, "error decoding frame: %s\n",
opus_strerror(output_samples)); opus_strerror(output_samples));
} }
tot_samples += output_samples;
} }
} }
...@@ -767,7 +786,7 @@ int main(int argc, char *argv[]) ...@@ -767,7 +786,7 @@ int main(int argc, char *argv[])
toggle = (toggle + use_inbandfec) & 1; toggle = (toggle + use_inbandfec) & 1;
} }
fprintf (stderr, "average bitrate: %7.3f kb/s\n", fprintf (stderr, "average bitrate: %7.3f kb/s\n",
1e-3*bits*sampling_rate/(frame_size*(double)count)); 1e-3*bits*sampling_rate/tot_samples);
fprintf (stderr, "maximum bitrate: %7.3f kb/s\n", fprintf (stderr, "maximum bitrate: %7.3f kb/s\n",
1e-3*bits_max*sampling_rate/frame_size); 1e-3*bits_max*sampling_rate/frame_size);
if (!decode_only) if (!decode_only)
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment