diff options
Diffstat (limited to 'codecs/G722/G722decode.c')
-rw-r--r-- | codecs/G722/G722decode.c | 55 |
1 files changed, 38 insertions, 17 deletions
diff --git a/codecs/G722/G722decode.c b/codecs/G722/G722decode.c index af45520d08..fae16c0626 100644 --- a/codecs/G722/G722decode.c +++ b/codecs/G722/G722decode.c @@ -1,5 +1,5 @@ /* G722decode.c - * A-law G.711 codec + * G.722 codec * * Wireshark - Network traffic analyzer * By Gerald Combs <gerald@wireshark.org> @@ -25,45 +25,66 @@ #include <glib.h> #ifdef HAVE_SPANDSP -#include "telephony.h" -#include "g722.h" +#include "spandsp.h" #include "G722decode.h" -static g722_decode_state_t state; - void * codec_g722_init(void) { - memset (&state, 0, sizeof (state)); - g722_decode_init(&state, 64000, 0); + g722_decode_state_t *state; + + /* Valid values for bit_rate for G.722 are 48000, 56000, 64000, but RTP/AVP + * profile requires 64kbps, aligned at octets. */ + state = g722_decode_init(NULL, 64000, 0); - return NULL; + return state; } void -codec_g722_release(void *ctx _U_) +codec_g722_release(void *ctx) { + g722_decode_state_t *state = (g722_decode_state_t *)ctx; + + if (!state) { + return; /* out-of-memory; */ + } + /* Note: replaces g722_decode_release since spandsp 20090211 */ + g722_decode_free(state); } -int +unsigned codec_g722_get_channels(void *ctx _U_) { + /* G.722 has only one channel. */ return 1; } -int +unsigned codec_g722_get_frequency(void *ctx _U_) { - return 64000; + /* Note: RTP Clock rate is 8kHz due to a historic error, but actual sampling + * rate is 16kHz (RFC 3551, section 4.5.2). */ + return 16000; } -int -codec_g722_decode(void *ctx _U_, const void *input, int inputSizeBytes, void *output, - int *outputSizeBytes) +size_t +codec_g722_decode(void *ctx, const void *input, size_t inputSizeBytes, void *output, + size_t *outputSizeBytes) { - *outputSizeBytes = g722_decode(&state, output, input, inputSizeBytes); - return 0; + g722_decode_state_t *state = (g722_decode_state_t *)ctx; + + if (!state) { + return 0; /* out-of-memory; */ + } + + if (!output || !outputSizeBytes) { + return 4 * inputSizeBytes; + } + + /* g722_decode returns the number of 16-bit samples. */ + *outputSizeBytes = 2 * g722_decode(state, (int16_t *)output, (const uint8_t *)input, (int)inputSizeBytes); + return *outputSizeBytes; } #endif |