summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFrédéric Dalleau <frederic.dalleau@linux.intel.com>2013-04-08 15:24:16 +0200
committerJohan Hedberg <johan.hedberg@intel.com>2013-04-15 11:06:37 +0300
commit15d668cfbde5d0a46cde08b171b1eb84cdba104a (patch)
treeb5d1418933746b05cfe1216043979181065680d7
parenta1f21fb6439aa5c9bfe3b49df2bbf2744c022b9a (diff)
downloadsbc-15d668cfbde5d0a46cde08b171b1eb84cdba104a.tar.gz
sbc: Update sbcenc for msbc
-rw-r--r--src/sbcenc.c108
1 files changed, 65 insertions, 43 deletions
diff --git a/src/sbcenc.c b/src/sbcenc.c
index a723b03..dabdff4 100644
--- a/src/sbcenc.c
+++ b/src/sbcenc.c
@@ -4,6 +4,7 @@
*
* Copyright (C) 2008-2010 Nokia Corporation
* Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
+ * Copyright (C) 2012-2013 Intel Corporation
*
*
* This program is free software; you can redistribute it and/or modify
@@ -31,6 +32,7 @@
#include <fcntl.h>
#include <unistd.h>
#include <stdlib.h>
+#include <stdbool.h>
#include <stdint.h>
#include <string.h>
#include <getopt.h>
@@ -45,7 +47,7 @@ static int verbose = 0;
static unsigned char input[BUF_SIZE], output[BUF_SIZE + BUF_SIZE / 4];
static void encode(char *filename, int subbands, int bitpool, int joint,
- int dualchannel, int snr, int blocks)
+ int dualchannel, int snr, int blocks, bool msbc)
{
struct au_header au_hdr;
sbc_t sbc;
@@ -87,57 +89,70 @@ static void encode(char *filename, int subbands, int bitpool, int joint,
goto done;
}
- sbc_init(&sbc, 0L);
-
- switch (BE_INT(au_hdr.sample_rate)) {
- case 16000:
- sbc.frequency = SBC_FREQ_16000;
- break;
- case 32000:
- sbc.frequency = SBC_FREQ_32000;
- break;
- case 44100:
- sbc.frequency = SBC_FREQ_44100;
- break;
- case 48000:
- sbc.frequency = SBC_FREQ_48000;
- break;
- }
+ if (!msbc) {
+ sbc_init(&sbc, 0L);
+
+ switch (BE_INT(au_hdr.sample_rate)) {
+ case 16000:
+ sbc.frequency = SBC_FREQ_16000;
+ break;
+ case 32000:
+ sbc.frequency = SBC_FREQ_32000;
+ break;
+ case 44100:
+ sbc.frequency = SBC_FREQ_44100;
+ break;
+ case 48000:
+ sbc.frequency = SBC_FREQ_48000;
+ break;
+ }
+
+ srate = BE_INT(au_hdr.sample_rate);
- srate = BE_INT(au_hdr.sample_rate);
+ sbc.subbands = subbands == 4 ? SBC_SB_4 : SBC_SB_8;
- sbc.subbands = subbands == 4 ? SBC_SB_4 : SBC_SB_8;
+ if (BE_INT(au_hdr.channels) == 1) {
+ sbc.mode = SBC_MODE_MONO;
+ if (joint || dualchannel) {
+ fprintf(stderr, "Audio is mono but joint or "
+ "dualchannel mode has been specified\n");
+ goto done;
+ }
+ } else if (joint && !dualchannel)
+ sbc.mode = SBC_MODE_JOINT_STEREO;
+ else if (!joint && dualchannel)
+ sbc.mode = SBC_MODE_DUAL_CHANNEL;
+ else if (!joint && !dualchannel)
+ sbc.mode = SBC_MODE_STEREO;
+ else {
+ fprintf(stderr, "Both joint and dualchannel "
+ "mode have been specified\n");
+ goto done;
+ }
- if (BE_INT(au_hdr.channels) == 1) {
- sbc.mode = SBC_MODE_MONO;
- if (joint || dualchannel) {
- fprintf(stderr, "Audio is mono but joint or "
- "dualchannel mode has been specified\n");
+ sbc.endian = SBC_BE;
+ sbc.bitpool = bitpool;
+ sbc.allocation = snr ? SBC_AM_SNR : SBC_AM_LOUDNESS;
+ sbc.blocks = blocks == 4 ? SBC_BLK_4 :
+ blocks == 8 ? SBC_BLK_8 :
+ blocks == 12 ? SBC_BLK_12 : SBC_BLK_16;
+ } else {
+ if (BE_INT(au_hdr.sample_rate) != 16000 ||
+ BE_INT(au_hdr.channels) != 1 ||
+ BE_INT(au_hdr.channels) != 1) {
+ fprintf(stderr, "mSBC requires 16 bits, 16kHz, mono "
+ "input\n");
goto done;
}
- } else if (joint && !dualchannel)
- sbc.mode = SBC_MODE_JOINT_STEREO;
- else if (!joint && dualchannel)
- sbc.mode = SBC_MODE_DUAL_CHANNEL;
- else if (!joint && !dualchannel)
- sbc.mode = SBC_MODE_STEREO;
- else {
- fprintf(stderr, "Both joint and dualchannel mode have been "
- "specified\n");
- goto done;
+
+ sbc_init_msbc(&sbc, 0);
+ sbc.endian = SBC_BE;
}
- sbc.endian = SBC_BE;
/* Skip extra bytes of the header if any */
if (read(fd, input, BE_INT(au_hdr.hdr_size) - len) < 0)
goto done;
- sbc.bitpool = bitpool;
- sbc.allocation = snr ? SBC_AM_SNR : SBC_AM_LOUDNESS;
- sbc.blocks = blocks == 4 ? SBC_BLK_4 :
- blocks == 8 ? SBC_BLK_8 :
- blocks == 12 ? SBC_BLK_12 : SBC_BLK_16;
-
if (verbose) {
fprintf(stderr, "encoding %s with rate %d, %d blocks, "
"%d subbands, %d bits, allocation method %s, "
@@ -215,6 +230,7 @@ static void usage(void)
printf("Options:\n"
"\t-h, --help Display help\n"
"\t-v, --verbose Verbose mode\n"
+ "\t-m, --msbc mSBC codec\n"
"\t-s, --subbands Number of subbands to use (4 or 8)\n"
"\t-b, --bitpool Bitpool value (default is 32)\n"
"\t-j, --joint Joint stereo\n"
@@ -227,6 +243,7 @@ static void usage(void)
static struct option main_options[] = {
{ "help", 0, 0, 'h' },
{ "verbose", 0, 0, 'v' },
+ { "msbc", 0, 0, 'm' },
{ "subbands", 1, 0, 's' },
{ "bitpool", 1, 0, 'b' },
{ "joint", 0, 0, 'j' },
@@ -240,8 +257,9 @@ int main(int argc, char *argv[])
{
int i, opt, subbands = 8, bitpool = 32, joint = 0, dualchannel = 0;
int snr = 0, blocks = 16;
+ bool msbc = false;
- while ((opt = getopt_long(argc, argv, "+hvs:b:jdSB:",
+ while ((opt = getopt_long(argc, argv, "+hmvs:b:jdSB:",
main_options, NULL)) != -1) {
switch(opt) {
case 'h':
@@ -252,6 +270,10 @@ int main(int argc, char *argv[])
verbose = 1;
break;
+ case 'm':
+ msbc = true;
+ break;
+
case 's':
subbands = atoi(optarg);
if (subbands != 8 && subbands != 4) {
@@ -302,7 +324,7 @@ int main(int argc, char *argv[])
for (i = 0; i < argc; i++)
encode(argv[i], subbands, bitpool, joint, dualchannel,
- snr, blocks);
+ snr, blocks, msbc);
return 0;
}