summaryrefslogtreecommitdiff
path: root/codecs/sbc/sbc.c
diff options
context:
space:
mode:
Diffstat (limited to 'codecs/sbc/sbc.c')
-rw-r--r--codecs/sbc/sbc.c138
1 files changed, 138 insertions, 0 deletions
diff --git a/codecs/sbc/sbc.c b/codecs/sbc/sbc.c
new file mode 100644
index 0000000000..b14b5bb681
--- /dev/null
+++ b/codecs/sbc/sbc.c
@@ -0,0 +1,138 @@
+/* sbc.c
+ * Support for external Bluetooth SBC codec
+ *
+ * Copyright 2012, Michal Labedzki for Tieto Corporation
+ *
+ * $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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+ */
+
+#include "config.h"
+
+#ifdef HAVE_SBC
+
+#include <glib.h>
+#include <sbc/sbc.h>
+
+#include "sbc.h"
+
+#define SBC_BUFFER 8192
+
+void *
+codec_sbc_init(void)
+{
+ sbc_t *sbc;
+
+ sbc = g_malloc(sizeof(sbc_t));
+ sbc_init(sbc, 0L);
+
+ return sbc;
+}
+
+void
+codec_sbc_release(void *ctx)
+{
+ sbc_t *sbc = (sbc_t *) ctx;
+
+ sbc_finish(sbc);
+ g_free(sbc);
+}
+
+int
+codec_sbc_get_channels(void *ctx)
+{
+ sbc_t *sbc = (sbc_t *) ctx;
+ if (sbc->mode == SBC_MODE_MONO)
+ return 1;
+
+ return 2;
+}
+
+int
+codec_sbc_get_frequency(void *ctx)
+{
+ sbc_t *sbc = (sbc_t *) ctx;
+ int frequency;
+
+ switch (sbc->frequency) {
+ case SBC_FREQ_16000:
+ frequency = 16000;
+ break;
+
+ case SBC_FREQ_32000:
+ frequency = 32000;
+ break;
+
+ case SBC_FREQ_44100:
+ frequency = 44100;
+ break;
+
+ case SBC_FREQ_48000:
+ frequency = 48000;
+ break;
+ default:
+ frequency = 0;
+ }
+
+ return frequency;
+}
+
+int
+codec_sbc_decode(void *ctx, const void *input, int inputSizeBytes, void *output,
+ int *outputSizeBytes)
+{
+ size_t size_in = (size_t) inputSizeBytes;
+ size_t size_out = SBC_BUFFER;
+ size_t len;
+ int framelen;
+ int xframe_pos = 0;
+ guint8 *data_in = (guint8 *) input;
+ guint8 *data_out = (guint8 *) output;
+ sbc_t *sbc = (sbc_t *) ctx;
+ guint8 *i_data;
+ guint8 tmp;
+
+ if (!output || !outputSizeBytes) {
+ return size_out;
+ }
+
+ sbc->endian = SBC_BE;
+
+ framelen = 0;
+ *outputSizeBytes = 0;
+ while (xframe_pos < inputSizeBytes) {
+ framelen = sbc_decode(sbc, data_in, size_in, data_out, size_out, &len);
+ xframe_pos += framelen;
+ data_in += framelen;
+ *outputSizeBytes += len;
+
+ for (i_data = data_out; i_data < data_out + len; i_data += 2) {
+ tmp = i_data[0];
+ i_data[0] = i_data[1];
+ i_data[1] = tmp;
+ }
+
+ data_out += len;
+ }
+
+ return *outputSizeBytes;
+}
+
+#endif