diff options
author | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-03 09:59:18 +0000 |
---|---|---|
committer | Tomas Kukosa <tomas.kukosa@siemens.com> | 2007-12-03 09:59:18 +0000 |
commit | 4df43619aa5e750daad603bd374384f03cdac0c5 (patch) | |
tree | 9344e5aaec05e57d54c06d75283eafe84d719f7a /plugins/easy_codec/codec-g722.c | |
parent | 395a5add850117138e666794772403bcb3ca4dbc (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.c | 94 |
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; +} + |