Home | History | Annotate | Download | only in sbc
      1 /*
      2  *
      3  *  Bluetooth low-complexity, subband codec (SBC) library
      4  *
      5  *  Copyright (C) 2004-2009  Marcel Holtmann <marcel (at) holtmann.org>
      6  *  Copyright (C) 2004-2005  Henryk Ploetz <henryk (at) ploetzli.ch>
      7  *  Copyright (C) 2005-2008  Brad Midgley <bmidgley (at) xmission.com>
      8  *
      9  *
     10  *  This library is free software; you can redistribute it and/or
     11  *  modify it under the terms of the GNU Lesser General Public
     12  *  License as published by the Free Software Foundation; either
     13  *  version 2.1 of the License, or (at your option) any later version.
     14  *
     15  *  This library is distributed in the hope that it will be useful,
     16  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
     17  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     18  *  Lesser General Public License for more details.
     19  *
     20  *  You should have received a copy of the GNU Lesser General Public
     21  *  License along with this library; if not, write to the Free Software
     22  *  Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
     23  *
     24  */
     25 
     26 /* todo items:
     27 
     28   use a log2 table for byte integer scale factors calculation (sum log2 results
     29   for high and low bytes) fill bitpool by 16 bits instead of one at a time in
     30   bits allocation/bitpool generation port to the dsp
     31 
     32 */
     33 
     34 #ifdef HAVE_CONFIG_H
     35 #include <config.h>
     36 #endif
     37 
     38 #include <stdio.h>
     39 #include <errno.h>
     40 #include <string.h>
     41 #include <stdlib.h>
     42 #include <sys/types.h>
     43 #include <limits.h>
     44 
     45 #include "sbc_math.h"
     46 #include "sbc_tables.h"
     47 
     48 #include "sbc.h"
     49 #include "sbc_primitives.h"
     50 
     51 #define SBC_SYNCWORD	0x9C
     52 
     53 /* This structure contains an unpacked SBC frame.
     54    Yes, there is probably quite some unused space herein */
     55 struct sbc_frame {
     56 	uint8_t frequency;
     57 	uint8_t block_mode;
     58 	uint8_t blocks;
     59 	enum {
     60 		MONO		= SBC_MODE_MONO,
     61 		DUAL_CHANNEL	= SBC_MODE_DUAL_CHANNEL,
     62 		STEREO		= SBC_MODE_STEREO,
     63 		JOINT_STEREO	= SBC_MODE_JOINT_STEREO
     64 	} mode;
     65 	uint8_t channels;
     66 	enum {
     67 		LOUDNESS	= SBC_AM_LOUDNESS,
     68 		SNR		= SBC_AM_SNR
     69 	} allocation;
     70 	uint8_t subband_mode;
     71 	uint8_t subbands;
     72 	uint8_t bitpool;
     73 	uint16_t codesize;
     74 	uint8_t length;
     75 
     76 	/* bit number x set means joint stereo has been used in subband x */
     77 	uint8_t joint;
     78 
     79 	/* only the lower 4 bits of every element are to be used */
     80 	uint32_t scale_factor[2][8];
     81 
     82 	/* raw integer subband samples in the frame */
     83 	int32_t SBC_ALIGNED sb_sample_f[16][2][8];
     84 
     85 	/* modified subband samples */
     86 	int32_t SBC_ALIGNED sb_sample[16][2][8];
     87 
     88 	/* original pcm audio samples */
     89 	int16_t SBC_ALIGNED pcm_sample[2][16*8];
     90 };
     91 
     92 struct sbc_decoder_state {
     93 	int subbands;
     94 	int32_t V[2][170];
     95 	int offset[2][16];
     96 };
     97 
     98 /*
     99  * Calculates the CRC-8 of the first len bits in data
    100  */
    101 static const uint8_t crc_table[256] = {
    102 	0x00, 0x1D, 0x3A, 0x27, 0x74, 0x69, 0x4E, 0x53,
    103 	0xE8, 0xF5, 0xD2, 0xCF, 0x9C, 0x81, 0xA6, 0xBB,
    104 	0xCD, 0xD0, 0xF7, 0xEA, 0xB9, 0xA4, 0x83, 0x9E,
    105 	0x25, 0x38, 0x1F, 0x02, 0x51, 0x4C, 0x6B, 0x76,
    106 	0x87, 0x9A, 0xBD, 0xA0, 0xF3, 0xEE, 0xC9, 0xD4,
    107 	0x6F, 0x72, 0x55, 0x48, 0x1B, 0x06, 0x21, 0x3C,
    108 	0x4A, 0x57, 0x70, 0x6D, 0x3E, 0x23, 0x04, 0x19,
    109 	0xA2, 0xBF, 0x98, 0x85, 0xD6, 0xCB, 0xEC, 0xF1,
    110 	0x13, 0x0E, 0x29, 0x34, 0x67, 0x7A, 0x5D, 0x40,
    111 	0xFB, 0xE6, 0xC1, 0xDC, 0x8F, 0x92, 0xB5, 0xA8,
    112 	0xDE, 0xC3, 0xE4, 0xF9, 0xAA, 0xB7, 0x90, 0x8D,
    113 	0x36, 0x2B, 0x0C, 0x11, 0x42, 0x5F, 0x78, 0x65,
    114 	0x94, 0x89, 0xAE, 0xB3, 0xE0, 0xFD, 0xDA, 0xC7,
    115 	0x7C, 0x61, 0x46, 0x5B, 0x08, 0x15, 0x32, 0x2F,
    116 	0x59, 0x44, 0x63, 0x7E, 0x2D, 0x30, 0x17, 0x0A,
    117 	0xB1, 0xAC, 0x8B, 0x96, 0xC5, 0xD8, 0xFF, 0xE2,
    118 	0x26, 0x3B, 0x1C, 0x01, 0x52, 0x4F, 0x68, 0x75,
    119 	0xCE, 0xD3, 0xF4, 0xE9, 0xBA, 0xA7, 0x80, 0x9D,
    120 	0xEB, 0xF6, 0xD1, 0xCC, 0x9F, 0x82, 0xA5, 0xB8,
    121 	0x03, 0x1E, 0x39, 0x24, 0x77, 0x6A, 0x4D, 0x50,
    122 	0xA1, 0xBC, 0x9B, 0x86, 0xD5, 0xC8, 0xEF, 0xF2,
    123 	0x49, 0x54, 0x73, 0x6E, 0x3D, 0x20, 0x07, 0x1A,
    124 	0x6C, 0x71, 0x56, 0x4B, 0x18, 0x05, 0x22, 0x3F,
    125 	0x84, 0x99, 0xBE, 0xA3, 0xF0, 0xED, 0xCA, 0xD7,
    126 	0x35, 0x28, 0x0F, 0x12, 0x41, 0x5C, 0x7B, 0x66,
    127 	0xDD, 0xC0, 0xE7, 0xFA, 0xA9, 0xB4, 0x93, 0x8E,
    128 	0xF8, 0xE5, 0xC2, 0xDF, 0x8C, 0x91, 0xB6, 0xAB,
    129 	0x10, 0x0D, 0x2A, 0x37, 0x64, 0x79, 0x5E, 0x43,
    130 	0xB2, 0xAF, 0x88, 0x95, 0xC6, 0xDB, 0xFC, 0xE1,
    131 	0x5A, 0x47, 0x60, 0x7D, 0x2E, 0x33, 0x14, 0x09,
    132 	0x7F, 0x62, 0x45, 0x58, 0x0B, 0x16, 0x31, 0x2C,
    133 	0x97, 0x8A, 0xAD, 0xB0, 0xE3, 0xFE, 0xD9, 0xC4
    134 };
    135 
    136 static uint8_t sbc_crc8(const uint8_t *data, size_t len)
    137 {
    138 	uint8_t crc = 0x0f;
    139 	size_t i;
    140 	uint8_t octet;
    141 
    142 	for (i = 0; i < len / 8; i++)
    143 		crc = crc_table[crc ^ data[i]];
    144 
    145 	octet = data[i];
    146 	for (i = 0; i < len % 8; i++) {
    147 		char bit = ((octet ^ crc) & 0x80) >> 7;
    148 
    149 		crc = ((crc & 0x7f) << 1) ^ (bit ? 0x1d : 0);
    150 
    151 		octet = octet << 1;
    152 	}
    153 
    154 	return crc;
    155 }
    156 
    157 /*
    158  * Code straight from the spec to calculate the bits array
    159  * Takes a pointer to the frame in question, a pointer to the bits array and
    160  * the sampling frequency (as 2 bit integer)
    161  */
    162 static void sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8])
    163 {
    164 	uint8_t sf = frame->frequency;
    165 
    166 	if (frame->mode == MONO || frame->mode == DUAL_CHANNEL) {
    167 		int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice;
    168 		int ch, sb;
    169 
    170 		for (ch = 0; ch < frame->channels; ch++) {
    171 			max_bitneed = 0;
    172 			if (frame->allocation == SNR) {
    173 				for (sb = 0; sb < frame->subbands; sb++) {
    174 					bitneed[ch][sb] = frame->scale_factor[ch][sb];
    175 					if (bitneed[ch][sb] > max_bitneed)
    176 						max_bitneed = bitneed[ch][sb];
    177 				}
    178 			} else {
    179 				for (sb = 0; sb < frame->subbands; sb++) {
    180 					if (frame->scale_factor[ch][sb] == 0)
    181 						bitneed[ch][sb] = -5;
    182 					else {
    183 						if (frame->subbands == 4)
    184 							loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb];
    185 						else
    186 							loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb];
    187 						if (loudness > 0)
    188 							bitneed[ch][sb] = loudness / 2;
    189 						else
    190 							bitneed[ch][sb] = loudness;
    191 					}
    192 					if (bitneed[ch][sb] > max_bitneed)
    193 						max_bitneed = bitneed[ch][sb];
    194 				}
    195 			}
    196 
    197 			bitcount = 0;
    198 			slicecount = 0;
    199 			bitslice = max_bitneed + 1;
    200 			do {
    201 				bitslice--;
    202 				bitcount += slicecount;
    203 				slicecount = 0;
    204 				for (sb = 0; sb < frame->subbands; sb++) {
    205 					if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16))
    206 						slicecount++;
    207 					else if (bitneed[ch][sb] == bitslice + 1)
    208 						slicecount += 2;
    209 				}
    210 			} while (bitcount + slicecount < frame->bitpool);
    211 
    212 			if (bitcount + slicecount == frame->bitpool) {
    213 				bitcount += slicecount;
    214 				bitslice--;
    215 			}
    216 
    217 			for (sb = 0; sb < frame->subbands; sb++) {
    218 				if (bitneed[ch][sb] < bitslice + 2)
    219 					bits[ch][sb] = 0;
    220 				else {
    221 					bits[ch][sb] = bitneed[ch][sb] - bitslice;
    222 					if (bits[ch][sb] > 16)
    223 						bits[ch][sb] = 16;
    224 				}
    225 			}
    226 
    227 			for (sb = 0; bitcount < frame->bitpool && sb < frame->subbands; sb++) {
    228 				if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) {
    229 					bits[ch][sb]++;
    230 					bitcount++;
    231 				} else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) {
    232 					bits[ch][sb] = 2;
    233 					bitcount += 2;
    234 				}
    235 			}
    236 
    237 			for (sb = 0; bitcount < frame->bitpool && sb < frame->subbands; sb++) {
    238 				if (bits[ch][sb] < 16) {
    239 					bits[ch][sb]++;
    240 					bitcount++;
    241 				}
    242 			}
    243 
    244 		}
    245 
    246 	} else if (frame->mode == STEREO || frame->mode == JOINT_STEREO) {
    247 		int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice;
    248 		int ch, sb;
    249 
    250 		max_bitneed = 0;
    251 		if (frame->allocation == SNR) {
    252 			for (ch = 0; ch < 2; ch++) {
    253 				for (sb = 0; sb < frame->subbands; sb++) {
    254 					bitneed[ch][sb] = frame->scale_factor[ch][sb];
    255 					if (bitneed[ch][sb] > max_bitneed)
    256 						max_bitneed = bitneed[ch][sb];
    257 				}
    258 			}
    259 		} else {
    260 			for (ch = 0; ch < 2; ch++) {
    261 				for (sb = 0; sb < frame->subbands; sb++) {
    262 					if (frame->scale_factor[ch][sb] == 0)
    263 						bitneed[ch][sb] = -5;
    264 					else {
    265 						if (frame->subbands == 4)
    266 							loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb];
    267 						else
    268 							loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb];
    269 						if (loudness > 0)
    270 							bitneed[ch][sb] = loudness / 2;
    271 						else
    272 							bitneed[ch][sb] = loudness;
    273 					}
    274 					if (bitneed[ch][sb] > max_bitneed)
    275 						max_bitneed = bitneed[ch][sb];
    276 				}
    277 			}
    278 		}
    279 
    280 		bitcount = 0;
    281 		slicecount = 0;
    282 		bitslice = max_bitneed + 1;
    283 		do {
    284 			bitslice--;
    285 			bitcount += slicecount;
    286 			slicecount = 0;
    287 			for (ch = 0; ch < 2; ch++) {
    288 				for (sb = 0; sb < frame->subbands; sb++) {
    289 					if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16))
    290 						slicecount++;
    291 					else if (bitneed[ch][sb] == bitslice + 1)
    292 						slicecount += 2;
    293 				}
    294 			}
    295 		} while (bitcount + slicecount < frame->bitpool);
    296 
    297 		if (bitcount + slicecount == frame->bitpool) {
    298 			bitcount += slicecount;
    299 			bitslice--;
    300 		}
    301 
    302 		for (ch = 0; ch < 2; ch++) {
    303 			for (sb = 0; sb < frame->subbands; sb++) {
    304 				if (bitneed[ch][sb] < bitslice + 2) {
    305 					bits[ch][sb] = 0;
    306 				} else {
    307 					bits[ch][sb] = bitneed[ch][sb] - bitslice;
    308 					if (bits[ch][sb] > 16)
    309 						bits[ch][sb] = 16;
    310 				}
    311 			}
    312 		}
    313 
    314 		ch = 0;
    315 		sb = 0;
    316 		while (bitcount < frame->bitpool) {
    317 			if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) {
    318 				bits[ch][sb]++;
    319 				bitcount++;
    320 			} else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) {
    321 				bits[ch][sb] = 2;
    322 				bitcount += 2;
    323 			}
    324 			if (ch == 1) {
    325 				ch = 0;
    326 				sb++;
    327 				if (sb >= frame->subbands) break;
    328 			} else
    329 				ch = 1;
    330 		}
    331 
    332 		ch = 0;
    333 		sb = 0;
    334 		while (bitcount < frame->bitpool) {
    335 			if (bits[ch][sb] < 16) {
    336 				bits[ch][sb]++;
    337 				bitcount++;
    338 			}
    339 			if (ch == 1) {
    340 				ch = 0;
    341 				sb++;
    342 				if (sb >= frame->subbands) break;
    343 			} else
    344 				ch = 1;
    345 		}
    346 
    347 	}
    348 
    349 }
    350 
    351 /*
    352  * Unpacks a SBC frame at the beginning of the stream in data,
    353  * which has at most len bytes into frame.
    354  * Returns the length in bytes of the packed frame, or a negative
    355  * value on error. The error codes are:
    356  *
    357  *  -1   Data stream too short
    358  *  -2   Sync byte incorrect
    359  *  -3   CRC8 incorrect
    360  *  -4   Bitpool value out of bounds
    361  */
    362 static int sbc_unpack_frame(const uint8_t *data, struct sbc_frame *frame,
    363 								size_t len)
    364 {
    365 	unsigned int consumed;
    366 	/* Will copy the parts of the header that are relevant to crc
    367 	 * calculation here */
    368 	uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    369 	int crc_pos = 0;
    370 	int32_t temp;
    371 
    372 	int audio_sample;
    373 	int ch, sb, blk, bit;	/* channel, subband, block and bit standard
    374 				   counters */
    375 	int bits[2][8];		/* bits distribution */
    376 	uint32_t levels[2][8];	/* levels derived from that */
    377 
    378 	if (len < 4)
    379 		return -1;
    380 
    381 	if (data[0] != SBC_SYNCWORD)
    382 		return -2;
    383 
    384 	frame->frequency = (data[1] >> 6) & 0x03;
    385 
    386 	frame->block_mode = (data[1] >> 4) & 0x03;
    387 	switch (frame->block_mode) {
    388 	case SBC_BLK_4:
    389 		frame->blocks = 4;
    390 		break;
    391 	case SBC_BLK_8:
    392 		frame->blocks = 8;
    393 		break;
    394 	case SBC_BLK_12:
    395 		frame->blocks = 12;
    396 		break;
    397 	case SBC_BLK_16:
    398 		frame->blocks = 16;
    399 		break;
    400 	}
    401 
    402 	frame->mode = (data[1] >> 2) & 0x03;
    403 	switch (frame->mode) {
    404 	case MONO:
    405 		frame->channels = 1;
    406 		break;
    407 	case DUAL_CHANNEL:	/* fall-through */
    408 	case STEREO:
    409 	case JOINT_STEREO:
    410 		frame->channels = 2;
    411 		break;
    412 	}
    413 
    414 	frame->allocation = (data[1] >> 1) & 0x01;
    415 
    416 	frame->subband_mode = (data[1] & 0x01);
    417 	frame->subbands = frame->subband_mode ? 8 : 4;
    418 
    419 	frame->bitpool = data[2];
    420 
    421 	if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
    422 			frame->bitpool > 16 * frame->subbands)
    423 		return -4;
    424 
    425 	if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
    426 			frame->bitpool > 32 * frame->subbands)
    427 		return -4;
    428 
    429 	/* data[3] is crc, we're checking it later */
    430 
    431 	consumed = 32;
    432 
    433 	crc_header[0] = data[1];
    434 	crc_header[1] = data[2];
    435 	crc_pos = 16;
    436 
    437 	if (frame->mode == JOINT_STEREO) {
    438 		if (len * 8 < consumed + frame->subbands)
    439 			return -1;
    440 
    441 		frame->joint = 0x00;
    442 		for (sb = 0; sb < frame->subbands - 1; sb++)
    443 			frame->joint |= ((data[4] >> (7 - sb)) & 0x01) << sb;
    444 		if (frame->subbands == 4)
    445 			crc_header[crc_pos / 8] = data[4] & 0xf0;
    446 		else
    447 			crc_header[crc_pos / 8] = data[4];
    448 
    449 		consumed += frame->subbands;
    450 		crc_pos += frame->subbands;
    451 	}
    452 
    453 	if (len * 8 < consumed + (4 * frame->subbands * frame->channels))
    454 		return -1;
    455 
    456 	for (ch = 0; ch < frame->channels; ch++) {
    457 		for (sb = 0; sb < frame->subbands; sb++) {
    458 			/* FIXME assert(consumed % 4 == 0); */
    459 			frame->scale_factor[ch][sb] =
    460 				(data[consumed >> 3] >> (4 - (consumed & 0x7))) & 0x0F;
    461 			crc_header[crc_pos >> 3] |=
    462 				frame->scale_factor[ch][sb] << (4 - (crc_pos & 0x7));
    463 
    464 			consumed += 4;
    465 			crc_pos += 4;
    466 		}
    467 	}
    468 
    469 	if (data[3] != sbc_crc8(crc_header, crc_pos))
    470 		return -3;
    471 
    472 	sbc_calculate_bits(frame, bits);
    473 
    474 	for (ch = 0; ch < frame->channels; ch++) {
    475 		for (sb = 0; sb < frame->subbands; sb++)
    476 			levels[ch][sb] = (1 << bits[ch][sb]) - 1;
    477 	}
    478 
    479 	for (blk = 0; blk < frame->blocks; blk++) {
    480 		for (ch = 0; ch < frame->channels; ch++) {
    481 			for (sb = 0; sb < frame->subbands; sb++) {
    482 				if (levels[ch][sb] > 0) {
    483 					audio_sample = 0;
    484 					for (bit = 0; bit < bits[ch][sb]; bit++) {
    485 						if (consumed > len * 8)
    486 							return -1;
    487 
    488 						if ((data[consumed >> 3] >> (7 - (consumed & 0x7))) & 0x01)
    489 							audio_sample |= 1 << (bits[ch][sb] - bit - 1);
    490 
    491 						consumed++;
    492 					}
    493 
    494 					frame->sb_sample[blk][ch][sb] =
    495 						(((audio_sample << 1) | 1) << frame->scale_factor[ch][sb]) /
    496 						levels[ch][sb] - (1 << frame->scale_factor[ch][sb]);
    497 				} else
    498 					frame->sb_sample[blk][ch][sb] = 0;
    499 			}
    500 		}
    501 	}
    502 
    503 	if (frame->mode == JOINT_STEREO) {
    504 		for (blk = 0; blk < frame->blocks; blk++) {
    505 			for (sb = 0; sb < frame->subbands; sb++) {
    506 				if (frame->joint & (0x01 << sb)) {
    507 					temp = frame->sb_sample[blk][0][sb] +
    508 						frame->sb_sample[blk][1][sb];
    509 					frame->sb_sample[blk][1][sb] =
    510 						frame->sb_sample[blk][0][sb] -
    511 						frame->sb_sample[blk][1][sb];
    512 					frame->sb_sample[blk][0][sb] = temp;
    513 				}
    514 			}
    515 		}
    516 	}
    517 
    518 	if ((consumed & 0x7) != 0)
    519 		consumed += 8 - (consumed & 0x7);
    520 
    521 	return consumed >> 3;
    522 }
    523 
    524 static void sbc_decoder_init(struct sbc_decoder_state *state,
    525 					const struct sbc_frame *frame)
    526 {
    527 	int i, ch;
    528 
    529 	memset(state->V, 0, sizeof(state->V));
    530 	state->subbands = frame->subbands;
    531 
    532 	for (ch = 0; ch < 2; ch++)
    533 		for (i = 0; i < frame->subbands * 2; i++)
    534 			state->offset[ch][i] = (10 * i + 10);
    535 }
    536 
    537 static SBC_ALWAYS_INLINE int16_t sbc_clip16(int32_t s)
    538 {
    539 	if (s > 0x7FFF)
    540 		return 0x7FFF;
    541 	else if (s < -0x8000)
    542 		return -0x8000;
    543 	else
    544 		return s;
    545 }
    546 
    547 static inline void sbc_synthesize_four(struct sbc_decoder_state *state,
    548 				struct sbc_frame *frame, int ch, int blk)
    549 {
    550 	int i, k, idx;
    551 	int32_t *v = state->V[ch];
    552 	int *offset = state->offset[ch];
    553 
    554 	for (i = 0; i < 8; i++) {
    555 		/* Shifting */
    556 		offset[i]--;
    557 		if (offset[i] < 0) {
    558 			offset[i] = 79;
    559 			memcpy(v + 80, v, 9 * sizeof(*v));
    560 		}
    561 
    562 		/* Distribute the new matrix value to the shifted position */
    563 		v[offset[i]] = SCALE4_STAGED1(
    564 			MULA(synmatrix4[i][0], frame->sb_sample[blk][ch][0],
    565 			MULA(synmatrix4[i][1], frame->sb_sample[blk][ch][1],
    566 			MULA(synmatrix4[i][2], frame->sb_sample[blk][ch][2],
    567 			MUL (synmatrix4[i][3], frame->sb_sample[blk][ch][3])))));
    568 	}
    569 
    570 	/* Compute the samples */
    571 	for (idx = 0, i = 0; i < 4; i++, idx += 5) {
    572 		k = (i + 4) & 0xf;
    573 
    574 		/* Store in output, Q0 */
    575 		frame->pcm_sample[ch][blk * 4 + i] = sbc_clip16(SCALE4_STAGED1(
    576 			MULA(v[offset[i] + 0], sbc_proto_4_40m0[idx + 0],
    577 			MULA(v[offset[k] + 1], sbc_proto_4_40m1[idx + 0],
    578 			MULA(v[offset[i] + 2], sbc_proto_4_40m0[idx + 1],
    579 			MULA(v[offset[k] + 3], sbc_proto_4_40m1[idx + 1],
    580 			MULA(v[offset[i] + 4], sbc_proto_4_40m0[idx + 2],
    581 			MULA(v[offset[k] + 5], sbc_proto_4_40m1[idx + 2],
    582 			MULA(v[offset[i] + 6], sbc_proto_4_40m0[idx + 3],
    583 			MULA(v[offset[k] + 7], sbc_proto_4_40m1[idx + 3],
    584 			MULA(v[offset[i] + 8], sbc_proto_4_40m0[idx + 4],
    585 			MUL( v[offset[k] + 9], sbc_proto_4_40m1[idx + 4]))))))))))));
    586 	}
    587 }
    588 
    589 static inline void sbc_synthesize_eight(struct sbc_decoder_state *state,
    590 				struct sbc_frame *frame, int ch, int blk)
    591 {
    592 	int i, j, k, idx;
    593 	int *offset = state->offset[ch];
    594 
    595 	for (i = 0; i < 16; i++) {
    596 		/* Shifting */
    597 		offset[i]--;
    598 		if (offset[i] < 0) {
    599 			offset[i] = 159;
    600 			for (j = 0; j < 9; j++)
    601 				state->V[ch][j + 160] = state->V[ch][j];
    602 		}
    603 
    604 		/* Distribute the new matrix value to the shifted position */
    605 		state->V[ch][offset[i]] = SCALE8_STAGED1(
    606 			MULA(synmatrix8[i][0], frame->sb_sample[blk][ch][0],
    607 			MULA(synmatrix8[i][1], frame->sb_sample[blk][ch][1],
    608 			MULA(synmatrix8[i][2], frame->sb_sample[blk][ch][2],
    609 			MULA(synmatrix8[i][3], frame->sb_sample[blk][ch][3],
    610 			MULA(synmatrix8[i][4], frame->sb_sample[blk][ch][4],
    611 			MULA(synmatrix8[i][5], frame->sb_sample[blk][ch][5],
    612 			MULA(synmatrix8[i][6], frame->sb_sample[blk][ch][6],
    613 			MUL( synmatrix8[i][7], frame->sb_sample[blk][ch][7])))))))));
    614 	}
    615 
    616 	/* Compute the samples */
    617 	for (idx = 0, i = 0; i < 8; i++, idx += 5) {
    618 		k = (i + 8) & 0xf;
    619 
    620 		/* Store in output, Q0 */
    621 		frame->pcm_sample[ch][blk * 8 + i] = sbc_clip16(SCALE8_STAGED1(
    622 			MULA(state->V[ch][offset[i] + 0], sbc_proto_8_80m0[idx + 0],
    623 			MULA(state->V[ch][offset[k] + 1], sbc_proto_8_80m1[idx + 0],
    624 			MULA(state->V[ch][offset[i] + 2], sbc_proto_8_80m0[idx + 1],
    625 			MULA(state->V[ch][offset[k] + 3], sbc_proto_8_80m1[idx + 1],
    626 			MULA(state->V[ch][offset[i] + 4], sbc_proto_8_80m0[idx + 2],
    627 			MULA(state->V[ch][offset[k] + 5], sbc_proto_8_80m1[idx + 2],
    628 			MULA(state->V[ch][offset[i] + 6], sbc_proto_8_80m0[idx + 3],
    629 			MULA(state->V[ch][offset[k] + 7], sbc_proto_8_80m1[idx + 3],
    630 			MULA(state->V[ch][offset[i] + 8], sbc_proto_8_80m0[idx + 4],
    631 			MUL( state->V[ch][offset[k] + 9], sbc_proto_8_80m1[idx + 4]))))))))))));
    632 	}
    633 }
    634 
    635 static int sbc_synthesize_audio(struct sbc_decoder_state *state,
    636 						struct sbc_frame *frame)
    637 {
    638 	int ch, blk;
    639 
    640 	switch (frame->subbands) {
    641 	case 4:
    642 		for (ch = 0; ch < frame->channels; ch++) {
    643 			for (blk = 0; blk < frame->blocks; blk++)
    644 				sbc_synthesize_four(state, frame, ch, blk);
    645 		}
    646 		return frame->blocks * 4;
    647 
    648 	case 8:
    649 		for (ch = 0; ch < frame->channels; ch++) {
    650 			for (blk = 0; blk < frame->blocks; blk++)
    651 				sbc_synthesize_eight(state, frame, ch, blk);
    652 		}
    653 		return frame->blocks * 8;
    654 
    655 	default:
    656 		return -EIO;
    657 	}
    658 }
    659 
    660 static int sbc_analyze_audio(struct sbc_encoder_state *state,
    661 						struct sbc_frame *frame)
    662 {
    663 	int ch, blk;
    664 	int16_t *x;
    665 
    666 	switch (frame->subbands) {
    667 	case 4:
    668 		for (ch = 0; ch < frame->channels; ch++) {
    669 			x = &state->X[ch][state->position - 16 +
    670 							frame->blocks * 4];
    671 			for (blk = 0; blk < frame->blocks; blk += 4) {
    672 				state->sbc_analyze_4b_4s(
    673 					x,
    674 					frame->sb_sample_f[blk][ch],
    675 					frame->sb_sample_f[blk + 1][ch] -
    676 					frame->sb_sample_f[blk][ch]);
    677 				x -= 16;
    678 			}
    679 		}
    680 		return frame->blocks * 4;
    681 
    682 	case 8:
    683 		for (ch = 0; ch < frame->channels; ch++) {
    684 			x = &state->X[ch][state->position - 32 +
    685 							frame->blocks * 8];
    686 			for (blk = 0; blk < frame->blocks; blk += 4) {
    687 				state->sbc_analyze_4b_8s(
    688 					x,
    689 					frame->sb_sample_f[blk][ch],
    690 					frame->sb_sample_f[blk + 1][ch] -
    691 					frame->sb_sample_f[blk][ch]);
    692 				x -= 32;
    693 			}
    694 		}
    695 		return frame->blocks * 8;
    696 
    697 	default:
    698 		return -EIO;
    699 	}
    700 }
    701 
    702 /* Supplementary bitstream writing macros for 'sbc_pack_frame' */
    703 
    704 #define PUT_BITS(data_ptr, bits_cache, bits_count, v, n)		\
    705 	do {								\
    706 		bits_cache = (v) | (bits_cache << (n));			\
    707 		bits_count += (n);					\
    708 		if (bits_count >= 16) {					\
    709 			bits_count -= 8;				\
    710 			*data_ptr++ = (uint8_t)				\
    711 				(bits_cache >> bits_count);		\
    712 			bits_count -= 8;				\
    713 			*data_ptr++ = (uint8_t)				\
    714 				(bits_cache >> bits_count);		\
    715 		}							\
    716 	} while (0)
    717 
    718 #define FLUSH_BITS(data_ptr, bits_cache, bits_count)			\
    719 	do {								\
    720 		while (bits_count >= 8) {				\
    721 			bits_count -= 8;				\
    722 			*data_ptr++ = (uint8_t)				\
    723 				(bits_cache >> bits_count);		\
    724 		}							\
    725 		if (bits_count > 0)					\
    726 			*data_ptr++ = (uint8_t)				\
    727 				(bits_cache << (8 - bits_count));	\
    728 	} while (0)
    729 
    730 /*
    731  * Packs the SBC frame from frame into the memory at data. At most len
    732  * bytes will be used, should more memory be needed an appropriate
    733  * error code will be returned. Returns the length of the packed frame
    734  * on success or a negative value on error.
    735  *
    736  * The error codes are:
    737  * -1 Not enough memory reserved
    738  * -2 Unsupported sampling rate
    739  * -3 Unsupported number of blocks
    740  * -4 Unsupported number of subbands
    741  * -5 Bitpool value out of bounds
    742  * -99 not implemented
    743  */
    744 
    745 static SBC_ALWAYS_INLINE int sbc_pack_frame_internal(uint8_t *data,
    746 					struct sbc_frame *frame, size_t len,
    747 					int frame_subbands, int frame_channels)
    748 {
    749 	/* Bitstream writer starts from the fourth byte */
    750 	uint8_t *data_ptr = data + 4;
    751 	uint32_t bits_cache = 0;
    752 	uint32_t bits_count = 0;
    753 
    754 	/* Will copy the header parts for CRC-8 calculation here */
    755 	uint8_t crc_header[11] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
    756 	int crc_pos = 0;
    757 
    758 	uint32_t audio_sample;
    759 
    760 	int ch, sb, blk;	/* channel, subband, block and bit counters */
    761 	int bits[2][8];		/* bits distribution */
    762 	uint32_t levels[2][8];	/* levels are derived from that */
    763 	uint32_t sb_sample_delta[2][8];
    764 
    765 	data[0] = SBC_SYNCWORD;
    766 
    767 	data[1] = (frame->frequency & 0x03) << 6;
    768 
    769 	data[1] |= (frame->block_mode & 0x03) << 4;
    770 
    771 	data[1] |= (frame->mode & 0x03) << 2;
    772 
    773 	data[1] |= (frame->allocation & 0x01) << 1;
    774 
    775 	switch (frame_subbands) {
    776 	case 4:
    777 		/* Nothing to do */
    778 		break;
    779 	case 8:
    780 		data[1] |= 0x01;
    781 		break;
    782 	default:
    783 		return -4;
    784 		break;
    785 	}
    786 
    787 	data[2] = frame->bitpool;
    788 
    789 	if ((frame->mode == MONO || frame->mode == DUAL_CHANNEL) &&
    790 			frame->bitpool > frame_subbands << 4)
    791 		return -5;
    792 
    793 	if ((frame->mode == STEREO || frame->mode == JOINT_STEREO) &&
    794 			frame->bitpool > frame_subbands << 5)
    795 		return -5;
    796 
    797 	/* Can't fill in crc yet */
    798 
    799 	crc_header[0] = data[1];
    800 	crc_header[1] = data[2];
    801 	crc_pos = 16;
    802 
    803 	if (frame->mode == JOINT_STEREO) {
    804 		/* like frame->sb_sample but joint stereo */
    805 		int32_t sb_sample_j[16][2];
    806 		/* scalefactor and scale_factor in joint case */
    807 		uint32_t scalefactor_j[2];
    808 		uint8_t scale_factor_j[2];
    809 
    810 		uint8_t joint = 0;
    811 		frame->joint = 0;
    812 
    813 		for (sb = 0; sb < frame_subbands - 1; sb++) {
    814 			scale_factor_j[0] = 0;
    815 			scalefactor_j[0] = 2 << SCALE_OUT_BITS;
    816 			scale_factor_j[1] = 0;
    817 			scalefactor_j[1] = 2 << SCALE_OUT_BITS;
    818 
    819 			for (blk = 0; blk < frame->blocks; blk++) {
    820 				uint32_t tmp;
    821 				/* Calculate joint stereo signal */
    822 				sb_sample_j[blk][0] =
    823 					ASR(frame->sb_sample_f[blk][0][sb], 1) +
    824 					ASR(frame->sb_sample_f[blk][1][sb], 1);
    825 				sb_sample_j[blk][1] =
    826 					ASR(frame->sb_sample_f[blk][0][sb], 1) -
    827 					ASR(frame->sb_sample_f[blk][1][sb], 1);
    828 
    829 				/* calculate scale_factor_j and scalefactor_j for joint case */
    830 				tmp = fabs(sb_sample_j[blk][0]);
    831 				while (scalefactor_j[0] < tmp) {
    832 					scale_factor_j[0]++;
    833 					scalefactor_j[0] *= 2;
    834 				}
    835 				tmp = fabs(sb_sample_j[blk][1]);
    836 				while (scalefactor_j[1] < tmp) {
    837 					scale_factor_j[1]++;
    838 					scalefactor_j[1] *= 2;
    839 				}
    840 			}
    841 
    842 			/* decide whether to join this subband */
    843 			if ((frame->scale_factor[0][sb] +
    844 					frame->scale_factor[1][sb]) >
    845 					(scale_factor_j[0] +
    846 					scale_factor_j[1])) {
    847 				/* use joint stereo for this subband */
    848 				joint |= 1 << (frame_subbands - 1 - sb);
    849 				frame->joint |= 1 << sb;
    850 				frame->scale_factor[0][sb] = scale_factor_j[0];
    851 				frame->scale_factor[1][sb] = scale_factor_j[1];
    852 				for (blk = 0; blk < frame->blocks; blk++) {
    853 					frame->sb_sample_f[blk][0][sb] =
    854 							sb_sample_j[blk][0];
    855 					frame->sb_sample_f[blk][1][sb] =
    856 							sb_sample_j[blk][1];
    857 				}
    858 			}
    859 		}
    860 
    861 		PUT_BITS(data_ptr, bits_cache, bits_count,
    862 			joint, frame_subbands);
    863 		crc_header[crc_pos >> 3] = joint;
    864 		crc_pos += frame_subbands;
    865 	}
    866 
    867 	for (ch = 0; ch < frame_channels; ch++) {
    868 		for (sb = 0; sb < frame_subbands; sb++) {
    869 			PUT_BITS(data_ptr, bits_cache, bits_count,
    870 				frame->scale_factor[ch][sb] & 0x0F, 4);
    871 			crc_header[crc_pos >> 3] <<= 4;
    872 			crc_header[crc_pos >> 3] |= frame->scale_factor[ch][sb] & 0x0F;
    873 			crc_pos += 4;
    874 		}
    875 	}
    876 
    877 	/* align the last crc byte */
    878 	if (crc_pos % 8)
    879 		crc_header[crc_pos >> 3] <<= 8 - (crc_pos % 8);
    880 
    881 	data[3] = sbc_crc8(crc_header, crc_pos);
    882 
    883 	sbc_calculate_bits(frame, bits);
    884 
    885 	for (ch = 0; ch < frame_channels; ch++) {
    886 		for (sb = 0; sb < frame_subbands; sb++) {
    887 			levels[ch][sb] = ((1 << bits[ch][sb]) - 1) <<
    888 				(32 - (frame->scale_factor[ch][sb] +
    889 					SCALE_OUT_BITS + 2));
    890 			sb_sample_delta[ch][sb] = (uint32_t) 1 <<
    891 				(frame->scale_factor[ch][sb] +
    892 					SCALE_OUT_BITS + 1);
    893 		}
    894 	}
    895 
    896 	for (blk = 0; blk < frame->blocks; blk++) {
    897 		for (ch = 0; ch < frame_channels; ch++) {
    898 			for (sb = 0; sb < frame_subbands; sb++) {
    899 
    900 				if (bits[ch][sb] == 0)
    901 					continue;
    902 
    903 				audio_sample = ((uint64_t) levels[ch][sb] *
    904 					(sb_sample_delta[ch][sb] +
    905 					frame->sb_sample_f[blk][ch][sb])) >> 32;
    906 
    907 				PUT_BITS(data_ptr, bits_cache, bits_count,
    908 					audio_sample, bits[ch][sb]);
    909 			}
    910 		}
    911 	}
    912 
    913 	FLUSH_BITS(data_ptr, bits_cache, bits_count);
    914 
    915 	return data_ptr - data;
    916 }
    917 
    918 static int sbc_pack_frame(uint8_t *data, struct sbc_frame *frame, size_t len)
    919 {
    920 	if (frame->subbands == 4) {
    921 		if (frame->channels == 1)
    922 			return sbc_pack_frame_internal(data, frame, len, 4, 1);
    923 		else
    924 			return sbc_pack_frame_internal(data, frame, len, 4, 2);
    925 	} else {
    926 		if (frame->channels == 1)
    927 			return sbc_pack_frame_internal(data, frame, len, 8, 1);
    928 		else
    929 			return sbc_pack_frame_internal(data, frame, len, 8, 2);
    930 	}
    931 }
    932 
    933 static void sbc_encoder_init(struct sbc_encoder_state *state,
    934 					const struct sbc_frame *frame)
    935 {
    936 	memset(&state->X, 0, sizeof(state->X));
    937 	state->position = (SBC_X_BUFFER_SIZE - frame->subbands * 9) & ~7;
    938 
    939 	sbc_init_primitives(state);
    940 }
    941 
    942 struct sbc_priv {
    943 	int init;
    944 	struct SBC_ALIGNED sbc_frame frame;
    945 	struct SBC_ALIGNED sbc_decoder_state dec_state;
    946 	struct SBC_ALIGNED sbc_encoder_state enc_state;
    947 };
    948 
    949 static void sbc_set_defaults(sbc_t *sbc, unsigned long flags)
    950 {
    951 	sbc->frequency = SBC_FREQ_44100;
    952 	sbc->mode = SBC_MODE_STEREO;
    953 	sbc->subbands = SBC_SB_8;
    954 	sbc->blocks = SBC_BLK_16;
    955 	sbc->bitpool = 32;
    956 #if __BYTE_ORDER == __LITTLE_ENDIAN
    957 	sbc->endian = SBC_LE;
    958 #elif __BYTE_ORDER == __BIG_ENDIAN
    959 	sbc->endian = SBC_BE;
    960 #else
    961 #error "Unknown byte order"
    962 #endif
    963 }
    964 
    965 int sbc_init(sbc_t *sbc, unsigned long flags)
    966 {
    967 	if (!sbc)
    968 		return -EIO;
    969 
    970 	memset(sbc, 0, sizeof(sbc_t));
    971 
    972 	sbc->priv_alloc_base = malloc(sizeof(struct sbc_priv) + SBC_ALIGN_MASK);
    973 	if (!sbc->priv_alloc_base)
    974 		return -ENOMEM;
    975 
    976 	sbc->priv = (void *) (((uintptr_t) sbc->priv_alloc_base +
    977 			SBC_ALIGN_MASK) & ~((uintptr_t) SBC_ALIGN_MASK));
    978 
    979 	memset(sbc->priv, 0, sizeof(struct sbc_priv));
    980 
    981 	sbc_set_defaults(sbc, flags);
    982 
    983 	return 0;
    984 }
    985 
    986 ssize_t sbc_parse(sbc_t *sbc, const void *input, size_t input_len)
    987 {
    988 	return sbc_decode(sbc, input, input_len, NULL, 0, NULL);
    989 }
    990 
    991 ssize_t sbc_decode(sbc_t *sbc, const void *input, size_t input_len,
    992 			void *output, size_t output_len, size_t *written)
    993 {
    994 	struct sbc_priv *priv;
    995 	char *ptr;
    996 	int i, ch, framelen, samples;
    997 
    998 	if (!sbc || !input)
    999 		return -EIO;
   1000 
   1001 	priv = sbc->priv;
   1002 
   1003 	framelen = sbc_unpack_frame(input, &priv->frame, input_len);
   1004 
   1005 	if (!priv->init) {
   1006 		sbc_decoder_init(&priv->dec_state, &priv->frame);
   1007 		priv->init = 1;
   1008 
   1009 		sbc->frequency = priv->frame.frequency;
   1010 		sbc->mode = priv->frame.mode;
   1011 		sbc->subbands = priv->frame.subband_mode;
   1012 		sbc->blocks = priv->frame.block_mode;
   1013 		sbc->allocation = priv->frame.allocation;
   1014 		sbc->bitpool = priv->frame.bitpool;
   1015 
   1016 		priv->frame.codesize = sbc_get_codesize(sbc);
   1017 		priv->frame.length = framelen;
   1018 	}
   1019 
   1020 	if (!output)
   1021 		return framelen;
   1022 
   1023 	if (written)
   1024 		*written = 0;
   1025 
   1026 	if (framelen <= 0)
   1027 		return framelen;
   1028 
   1029 	samples = sbc_synthesize_audio(&priv->dec_state, &priv->frame);
   1030 
   1031 	ptr = output;
   1032 
   1033 	if (output_len < (size_t) (samples * priv->frame.channels * 2))
   1034 		samples = output_len / (priv->frame.channels * 2);
   1035 
   1036 	for (i = 0; i < samples; i++) {
   1037 		for (ch = 0; ch < priv->frame.channels; ch++) {
   1038 			int16_t s;
   1039 			s = priv->frame.pcm_sample[ch][i];
   1040 
   1041 			if (sbc->endian == SBC_BE) {
   1042 				*ptr++ = (s & 0xff00) >> 8;
   1043 				*ptr++ = (s & 0x00ff);
   1044 			} else {
   1045 				*ptr++ = (s & 0x00ff);
   1046 				*ptr++ = (s & 0xff00) >> 8;
   1047 			}
   1048 		}
   1049 	}
   1050 
   1051 	if (written)
   1052 		*written = samples * priv->frame.channels * 2;
   1053 
   1054 	return framelen;
   1055 }
   1056 
   1057 ssize_t sbc_encode(sbc_t *sbc, const void *input, size_t input_len,
   1058 			void *output, size_t output_len, size_t *written)
   1059 {
   1060 	struct sbc_priv *priv;
   1061 	int framelen, samples;
   1062 	int (*sbc_enc_process_input)(int position,
   1063 			const uint8_t *pcm, int16_t X[2][SBC_X_BUFFER_SIZE],
   1064 			int nsamples, int nchannels);
   1065 
   1066 	if (!sbc || !input)
   1067 		return -EIO;
   1068 
   1069 	priv = sbc->priv;
   1070 
   1071 	if (written)
   1072 		*written = 0;
   1073 
   1074 	if (!priv->init) {
   1075 		priv->frame.frequency = sbc->frequency;
   1076 		priv->frame.mode = sbc->mode;
   1077 		priv->frame.channels = sbc->mode == SBC_MODE_MONO ? 1 : 2;
   1078 		priv->frame.allocation = sbc->allocation;
   1079 		priv->frame.subband_mode = sbc->subbands;
   1080 		priv->frame.subbands = sbc->subbands ? 8 : 4;
   1081 		priv->frame.block_mode = sbc->blocks;
   1082 		priv->frame.blocks = 4 + (sbc->blocks * 4);
   1083 		priv->frame.bitpool = sbc->bitpool;
   1084 		priv->frame.codesize = sbc_get_codesize(sbc);
   1085 		priv->frame.length = sbc_get_frame_length(sbc);
   1086 
   1087 		sbc_encoder_init(&priv->enc_state, &priv->frame);
   1088 		priv->init = 1;
   1089 	}
   1090 
   1091 	/* input must be large enough to encode a complete frame */
   1092 	if (input_len < priv->frame.codesize)
   1093 		return 0;
   1094 
   1095 	/* output must be large enough to receive the encoded frame */
   1096 	if (!output || output_len < priv->frame.length)
   1097 		return -ENOSPC;
   1098 
   1099 	/* Select the needed input data processing function and call it */
   1100 	if (priv->frame.subbands == 8) {
   1101 		if (sbc->endian == SBC_BE)
   1102 			sbc_enc_process_input =
   1103 				priv->enc_state.sbc_enc_process_input_8s_be;
   1104 		else
   1105 			sbc_enc_process_input =
   1106 				priv->enc_state.sbc_enc_process_input_8s_le;
   1107 	} else {
   1108 		if (sbc->endian == SBC_BE)
   1109 			sbc_enc_process_input =
   1110 				priv->enc_state.sbc_enc_process_input_4s_be;
   1111 		else
   1112 			sbc_enc_process_input =
   1113 				priv->enc_state.sbc_enc_process_input_4s_le;
   1114 	}
   1115 
   1116 	priv->enc_state.position = sbc_enc_process_input(
   1117 		priv->enc_state.position, (const uint8_t *) input,
   1118 		priv->enc_state.X, priv->frame.subbands * priv->frame.blocks,
   1119 		priv->frame.channels);
   1120 
   1121 	samples = sbc_analyze_audio(&priv->enc_state, &priv->frame);
   1122 
   1123 	priv->enc_state.sbc_calc_scalefactors(
   1124 		priv->frame.sb_sample_f, priv->frame.scale_factor,
   1125 		priv->frame.blocks, priv->frame.channels, priv->frame.subbands);
   1126 
   1127 	framelen = sbc_pack_frame(output, &priv->frame, output_len);
   1128 
   1129 	if (written)
   1130 		*written = framelen;
   1131 
   1132 	return samples * priv->frame.channels * 2;
   1133 }
   1134 
   1135 void sbc_finish(sbc_t *sbc)
   1136 {
   1137 	if (!sbc)
   1138 		return;
   1139 
   1140 	if (sbc->priv_alloc_base)
   1141 		free(sbc->priv_alloc_base);
   1142 
   1143 	memset(sbc, 0, sizeof(sbc_t));
   1144 }
   1145 
   1146 size_t sbc_get_frame_length(sbc_t *sbc)
   1147 {
   1148 	int ret;
   1149 	uint8_t subbands, channels, blocks, joint, bitpool;
   1150 	struct sbc_priv *priv;
   1151 
   1152 	priv = sbc->priv;
   1153 	if (priv->init)
   1154 		return priv->frame.length;
   1155 
   1156 	subbands = sbc->subbands ? 8 : 4;
   1157 	blocks = 4 + (sbc->blocks * 4);
   1158 	channels = sbc->mode == SBC_MODE_MONO ? 1 : 2;
   1159 	joint = sbc->mode == SBC_MODE_JOINT_STEREO ? 1 : 0;
   1160 	bitpool = sbc->bitpool;
   1161 
   1162 	ret = 4 + (4 * subbands * channels) / 8;
   1163 	/* This term is not always evenly divide so we round it up */
   1164 	if (channels == 1)
   1165 		ret += ((blocks * channels * bitpool) + 7) / 8;
   1166 	else
   1167 		ret += (((joint ? subbands : 0) + blocks * bitpool) + 7) / 8;
   1168 
   1169 	return ret;
   1170 }
   1171 
   1172 unsigned sbc_get_frame_duration(sbc_t *sbc)
   1173 {
   1174 	uint8_t subbands, blocks;
   1175 	uint16_t frequency;
   1176 	struct sbc_priv *priv;
   1177 
   1178 	priv = sbc->priv;
   1179 	if (!priv->init) {
   1180 		subbands = sbc->subbands ? 8 : 4;
   1181 		blocks = 4 + (sbc->blocks * 4);
   1182 	} else {
   1183 		subbands = priv->frame.subbands;
   1184 		blocks = priv->frame.blocks;
   1185 	}
   1186 
   1187 	switch (sbc->frequency) {
   1188 	case SBC_FREQ_16000:
   1189 		frequency = 16000;
   1190 		break;
   1191 
   1192 	case SBC_FREQ_32000:
   1193 		frequency = 32000;
   1194 		break;
   1195 
   1196 	case SBC_FREQ_44100:
   1197 		frequency = 44100;
   1198 		break;
   1199 
   1200 	case SBC_FREQ_48000:
   1201 		frequency = 48000;
   1202 		break;
   1203 	default:
   1204 		return 0;
   1205 	}
   1206 
   1207 	return (1000000 * blocks * subbands) / frequency;
   1208 }
   1209 
   1210 size_t sbc_get_codesize(sbc_t *sbc)
   1211 {
   1212 	uint16_t subbands, channels, blocks;
   1213 	struct sbc_priv *priv;
   1214 
   1215 	priv = sbc->priv;
   1216 	if (!priv->init) {
   1217 		subbands = sbc->subbands ? 8 : 4;
   1218 		blocks = 4 + (sbc->blocks * 4);
   1219 		channels = sbc->mode == SBC_MODE_MONO ? 1 : 2;
   1220 	} else {
   1221 		subbands = priv->frame.subbands;
   1222 		blocks = priv->frame.blocks;
   1223 		channels = priv->frame.channels;
   1224 	}
   1225 
   1226 	return subbands * blocks * channels * 2;
   1227 }
   1228 
   1229 const char *sbc_get_implementation_info(sbc_t *sbc)
   1230 {
   1231 	struct sbc_priv *priv;
   1232 
   1233 	if (!sbc)
   1234 		return NULL;
   1235 
   1236 	priv = sbc->priv;
   1237 	if (!priv)
   1238 		return NULL;
   1239 
   1240 	return priv->enc_state.implementation_info;
   1241 }
   1242 
   1243 int sbc_reinit(sbc_t *sbc, unsigned long flags)
   1244 {
   1245 	struct sbc_priv *priv;
   1246 
   1247 	if (!sbc || !sbc->priv)
   1248 		return -EIO;
   1249 
   1250 	priv = sbc->priv;
   1251 
   1252 	if (priv->init == 1)
   1253 		memset(sbc->priv, 0, sizeof(struct sbc_priv));
   1254 
   1255 	sbc_set_defaults(sbc, flags);
   1256 
   1257 	return 0;
   1258 }
   1259