From 4275ab1ca03157807bc26d7429a57e349d65f6b3 Mon Sep 17 00:00:00 2001 From: "tina.legrand@webrtc.org" Date: Wed, 19 Dec 2012 09:52:45 +0000 Subject: [PATCH] Implement NetEq duration estimation for Opus. Review URL: https://webrtc-codereview.appspot.com/983004 Patch from Ralph Giles . git-svn-id: http://webrtc.googlecode.com/svn/trunk@3314 4adac7df-926f-26a2-2b94-8c16560cd09d --- .../codecs/opus/interface/opus_interface.h | 15 +++++++++++++++ .../audio_coding/codecs/opus/opus_interface.c | 18 ++++++++++++++++++ .../neteq/interface/webrtc_neteq_help_macros.h | 4 ++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h b/webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h index 5068c7f45..b0907edbc 100644 --- a/webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h +++ b/webrtc/modules/audio_coding/codecs/opus/interface/opus_interface.h @@ -126,6 +126,21 @@ int16_t WebRtcOpus_DecodeSlave(OpusDecInst* inst, int16_t* encoded, int16_t WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded, int16_t number_of_lost_frames); +/**************************************************************************** + * WebRtcOpus_DurationEst(...) + * + * This function calculates the duration of an opus packet. + * Input: + * - inst : Decoder context + * - payload : Encoded data pointer + * - payload_length_bytes : Bytes of encoded data + * + * Return value : The duration of the packet, in samples. + */ +int WebRtcOpus_DurationEst(OpusDecInst* inst, + const uint8_t* payload, + int payload_length_bytes); + #ifdef __cplusplus } // extern "C" #endif diff --git a/webrtc/modules/audio_coding/codecs/opus/opus_interface.c b/webrtc/modules/audio_coding/codecs/opus/opus_interface.c index 7da5df8a7..75463fc50 100644 --- a/webrtc/modules/audio_coding/codecs/opus/opus_interface.c +++ b/webrtc/modules/audio_coding/codecs/opus/opus_interface.c @@ -280,3 +280,21 @@ int16_t WebRtcOpus_DecodePlc(OpusDecInst* inst, int16_t* decoded, * number_of_lost_frames corresponds to. */ return -1; } + +int WebRtcOpus_DurationEst(OpusDecInst* inst, + const uint8_t* payload, + int payload_length_bytes) +{ + int frames, samples; + frames = opus_packet_get_nb_frames(payload, payload_length_bytes); + if (frames < 0) { + /* Invalid payload data. */ + return 0; + } + samples = frames * opus_packet_get_samples_per_frame(payload, 48000); + if (samples < 120 || samples > 5760) { + /* Invalid payload duration. */ + return 0; + } + return samples; +} diff --git a/webrtc/modules/audio_coding/neteq/interface/webrtc_neteq_help_macros.h b/webrtc/modules/audio_coding/neteq/interface/webrtc_neteq_help_macros.h index 58822f1eb..e3c8d968b 100644 --- a/webrtc/modules/audio_coding/neteq/interface/webrtc_neteq_help_macros.h +++ b/webrtc/modules/audio_coding/neteq/interface/webrtc_neteq_help_macros.h @@ -363,7 +363,7 @@ inst.funcGetMDinfo=NULL; \ inst.funcGetPitch=NULL; \ inst.funcUpdBWEst=NULL; \ - inst.funcDurationEst=NULL; \ + inst.funcDurationEst=(WebRtcNetEQ_FuncDurationEst)WebRtcOpus_DurationEst; \ inst.funcGetErrorCode=NULL; #define SET_OPUSSLAVE_FUNCTIONS(inst) \ @@ -375,7 +375,7 @@ inst.funcGetMDinfo=NULL; \ inst.funcGetPitch=NULL; \ inst.funcUpdBWEst=NULL; \ - inst.funcDurationEst=NULL; \ + inst.funcDurationEst=(WebRtcNetEQ_FuncDurationEst)WebRtcOpus_DurationEst; \ inst.funcGetErrorCode=NULL; #define SET_SPEEX_FUNCTIONS(inst) \