Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/xiph/opus.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJean-Marc Valin <jmvalin@jmvalin.ca>2012-12-04 23:13:46 +0400
committerJean-Marc Valin <jmvalin@jmvalin.ca>2012-12-05 00:17:43 +0400
commit512d849c24b3ae708fb15c86a047c56d2591ab46 (patch)
tree1b728c2b1502dbb0521bf9a6af1e7eeba15fe8f1 /src
parenta5bd4409319614f166a83934baddceed7e6c58b4 (diff)
Implements OPUS_GET_LAST_FRAME_DURATION decoder ctl()
Diffstat (limited to 'src')
-rw-r--r--src/opus_decoder.c8
-rw-r--r--src/opus_demo.c10
-rw-r--r--src/opus_multistream_decoder.c2
3 files changed, 17 insertions, 3 deletions
diff --git a/src/opus_decoder.c b/src/opus_decoder.c
index 015ae17a..67e8cdb5 100644
--- a/src/opus_decoder.c
+++ b/src/opus_decoder.c
@@ -64,6 +64,7 @@ struct OpusDecoder {
int prev_mode;
int frame_size;
int prev_redundancy;
+ int last_packet_duration;
opus_uint32 rangeFinal;
};
@@ -813,6 +814,7 @@ int opus_decode_native(OpusDecoder *st, const unsigned char *data,
}
if (packet_offset != NULL)
*packet_offset = tot_offset;
+ st->last_packet_duration = nb_samples;
return nb_samples;
}
@@ -966,6 +968,12 @@ int opus_decoder_ctl(OpusDecoder *st, int request, ...)
st->decode_gain = value;
}
break;
+ case OPUS_GET_LAST_PACKET_DURATION_REQUEST:
+ {
+ opus_uint32 *value = va_arg(ap, opus_uint32*);
+ *value = st->last_packet_duration;
+ }
+ break;
default:
/*fprintf(stderr, "unknown opus_decoder_ctl() request: %d", request);*/
ret = OPUS_UNIMPLEMENTED;
diff --git a/src/opus_demo.c b/src/opus_demo.c
index 1cb153a8..09b12a33 100644
--- a/src/opus_demo.c
+++ b/src/opus_demo.c
@@ -684,18 +684,22 @@ int main(int argc, char *argv[])
} else {
int output_samples;
lost = len[toggle]==0 || (packet_loss_perc>0 && rand()%100 < packet_loss_perc);
+ if (lost)
+ opus_decoder_ctl(dec, OPUS_GET_LAST_PACKET_DURATION(&output_samples));
+ else
+ output_samples = max_frame_size;
if( count >= use_inbandfec ) {
/* delay by one packet when using in-band FEC */
if( use_inbandfec ) {
if( lost_prev ) {
/* attempt to decode with in-band FEC from next packet */
- output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, max_frame_size, 1);
+ output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 1);
} else {
/* regular decode */
- output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, max_frame_size, 0);
+ output_samples = opus_decode(dec, data[1-toggle], len[1-toggle], out, output_samples, 0);
}
} else {
- output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, max_frame_size, 0);
+ output_samples = opus_decode(dec, lost ? NULL : data[toggle], len[toggle], out, output_samples, 0);
}
if (output_samples>0)
{
diff --git a/src/opus_multistream_decoder.c b/src/opus_multistream_decoder.c
index ed7cb559..7564c735 100644
--- a/src/opus_multistream_decoder.c
+++ b/src/opus_multistream_decoder.c
@@ -384,6 +384,8 @@ int opus_multistream_decoder_ctl(OpusMSDecoder *st, int request, ...)
{
case OPUS_GET_BANDWIDTH_REQUEST:
case OPUS_GET_SAMPLE_RATE_REQUEST:
+ case OPUS_GET_GAIN_REQUEST:
+ case OPUS_GET_LAST_PACKET_DURATION_REQUEST:
{
OpusDecoder *dec;
/* For int32* GET params, just query the first stream */