Allocate correct size of range.
[obnox/wireshark/wip.git] / plugins / easy_codec / codec-g729a.c
1 /* codec-g729a.c
2 * Easy codecs stub for EasyG729A
3 * 2007 Tomas Kukosa
4 *
5 * $Id$
6 *
7 * Wireshark - Network traffic analyzer
8 * By Gerald Combs <gerald@wireshark.org>
9 * Copyright 1998 Gerald Combs
10 *
11 * This program is free software; you can redistribute it and/or
12 * modify it under the terms of the GNU General Public License
13 * as published by the Free Software Foundation; either version 2
14 * of the License, or (at your option) any later version.
15
16 * This program is distributed in the hope that it will be useful,
17 * but WITHOUT ANY WARRANTY; without even the implied warranty of
18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
19 * GNU General Public License for more details.
20
21 * You should have received a copy of the GNU General Public License
22 * along with this program; if not, write to the Free Software
23 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
24 */
25
26 #ifdef HAVE_CONFIG_H
27 #include "config.h"
28 #endif
29
30 #include <glib.h>
31 #include <memory.h>
32
33 #include "codec-g729a.h"
34
35 #include "EasyG729A/EasyG729A.h"
36
37 struct g729a_context {
38   CODER_HANDLE handle;
39   short speach_buffer[L_G729A_FRAME];
40 };
41
42 void *codec_g729a_init(void) {
43   struct g729a_context *ctx = 0;
44
45   ctx = (struct g729a_context*)g_malloc0(sizeof(struct g729a_context));
46   ctx->handle = EasyG729A_init_decoder();
47   return ctx;
48 }
49
50 void codec_g729a_release(void *context) {
51   struct g729a_context *ctx = (struct g729a_context*)context;
52
53   if (!ctx) return;
54   EasyG729A_release_decoder(ctx->handle);
55   g_free(ctx);
56 }
57
58 int codec_g729a_decode(void *context, const void *input, int inputSizeBytes, void *output, int *outputSizeBytes) {
59   struct g729a_context *ctx = (struct g729a_context*)context;
60   const unsigned char *bitstream = (const unsigned char*)input;
61   short *speech = (short*)output;
62   int decodedBytes = 0;
63
64   if (!ctx) return 0;
65
66   if ((inputSizeBytes % L_G729A_FRAME_COMPRESSED) != 0) 
67     return 0;
68
69   if (!output)
70     return (inputSizeBytes / L_G729A_FRAME_COMPRESSED) * L_G729A_FRAME * sizeof(short);
71
72   while ((inputSizeBytes >= L_G729A_FRAME_COMPRESSED) &&
73          ((*outputSizeBytes - decodedBytes) >= L_G729A_FRAME * sizeof(short))) {
74     if (EasyG729A_decoder(ctx->handle, (unsigned char*)bitstream, ctx->speach_buffer)) {
75       memcpy(speech, ctx->speach_buffer, L_G729A_FRAME * sizeof(short));
76       speech += L_G729A_FRAME;
77       decodedBytes += L_G729A_FRAME * sizeof(short);
78     }
79     bitstream += L_G729A_FRAME_COMPRESSED;
80     inputSizeBytes -= L_G729A_FRAME_COMPRESSED;
81   }
82
83   return decodedBytes;
84 }
85