1cabdff1aSopenharmony_ci/* 2cabdff1aSopenharmony_ci * Bluetooth low-complexity, subband codec (SBC) 3cabdff1aSopenharmony_ci * 4cabdff1aSopenharmony_ci * Copyright (C) 2017 Aurelien Jacobs <aurel@gnuage.org> 5cabdff1aSopenharmony_ci * Copyright (C) 2012-2013 Intel Corporation 6cabdff1aSopenharmony_ci * Copyright (C) 2008-2010 Nokia Corporation 7cabdff1aSopenharmony_ci * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org> 8cabdff1aSopenharmony_ci * Copyright (C) 2004-2005 Henryk Ploetz <henryk@ploetzli.ch> 9cabdff1aSopenharmony_ci * Copyright (C) 2005-2008 Brad Midgley <bmidgley@xmission.com> 10cabdff1aSopenharmony_ci * 11cabdff1aSopenharmony_ci * This file is part of FFmpeg. 12cabdff1aSopenharmony_ci * 13cabdff1aSopenharmony_ci * FFmpeg is free software; you can redistribute it and/or 14cabdff1aSopenharmony_ci * modify it under the terms of the GNU Lesser General Public 15cabdff1aSopenharmony_ci * License as published by the Free Software Foundation; either 16cabdff1aSopenharmony_ci * version 2.1 of the License, or (at your option) any later version. 17cabdff1aSopenharmony_ci * 18cabdff1aSopenharmony_ci * FFmpeg is distributed in the hope that it will be useful, 19cabdff1aSopenharmony_ci * but WITHOUT ANY WARRANTY; without even the implied warranty of 20cabdff1aSopenharmony_ci * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 21cabdff1aSopenharmony_ci * Lesser General Public License for more details. 22cabdff1aSopenharmony_ci * 23cabdff1aSopenharmony_ci * You should have received a copy of the GNU Lesser General Public 24cabdff1aSopenharmony_ci * License along with FFmpeg; if not, write to the Free Software 25cabdff1aSopenharmony_ci * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 26cabdff1aSopenharmony_ci */ 27cabdff1aSopenharmony_ci 28cabdff1aSopenharmony_ci/** 29cabdff1aSopenharmony_ci * @file 30cabdff1aSopenharmony_ci * SBC common functions for the encoder and decoder 31cabdff1aSopenharmony_ci */ 32cabdff1aSopenharmony_ci 33cabdff1aSopenharmony_ci#include "sbc.h" 34cabdff1aSopenharmony_ci 35cabdff1aSopenharmony_ci/* A2DP specification: Appendix B, page 69 */ 36cabdff1aSopenharmony_cistatic const int sbc_offset4[4][4] = { 37cabdff1aSopenharmony_ci { -1, 0, 0, 0 }, 38cabdff1aSopenharmony_ci { -2, 0, 0, 1 }, 39cabdff1aSopenharmony_ci { -2, 0, 0, 1 }, 40cabdff1aSopenharmony_ci { -2, 0, 0, 1 } 41cabdff1aSopenharmony_ci}; 42cabdff1aSopenharmony_ci 43cabdff1aSopenharmony_ci/* A2DP specification: Appendix B, page 69 */ 44cabdff1aSopenharmony_cistatic const int sbc_offset8[4][8] = { 45cabdff1aSopenharmony_ci { -2, 0, 0, 0, 0, 0, 0, 1 }, 46cabdff1aSopenharmony_ci { -3, 0, 0, 0, 0, 0, 1, 2 }, 47cabdff1aSopenharmony_ci { -4, 0, 0, 0, 0, 0, 1, 2 }, 48cabdff1aSopenharmony_ci { -4, 0, 0, 0, 0, 0, 1, 2 } 49cabdff1aSopenharmony_ci}; 50cabdff1aSopenharmony_ci 51cabdff1aSopenharmony_ci/* 52cabdff1aSopenharmony_ci * Calculates the CRC-8 of the first len bits in data 53cabdff1aSopenharmony_ci */ 54cabdff1aSopenharmony_ciuint8_t ff_sbc_crc8(const AVCRC *ctx, const uint8_t *data, size_t len) 55cabdff1aSopenharmony_ci{ 56cabdff1aSopenharmony_ci size_t byte_length = len >> 3; 57cabdff1aSopenharmony_ci int bit_length = len & 7; 58cabdff1aSopenharmony_ci uint8_t crc; 59cabdff1aSopenharmony_ci 60cabdff1aSopenharmony_ci crc = av_crc(ctx, 0x0F, data, byte_length); 61cabdff1aSopenharmony_ci 62cabdff1aSopenharmony_ci if (bit_length) { 63cabdff1aSopenharmony_ci uint8_t bits = data[byte_length]; 64cabdff1aSopenharmony_ci while (bit_length--) { 65cabdff1aSopenharmony_ci int8_t mask = bits ^ crc; 66cabdff1aSopenharmony_ci crc = (crc << 1) ^ ((mask >> 7) & 0x1D); 67cabdff1aSopenharmony_ci bits <<= 1; 68cabdff1aSopenharmony_ci } 69cabdff1aSopenharmony_ci } 70cabdff1aSopenharmony_ci 71cabdff1aSopenharmony_ci return crc; 72cabdff1aSopenharmony_ci} 73cabdff1aSopenharmony_ci 74cabdff1aSopenharmony_ci/* 75cabdff1aSopenharmony_ci * Code straight from the spec to calculate the bits array 76cabdff1aSopenharmony_ci * Takes a pointer to the frame in question and a pointer to the bits array 77cabdff1aSopenharmony_ci */ 78cabdff1aSopenharmony_civoid ff_sbc_calculate_bits(const struct sbc_frame *frame, int (*bits)[8]) 79cabdff1aSopenharmony_ci{ 80cabdff1aSopenharmony_ci int subbands = frame->subbands; 81cabdff1aSopenharmony_ci uint8_t sf = frame->frequency; 82cabdff1aSopenharmony_ci 83cabdff1aSopenharmony_ci if (frame->mode == MONO || frame->mode == DUAL_CHANNEL) { 84cabdff1aSopenharmony_ci int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; 85cabdff1aSopenharmony_ci int ch, sb; 86cabdff1aSopenharmony_ci 87cabdff1aSopenharmony_ci for (ch = 0; ch < frame->channels; ch++) { 88cabdff1aSopenharmony_ci max_bitneed = 0; 89cabdff1aSopenharmony_ci if (frame->allocation == SNR) { 90cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 91cabdff1aSopenharmony_ci bitneed[ch][sb] = frame->scale_factor[ch][sb]; 92cabdff1aSopenharmony_ci if (bitneed[ch][sb] > max_bitneed) 93cabdff1aSopenharmony_ci max_bitneed = bitneed[ch][sb]; 94cabdff1aSopenharmony_ci } 95cabdff1aSopenharmony_ci } else { 96cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 97cabdff1aSopenharmony_ci if (frame->scale_factor[ch][sb] == 0) 98cabdff1aSopenharmony_ci bitneed[ch][sb] = -5; 99cabdff1aSopenharmony_ci else { 100cabdff1aSopenharmony_ci if (subbands == 4) 101cabdff1aSopenharmony_ci loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; 102cabdff1aSopenharmony_ci else 103cabdff1aSopenharmony_ci loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; 104cabdff1aSopenharmony_ci if (loudness > 0) 105cabdff1aSopenharmony_ci bitneed[ch][sb] = loudness / 2; 106cabdff1aSopenharmony_ci else 107cabdff1aSopenharmony_ci bitneed[ch][sb] = loudness; 108cabdff1aSopenharmony_ci } 109cabdff1aSopenharmony_ci if (bitneed[ch][sb] > max_bitneed) 110cabdff1aSopenharmony_ci max_bitneed = bitneed[ch][sb]; 111cabdff1aSopenharmony_ci } 112cabdff1aSopenharmony_ci } 113cabdff1aSopenharmony_ci 114cabdff1aSopenharmony_ci bitcount = 0; 115cabdff1aSopenharmony_ci slicecount = 0; 116cabdff1aSopenharmony_ci bitslice = max_bitneed + 1; 117cabdff1aSopenharmony_ci do { 118cabdff1aSopenharmony_ci bitslice--; 119cabdff1aSopenharmony_ci bitcount += slicecount; 120cabdff1aSopenharmony_ci slicecount = 0; 121cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 122cabdff1aSopenharmony_ci if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) 123cabdff1aSopenharmony_ci slicecount++; 124cabdff1aSopenharmony_ci else if (bitneed[ch][sb] == bitslice + 1) 125cabdff1aSopenharmony_ci slicecount += 2; 126cabdff1aSopenharmony_ci } 127cabdff1aSopenharmony_ci } while (bitcount + slicecount < frame->bitpool); 128cabdff1aSopenharmony_ci 129cabdff1aSopenharmony_ci if (bitcount + slicecount == frame->bitpool) { 130cabdff1aSopenharmony_ci bitcount += slicecount; 131cabdff1aSopenharmony_ci bitslice--; 132cabdff1aSopenharmony_ci } 133cabdff1aSopenharmony_ci 134cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 135cabdff1aSopenharmony_ci if (bitneed[ch][sb] < bitslice + 2) 136cabdff1aSopenharmony_ci bits[ch][sb] = 0; 137cabdff1aSopenharmony_ci else { 138cabdff1aSopenharmony_ci bits[ch][sb] = bitneed[ch][sb] - bitslice; 139cabdff1aSopenharmony_ci if (bits[ch][sb] > 16) 140cabdff1aSopenharmony_ci bits[ch][sb] = 16; 141cabdff1aSopenharmony_ci } 142cabdff1aSopenharmony_ci } 143cabdff1aSopenharmony_ci 144cabdff1aSopenharmony_ci for (sb = 0; bitcount < frame->bitpool && 145cabdff1aSopenharmony_ci sb < subbands; sb++) { 146cabdff1aSopenharmony_ci if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) { 147cabdff1aSopenharmony_ci bits[ch][sb]++; 148cabdff1aSopenharmony_ci bitcount++; 149cabdff1aSopenharmony_ci } else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) { 150cabdff1aSopenharmony_ci bits[ch][sb] = 2; 151cabdff1aSopenharmony_ci bitcount += 2; 152cabdff1aSopenharmony_ci } 153cabdff1aSopenharmony_ci } 154cabdff1aSopenharmony_ci 155cabdff1aSopenharmony_ci for (sb = 0; bitcount < frame->bitpool && 156cabdff1aSopenharmony_ci sb < subbands; sb++) { 157cabdff1aSopenharmony_ci if (bits[ch][sb] < 16) { 158cabdff1aSopenharmony_ci bits[ch][sb]++; 159cabdff1aSopenharmony_ci bitcount++; 160cabdff1aSopenharmony_ci } 161cabdff1aSopenharmony_ci } 162cabdff1aSopenharmony_ci 163cabdff1aSopenharmony_ci } 164cabdff1aSopenharmony_ci 165cabdff1aSopenharmony_ci } else if (frame->mode == STEREO || frame->mode == JOINT_STEREO) { 166cabdff1aSopenharmony_ci int bitneed[2][8], loudness, max_bitneed, bitcount, slicecount, bitslice; 167cabdff1aSopenharmony_ci int ch, sb; 168cabdff1aSopenharmony_ci 169cabdff1aSopenharmony_ci max_bitneed = 0; 170cabdff1aSopenharmony_ci if (frame->allocation == SNR) { 171cabdff1aSopenharmony_ci for (ch = 0; ch < 2; ch++) { 172cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 173cabdff1aSopenharmony_ci bitneed[ch][sb] = frame->scale_factor[ch][sb]; 174cabdff1aSopenharmony_ci if (bitneed[ch][sb] > max_bitneed) 175cabdff1aSopenharmony_ci max_bitneed = bitneed[ch][sb]; 176cabdff1aSopenharmony_ci } 177cabdff1aSopenharmony_ci } 178cabdff1aSopenharmony_ci } else { 179cabdff1aSopenharmony_ci for (ch = 0; ch < 2; ch++) { 180cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 181cabdff1aSopenharmony_ci if (frame->scale_factor[ch][sb] == 0) 182cabdff1aSopenharmony_ci bitneed[ch][sb] = -5; 183cabdff1aSopenharmony_ci else { 184cabdff1aSopenharmony_ci if (subbands == 4) 185cabdff1aSopenharmony_ci loudness = frame->scale_factor[ch][sb] - sbc_offset4[sf][sb]; 186cabdff1aSopenharmony_ci else 187cabdff1aSopenharmony_ci loudness = frame->scale_factor[ch][sb] - sbc_offset8[sf][sb]; 188cabdff1aSopenharmony_ci if (loudness > 0) 189cabdff1aSopenharmony_ci bitneed[ch][sb] = loudness / 2; 190cabdff1aSopenharmony_ci else 191cabdff1aSopenharmony_ci bitneed[ch][sb] = loudness; 192cabdff1aSopenharmony_ci } 193cabdff1aSopenharmony_ci if (bitneed[ch][sb] > max_bitneed) 194cabdff1aSopenharmony_ci max_bitneed = bitneed[ch][sb]; 195cabdff1aSopenharmony_ci } 196cabdff1aSopenharmony_ci } 197cabdff1aSopenharmony_ci } 198cabdff1aSopenharmony_ci 199cabdff1aSopenharmony_ci bitcount = 0; 200cabdff1aSopenharmony_ci slicecount = 0; 201cabdff1aSopenharmony_ci bitslice = max_bitneed + 1; 202cabdff1aSopenharmony_ci do { 203cabdff1aSopenharmony_ci bitslice--; 204cabdff1aSopenharmony_ci bitcount += slicecount; 205cabdff1aSopenharmony_ci slicecount = 0; 206cabdff1aSopenharmony_ci for (ch = 0; ch < 2; ch++) { 207cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 208cabdff1aSopenharmony_ci if ((bitneed[ch][sb] > bitslice + 1) && (bitneed[ch][sb] < bitslice + 16)) 209cabdff1aSopenharmony_ci slicecount++; 210cabdff1aSopenharmony_ci else if (bitneed[ch][sb] == bitslice + 1) 211cabdff1aSopenharmony_ci slicecount += 2; 212cabdff1aSopenharmony_ci } 213cabdff1aSopenharmony_ci } 214cabdff1aSopenharmony_ci } while (bitcount + slicecount < frame->bitpool); 215cabdff1aSopenharmony_ci 216cabdff1aSopenharmony_ci if (bitcount + slicecount == frame->bitpool) { 217cabdff1aSopenharmony_ci bitcount += slicecount; 218cabdff1aSopenharmony_ci bitslice--; 219cabdff1aSopenharmony_ci } 220cabdff1aSopenharmony_ci 221cabdff1aSopenharmony_ci for (ch = 0; ch < 2; ch++) { 222cabdff1aSopenharmony_ci for (sb = 0; sb < subbands; sb++) { 223cabdff1aSopenharmony_ci if (bitneed[ch][sb] < bitslice + 2) { 224cabdff1aSopenharmony_ci bits[ch][sb] = 0; 225cabdff1aSopenharmony_ci } else { 226cabdff1aSopenharmony_ci bits[ch][sb] = bitneed[ch][sb] - bitslice; 227cabdff1aSopenharmony_ci if (bits[ch][sb] > 16) 228cabdff1aSopenharmony_ci bits[ch][sb] = 16; 229cabdff1aSopenharmony_ci } 230cabdff1aSopenharmony_ci } 231cabdff1aSopenharmony_ci } 232cabdff1aSopenharmony_ci 233cabdff1aSopenharmony_ci ch = 0; 234cabdff1aSopenharmony_ci sb = 0; 235cabdff1aSopenharmony_ci while (bitcount < frame->bitpool) { 236cabdff1aSopenharmony_ci if ((bits[ch][sb] >= 2) && (bits[ch][sb] < 16)) { 237cabdff1aSopenharmony_ci bits[ch][sb]++; 238cabdff1aSopenharmony_ci bitcount++; 239cabdff1aSopenharmony_ci } else if ((bitneed[ch][sb] == bitslice + 1) && (frame->bitpool > bitcount + 1)) { 240cabdff1aSopenharmony_ci bits[ch][sb] = 2; 241cabdff1aSopenharmony_ci bitcount += 2; 242cabdff1aSopenharmony_ci } 243cabdff1aSopenharmony_ci if (ch == 1) { 244cabdff1aSopenharmony_ci ch = 0; 245cabdff1aSopenharmony_ci sb++; 246cabdff1aSopenharmony_ci if (sb >= subbands) 247cabdff1aSopenharmony_ci break; 248cabdff1aSopenharmony_ci } else 249cabdff1aSopenharmony_ci ch = 1; 250cabdff1aSopenharmony_ci } 251cabdff1aSopenharmony_ci 252cabdff1aSopenharmony_ci ch = 0; 253cabdff1aSopenharmony_ci sb = 0; 254cabdff1aSopenharmony_ci while (bitcount < frame->bitpool) { 255cabdff1aSopenharmony_ci if (bits[ch][sb] < 16) { 256cabdff1aSopenharmony_ci bits[ch][sb]++; 257cabdff1aSopenharmony_ci bitcount++; 258cabdff1aSopenharmony_ci } 259cabdff1aSopenharmony_ci if (ch == 1) { 260cabdff1aSopenharmony_ci ch = 0; 261cabdff1aSopenharmony_ci sb++; 262cabdff1aSopenharmony_ci if (sb >= subbands) 263cabdff1aSopenharmony_ci break; 264cabdff1aSopenharmony_ci } else 265cabdff1aSopenharmony_ci ch = 1; 266cabdff1aSopenharmony_ci } 267cabdff1aSopenharmony_ci 268cabdff1aSopenharmony_ci } 269cabdff1aSopenharmony_ci 270cabdff1aSopenharmony_ci} 271