aboutsummaryrefslogtreecommitdiffstats
path: root/plugins/easy_codec/codec-g722.c
diff options
context:
space:
mode:
authorTomas Kukosa <tomas.kukosa@siemens.com>2007-12-03 09:59:18 +0000
committerTomas Kukosa <tomas.kukosa@siemens.com>2007-12-03 09:59:18 +0000
commit4df43619aa5e750daad603bd374384f03cdac0c5 (patch)
tree9344e5aaec05e57d54c06d75283eafe84d719f7a /plugins/easy_codec/codec-g722.c
parent395a5add850117138e666794772403bcb3ca4dbc (diff)
Codec plugin example. The stub for ImTelephone libraries.
(It is not compiled by default.) svn path=/trunk/; revision=23699
Diffstat (limited to 'plugins/easy_codec/codec-g722.c')
-rw-r--r--plugins/easy_codec/codec-g722.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/plugins/easy_codec/codec-g722.c b/plugins/easy_codec/codec-g722.c
new file mode 100644
index 0000000000..22a56f91ca
--- /dev/null
+++ b/plugins/easy_codec/codec-g722.c
@@ -0,0 +1,94 @@
+/* codec-g722.c
+* Easy codecs stub for EasyG722
+* 2007 Ales Kocourek
+*
+* $Id$
+*
+* Wireshark - Network traffic analyzer
+* By Gerald Combs <gerald@wireshark.org>
+* Copyright 1998 Gerald Combs
+*
+* This program is free software; you can redistribute it and/or
+* modify it under the terms of the GNU General Public License
+* as published by the Free Software Foundation; either version 2
+* of the License, or (at your option) any later version.
+*
+* This program is distributed in the hope that it will be useful,
+* but WITHOUT ANY WARRANTY; without even the implied warranty of
+* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+* GNU General Public License for more details.
+*
+* You should have received a copy of the GNU General Public License
+* along with this program; if not, write to the Free Software
+* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <glib.h>
+#include <memory.h>
+
+#include "codec-g722.h"
+
+#include "EasyG722/EasyG722.h"
+
+struct g722_context {
+ CODER_HANDLE handle;
+ short speach_buffer[L_G722_FRAME];
+};
+
+void *codec_g722_init(void) {
+ g722_context *ctx = 0;
+
+ ctx = (g722_context*)g_malloc0(sizeof(g722_context));
+ ctx->handle = EasyG722_init_decoder();
+ return ctx;
+}
+
+void codec_g722_release(void *context) {
+ g722_context *ctx = (g722_context*)context;
+
+ if (!ctx) return;
+ EasyG722_release_decoder(ctx->handle);
+ g_free(ctx);
+}
+
+int codec_g722_decode(void *context, const void *input, int inputSizeBytes, void *output, int *outputSizeBytes) {
+ g722_context *ctx = (g722_context*)context;
+ const unsigned char *bitstream = (const unsigned char*)input;
+ short *speech = (short*)output;
+ int decodedBytes = 0;
+ int i;
+
+ if (!ctx) return 0;
+
+ if ((inputSizeBytes % L_G722_FRAME_COMPRESSED) != 0)
+ return 0;
+
+ if (!output)
+ return (inputSizeBytes / L_G722_FRAME_COMPRESSED) * L_G722_FRAME * sizeof(short);
+
+ while ((inputSizeBytes >= L_G722_FRAME_COMPRESSED) &&
+ ((*outputSizeBytes - decodedBytes) >= L_G722_FRAME * sizeof(short))) {
+ if (EasyG722_decoder(ctx->handle, (unsigned char*)bitstream, ctx->speach_buffer)) {
+ int write_index = 0;
+
+ for(i = 0; i < L_G722_FRAME * sizeof(short); i+=2) {
+ ctx->speach_buffer[write_index] = ctx->speach_buffer[i];
+ write_index++;
+ }
+ memcpy(speech, ctx->speach_buffer, L_G722_FRAME / 2 * sizeof(short));
+
+ speech += L_G722_FRAME / 2;
+ decodedBytes += L_G722_FRAME / 2 * sizeof(short);
+
+ }
+ bitstream += L_G722_FRAME_COMPRESSED;
+ inputSizeBytes -= L_G722_FRAME_COMPRESSED;
+ }
+
+ return decodedBytes;
+}
+