From c4918c93aa30f2e3363e288989180124d3931118 Mon Sep 17 00:00:00 2001 From: Marcel Holtmann Date: Sat, 1 Nov 2008 00:14:46 +0100 Subject: Add more options to SBC encoder and decoder --- sbc/sbcdec.c | 28 ++++++++++++++++++++-------- sbc/sbcenc.c | 33 ++++++++++++++++++++++++++++----- 2 files changed, 48 insertions(+), 13 deletions(-) (limited to 'sbc') diff --git a/sbc/sbcdec.c b/sbc/sbcdec.c index 2464c421..140f1547 100644 --- a/sbc/sbcdec.c +++ b/sbc/sbcdec.c @@ -41,6 +41,8 @@ #define BUF_SIZE 8192 +static int verbose = 0; + static void decode(char *filename, char *output, int tofile) { unsigned char buf[BUF_SIZE], *stream; @@ -120,7 +122,16 @@ static void decode(char *filename, char *output, int tofile) frequency = 0; } - printf("%d Hz, %d channels\n", frequency, channels); + if (verbose) { + fprintf(stderr,"decoding %s with rate %d, %d subbands, " + "%d bits, allocation method %s and mode %s\n", + filename, frequency, sbc.subbands * 4 + 4, sbc.bitpool, + sbc.allocation == SBC_AM_SNR ? "SNR" : "LOUDNESS", + sbc.mode == SBC_MODE_MONO ? "MONO" : + sbc.mode == SBC_MODE_STEREO ? + "STEREO" : "JOINTSTEREO"); + } + if (tofile) { struct au_header au_hdr; @@ -139,25 +150,25 @@ static void decode(char *filename, char *output, int tofile) } else { if (ioctl(ad, SNDCTL_DSP_SETFMT, &format) < 0) { fprintf(stderr, "Can't set audio format on %s: %s\n", - output, strerror(errno)); + output, strerror(errno)); goto close; } if (ioctl(ad, SNDCTL_DSP_CHANNELS, &channels) < 0) { - fprintf(stderr, - "Can't set number of channels on %s: %s\n", - output, strerror(errno)); + fprintf(stderr, "Can't set number of channels on %s: %s\n", + output, strerror(errno)); goto close; } if (ioctl(ad, SNDCTL_DSP_SPEED, &frequency) < 0) { fprintf(stderr, "Can't set audio rate on %s: %s\n", - output, strerror(errno)); + output, strerror(errno)); goto close; } } count = len; + while (framelen > 0) { /* we have completed an sbc_decode at this point sbc.len is the * length of the frame we just decoded count is the number of @@ -233,9 +244,10 @@ static struct option main_options[] = { int main(int argc, char *argv[]) { char *output = NULL; - int i, opt, verbose = 0, tofile = 0; + int i, opt, tofile = 0; - while ((opt = getopt_long(argc, argv, "+hvd:f:", main_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "+hvd:f:", + main_options, NULL)) != -1) { switch(opt) { case 'h': usage(); diff --git a/sbc/sbcenc.c b/sbc/sbcenc.c index 38670a94..74a34349 100644 --- a/sbc/sbcenc.c +++ b/sbc/sbcenc.c @@ -38,6 +38,8 @@ #include "sbc.h" #include "formats.h" +static int verbose = 0; + static ssize_t __read(int fd, void *buf, size_t count) { ssize_t len, pos = 0; @@ -70,12 +72,13 @@ static ssize_t __write(int fd, const void *buf, size_t count) return pos; } -static void encode(char *filename, int subbands, int bitpool, int joint) +static void encode(char *filename, int subbands, + int bitpool, int joint, int snr) { struct au_header *au_hdr; unsigned char input[2048], output[2048]; sbc_t sbc; - int fd, len, size, count, encoded; + int fd, len, size, count, encoded, srate; if (strcmp(filename, "-")) { fd = open(filename, O_RDONLY); @@ -124,6 +127,8 @@ static void encode(char *filename, int subbands, int bitpool, int joint) break; } + srate = BE_INT(au_hdr->sample_rate); + sbc.subbands = subbands == 4 ? SBC_SB_4 : SBC_SB_8; if (BE_INT(au_hdr->channels) == 1) @@ -139,6 +144,17 @@ static void encode(char *filename, int subbands, int bitpool, int joint) memmove(input, input + BE_INT(au_hdr->hdr_size), size); sbc.bitpool = bitpool; + sbc.allocation = snr ? SBC_AM_SNR : SBC_AM_LOUDNESS; + + if(verbose) { + fprintf(stderr,"encoding %s with rate %d, %d subbands, " + "%d bits, allocation method %s and mode %s\n", + filename, srate, subbands, bitpool, + sbc.allocation == SBC_AM_SNR ? "SNR" : "LOUDNESS", + sbc.mode == SBC_MODE_MONO ? "MONO" : + sbc.mode == SBC_MODE_STEREO ? + "STEREO" : "JOINTSTEREO"); + } while (1) { if (size < sizeof(input)) { @@ -193,6 +209,7 @@ static void usage(void) "\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" + "\t-S, --snr Use SNR mode (default is loudness)\n" "\n"); } @@ -202,14 +219,16 @@ static struct option main_options[] = { { "subbands", 1, 0, 's' }, { "bitpool", 1, 0, 'b' }, { "joint", 0, 0, 'j' }, + { "snr", 0, 0, 'S' }, { 0, 0, 0, 0 } }; int main(int argc, char *argv[]) { - int i, opt, verbose = 0, subbands = 8, bitpool = 32, joint = 0; + int i, opt, subbands = 8, bitpool = 32, joint = 0, snr= 0; - while ((opt = getopt_long(argc, argv, "+hvs:b:j", main_options, NULL)) != -1) { + while ((opt = getopt_long(argc, argv, "+hvs:b:jS", + main_options, NULL)) != -1) { switch(opt) { case 'h': usage(); @@ -236,6 +255,10 @@ int main(int argc, char *argv[]) joint = 1; break; + case 'S': + snr = 1; + break; + default: exit(1); } @@ -251,7 +274,7 @@ int main(int argc, char *argv[]) } for (i = 0; i < argc; i++) - encode(argv[i], subbands, bitpool, joint); + encode(argv[i], subbands, bitpool, joint, snr); return 0; } -- cgit