aboutsummaryrefslogtreecommitdiffstats
path: root/codecs/G722/G722decode.c
diff options
context:
space:
mode:
Diffstat (limited to 'codecs/G722/G722decode.c')
-rw-r--r--codecs/G722/G722decode.c55
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