1 /****************************************************************************** 2 * 3 * Copyright (C) 2014 The Android Open Source Project 4 * Copyright 2006 Open Interface North America, Inc. All rights reserved. 5 * 6 * Licensed under the Apache License, Version 2.0 (the "License"); 7 * you may not use this file except in compliance with the License. 8 * You may obtain a copy of the License at: 9 * 10 * http://www.apache.org/licenses/LICENSE-2.0 11 * 12 * Unless required by applicable law or agreed to in writing, software 13 * distributed under the License is distributed on an "AS IS" BASIS, 14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 15 * See the License for the specific language governing permissions and 16 * limitations under the License. 17 * 18 ******************************************************************************/ 19 20 /******************************************************************************* 21 $Revision: #1 $ 22 ******************************************************************************/ 23 24 /** @file 25 @ingroup codec_internal 26 */ 27 28 /**@addtogroup codec_internal */ 29 /**@{*/ 30 31 #include "oi_bitstream.h" 32 #include "oi_codec_sbc_private.h" 33 34 #define SPECIALIZE_READ_SAMPLES_JOINT 35 36 /** 37 * Scans through a buffer looking for a codec syncword. If the decoder has been 38 * set for enhanced operation using OI_CODEC_SBC_DecoderReset(), it will search 39 * for both a standard and an enhanced syncword. 40 */ 41 PRIVATE OI_STATUS FindSyncword(OI_CODEC_SBC_DECODER_CONTEXT* context, 42 const OI_BYTE** frameData, 43 uint32_t* frameBytes) { 44 #ifdef SBC_ENHANCED 45 OI_BYTE search1 = OI_SBC_SYNCWORD; 46 OI_BYTE search2 = OI_SBC_ENHANCED_SYNCWORD; 47 #endif // SBC_ENHANCED 48 49 if (*frameBytes == 0) { 50 return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; 51 } 52 53 #ifdef SBC_ENHANCED 54 if (context->limitFrameFormat && context->enhancedEnabled) { 55 /* If the context is restricted, only search for specified SYNCWORD */ 56 search1 = search2; 57 } else if (context->enhancedEnabled == FALSE) { 58 /* If enhanced is not enabled, only search for classic SBC SYNCWORD*/ 59 search2 = search1; 60 } 61 while (*frameBytes && (**frameData != search1) && (**frameData != search2)) { 62 (*frameBytes)--; 63 (*frameData)++; 64 } 65 if (*frameBytes) { 66 /* Syncword found, *frameData points to it, and *frameBytes correctly 67 * reflects the number of bytes available to read, including the 68 * syncword. */ 69 context->common.frameInfo.enhanced = 70 (**frameData == OI_SBC_ENHANCED_SYNCWORD); 71 return OI_OK; 72 } else { 73 /* No syncword was found anywhere in the provided input data. 74 * *frameData points past the end of the original input, and 75 * *frameBytes is 0. */ 76 return OI_CODEC_SBC_NO_SYNCWORD; 77 } 78 #else // SBC_ENHANCED 79 while (*frameBytes && (**frameData != OI_SBC_SYNCWORD)) { 80 (*frameBytes)--; 81 (*frameData)++; 82 } 83 if (*frameBytes) { 84 /* Syncword found, *frameData points to it, and *frameBytes correctly 85 * reflects the number of bytes available to read, including the 86 * syncword. */ 87 context->common.frameInfo.enhanced = FALSE; 88 return OI_OK; 89 } else { 90 /* No syncword was found anywhere in the provided input data. 91 * *frameData points past the end of the original input, and 92 * *frameBytes is 0. */ 93 return OI_CODEC_SBC_NO_SYNCWORD; 94 } 95 #endif // SBC_ENHANCED 96 } 97 98 static OI_STATUS DecodeBody(OI_CODEC_SBC_DECODER_CONTEXT* context, 99 const OI_BYTE* bodyData, int16_t* pcmData, 100 uint32_t* pcmBytes, OI_BOOL allowPartial) { 101 OI_BITSTREAM bs; 102 OI_UINT frameSamples = context->common.frameInfo.nrof_blocks * 103 context->common.frameInfo.nrof_subbands; 104 OI_UINT decode_block_count; 105 106 /* 107 * Based on the header data, make sure that there is enough room to write the 108 * output samples. 109 */ 110 if (*pcmBytes < 111 (sizeof(int16_t) * frameSamples * context->common.pcmStride) && 112 !allowPartial) { 113 /* If we're not allowing partial decodes, we need room for the entire 114 * codec frame */ 115 TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA")); 116 return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA; 117 } else if (*pcmBytes < sizeof(int16_t) * 118 context->common.frameInfo.nrof_subbands * 119 context->common.pcmStride) { 120 /* Even if we're allowing partials, we can still only decode on a frame 121 * boundary */ 122 return OI_CODEC_SBC_NOT_ENOUGH_AUDIO_DATA; 123 } 124 125 if (context->bufferedBlocks == 0) { 126 TRACE(("Reading scalefactors")); 127 OI_SBC_ReadScalefactors(&context->common, bodyData, &bs); 128 129 TRACE(("Computing bit allocation")); 130 OI_SBC_ComputeBitAllocation(&context->common); 131 132 TRACE(("Reading samples")); 133 if (context->common.frameInfo.mode == SBC_JOINT_STEREO) { 134 OI_SBC_ReadSamplesJoint(context, &bs); 135 } else { 136 OI_SBC_ReadSamples(context, &bs); 137 } 138 139 context->bufferedBlocks = context->common.frameInfo.nrof_blocks; 140 } 141 142 if (allowPartial) { 143 decode_block_count = *pcmBytes / sizeof(int16_t) / 144 context->common.pcmStride / 145 context->common.frameInfo.nrof_subbands; 146 147 if (decode_block_count > context->bufferedBlocks) { 148 decode_block_count = context->bufferedBlocks; 149 } 150 151 } else { 152 decode_block_count = context->common.frameInfo.nrof_blocks; 153 } 154 155 TRACE(("Synthesizing frame")); 156 { 157 OI_UINT start_block = 158 context->common.frameInfo.nrof_blocks - context->bufferedBlocks; 159 OI_SBC_SynthFrame(context, pcmData, start_block, decode_block_count); 160 } 161 162 OI_ASSERT(context->bufferedBlocks >= decode_block_count); 163 context->bufferedBlocks -= decode_block_count; 164 165 frameSamples = decode_block_count * context->common.frameInfo.nrof_subbands; 166 167 /* 168 * When decoding mono into a stride-2 array, copy pcm data to second channel 169 */ 170 if (context->common.frameInfo.nrof_channels == 1 && 171 context->common.pcmStride == 2) { 172 OI_UINT i; 173 for (i = 0; i < frameSamples; ++i) { 174 pcmData[2 * i + 1] = pcmData[2 * i]; 175 } 176 } 177 178 /* 179 * Return number of pcm bytes generated by the decode operation. 180 */ 181 *pcmBytes = frameSamples * sizeof(int16_t) * context->common.pcmStride; 182 if (context->bufferedBlocks > 0) { 183 return OI_CODEC_SBC_PARTIAL_DECODE; 184 } else { 185 return OI_OK; 186 } 187 } 188 189 PRIVATE OI_STATUS internal_DecodeRaw(OI_CODEC_SBC_DECODER_CONTEXT* context, 190 uint8_t bitpool, const OI_BYTE** frameData, 191 uint32_t* frameBytes, int16_t* pcmData, 192 uint32_t* pcmBytes) { 193 OI_STATUS status; 194 OI_UINT bodyLen; 195 196 TRACE(("+OI_CODEC_SBC_DecodeRaw")); 197 198 if (context->bufferedBlocks == 0) { 199 /* 200 * The bitallocator needs to know the bitpool value. 201 */ 202 context->common.frameInfo.bitpool = bitpool; 203 /* 204 * Compute the frame length and check we have enough frame data to proceed 205 */ 206 bodyLen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo) - 207 SBC_HEADER_LEN; 208 if (*frameBytes < bodyLen) { 209 TRACE(("-OI_CODEC_SBC_Decode: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA")); 210 return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; 211 } 212 } else { 213 bodyLen = 0; 214 } 215 /* 216 * Decode the SBC data. Pass TRUE to DecodeBody to allow partial decoding of 217 * tones. 218 */ 219 status = DecodeBody(context, *frameData, pcmData, pcmBytes, TRUE); 220 if (OI_SUCCESS(status) || status == OI_CODEC_SBC_PARTIAL_DECODE) { 221 *frameData += bodyLen; 222 *frameBytes -= bodyLen; 223 } 224 TRACE(("-OI_CODEC_SBC_DecodeRaw: %d", status)); 225 return status; 226 } 227 228 OI_STATUS OI_CODEC_SBC_DecoderReset(OI_CODEC_SBC_DECODER_CONTEXT* context, 229 uint32_t* decoderData, 230 uint32_t decoderDataBytes, 231 uint8_t maxChannels, uint8_t pcmStride, 232 OI_BOOL enhanced) { 233 return internal_DecoderReset(context, decoderData, decoderDataBytes, 234 maxChannels, pcmStride, enhanced); 235 } 236 237 OI_STATUS OI_CODEC_SBC_DecodeFrame(OI_CODEC_SBC_DECODER_CONTEXT* context, 238 const OI_BYTE** frameData, 239 uint32_t* frameBytes, int16_t* pcmData, 240 uint32_t* pcmBytes) { 241 OI_STATUS status; 242 OI_UINT framelen; 243 uint8_t crc; 244 245 TRACE(("+OI_CODEC_SBC_DecodeFrame")); 246 247 TRACE(("Finding syncword")); 248 status = FindSyncword(context, frameData, frameBytes); 249 if (!OI_SUCCESS(status)) { 250 return status; 251 } 252 253 /* Make sure enough data remains to read the header. */ 254 if (*frameBytes < SBC_HEADER_LEN) { 255 TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA")); 256 return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; 257 } 258 259 TRACE(("Reading Header")); 260 OI_SBC_ReadHeader(&context->common, *frameData); 261 262 /* 263 * Some implementations load the decoder into RAM and use overlays for 4 vs 8 264 * subbands. We need 265 * to ensure that the SBC parameters for this frame are compatible with the 266 * restrictions imposed 267 * by the loaded overlays. 268 */ 269 if (context->limitFrameFormat && 270 (context->common.frameInfo.subbands != context->restrictSubbands)) { 271 ERROR(("SBC parameters incompatible with loaded overlay")); 272 return OI_STATUS_INVALID_PARAMETERS; 273 } 274 275 if (context->common.frameInfo.nrof_channels > context->common.maxChannels) { 276 ERROR( 277 ("SBC parameters incompatible with number of channels specified during " 278 "reset")); 279 return OI_STATUS_INVALID_PARAMETERS; 280 } 281 282 if (context->common.pcmStride < 1 || context->common.pcmStride > 2) { 283 ERROR(("PCM stride not set correctly during reset")); 284 return OI_STATUS_INVALID_PARAMETERS; 285 } 286 287 /* 288 * At this point a header has been read. However, it's possible that we found 289 * a false syncword, 290 * so the header data might be invalid. Make sure we have enough bytes to read 291 * in the 292 * CRC-protected header, but don't require we have the whole frame. That way, 293 * if it turns out 294 * that we're acting on bogus header data, we don't stall the decoding process 295 * by waiting for 296 * data that we don't actually need. 297 */ 298 framelen = OI_CODEC_SBC_CalculateFramelen(&context->common.frameInfo); 299 if (*frameBytes < framelen) { 300 TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA")); 301 return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; 302 } 303 304 TRACE(("Calculating checksum")); 305 306 crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData); 307 if (crc != context->common.frameInfo.crc) { 308 TRACE(("CRC Mismatch: calc=%02x read=%02x\n", crc, 309 context->common.frameInfo.crc)); 310 TRACE(("-OI_CODEC_SBC_DecodeFrame: OI_CODEC_SBC_CHECKSUM_MISMATCH")); 311 return OI_CODEC_SBC_CHECKSUM_MISMATCH; 312 } 313 314 #ifdef OI_DEBUG 315 /* 316 * Make sure the bitpool values are sane. 317 */ 318 if ((context->common.frameInfo.bitpool < SBC_MIN_BITPOOL) && 319 !context->common.frameInfo.enhanced) { 320 ERROR(("Bitpool too small: %d (must be >= 2)", 321 context->common.frameInfo.bitpool)); 322 return OI_STATUS_INVALID_PARAMETERS; 323 } 324 if (context->common.frameInfo.bitpool > 325 OI_SBC_MaxBitpool(&context->common.frameInfo)) { 326 ERROR(("Bitpool too large: %d (must be <= %ld)", 327 context->common.frameInfo.bitpool, 328 OI_SBC_MaxBitpool(&context->common.frameInfo))); 329 return OI_STATUS_INVALID_PARAMETERS; 330 } 331 #endif 332 333 /* 334 * Now decode the SBC data. Partial decode is not yet implemented for an SBC 335 * stream, so pass FALSE to decode body to have it enforce the old rule that 336 * you have to decode a whole packet at a time. 337 */ 338 status = DecodeBody(context, *frameData + SBC_HEADER_LEN, pcmData, pcmBytes, 339 FALSE); 340 if (OI_SUCCESS(status)) { 341 *frameData += framelen; 342 *frameBytes -= framelen; 343 } 344 TRACE(("-OI_CODEC_SBC_DecodeFrame: %d", status)); 345 346 return status; 347 } 348 349 OI_STATUS OI_CODEC_SBC_SkipFrame(OI_CODEC_SBC_DECODER_CONTEXT* context, 350 const OI_BYTE** frameData, 351 uint32_t* frameBytes) { 352 OI_STATUS status; 353 OI_UINT framelen; 354 OI_UINT headerlen; 355 uint8_t crc; 356 357 status = FindSyncword(context, frameData, frameBytes); 358 if (!OI_SUCCESS(status)) { 359 return status; 360 } 361 if (*frameBytes < SBC_HEADER_LEN) { 362 return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; 363 } 364 OI_SBC_ReadHeader(&context->common, *frameData); 365 framelen = 366 OI_SBC_CalculateFrameAndHeaderlen(&context->common.frameInfo, &headerlen); 367 if (*frameBytes < headerlen) { 368 return OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA; 369 } 370 crc = OI_SBC_CalculateChecksum(&context->common.frameInfo, *frameData); 371 if (crc != context->common.frameInfo.crc) { 372 return OI_CODEC_SBC_CHECKSUM_MISMATCH; 373 } 374 if (*frameBytes < framelen) { 375 return OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA; 376 } 377 context->bufferedBlocks = 0; 378 *frameData += framelen; 379 *frameBytes -= framelen; 380 return OI_OK; 381 } 382 383 uint8_t OI_CODEC_SBC_FrameCount(OI_BYTE* frameData, uint32_t frameBytes) { 384 uint8_t mode; 385 uint8_t blocks; 386 uint8_t subbands; 387 uint8_t frameCount = 0; 388 OI_UINT frameLen; 389 390 while (frameBytes) { 391 while (frameBytes && ((frameData[0] & 0xFE) != 0x9C)) { 392 frameData++; 393 frameBytes--; 394 } 395 396 if (frameBytes < SBC_HEADER_LEN) { 397 return frameCount; 398 } 399 400 /* Extract and translate required fields from Header */ 401 subbands = mode = blocks = frameData[1]; 402 ; 403 mode = (mode & (BIT3 | BIT2)) >> 2; 404 blocks = block_values[(blocks & (BIT5 | BIT4)) >> 4]; 405 subbands = band_values[(subbands & BIT0)]; 406 407 /* Inline logic to avoid corrupting context */ 408 frameLen = blocks * frameData[2]; 409 switch (mode) { 410 case SBC_JOINT_STEREO: 411 frameLen += subbands + (8 * subbands); 412 break; 413 414 case SBC_DUAL_CHANNEL: 415 frameLen *= 2; 416 /* fall through */ 417 418 default: 419 if (mode == SBC_MONO) { 420 frameLen += 4 * subbands; 421 } else { 422 frameLen += 8 * subbands; 423 } 424 } 425 426 frameCount++; 427 frameLen = SBC_HEADER_LEN + (frameLen + 7) / 8; 428 if (frameBytes > frameLen) { 429 frameBytes -= frameLen; 430 frameData += frameLen; 431 } else { 432 frameBytes = 0; 433 } 434 } 435 return frameCount; 436 } 437 438 /** Read quantized subband samples from the input bitstream and expand them. */ 439 440 #ifdef SPECIALIZE_READ_SAMPLES_JOINT 441 442 PRIVATE void OI_SBC_ReadSamplesJoint4(OI_CODEC_SBC_DECODER_CONTEXT* context, 443 OI_BITSTREAM* global_bs) { 444 #define NROF_SUBBANDS 4 445 #include "readsamplesjoint.inc" 446 #undef NROF_SUBBANDS 447 } 448 449 PRIVATE void OI_SBC_ReadSamplesJoint8(OI_CODEC_SBC_DECODER_CONTEXT* context, 450 OI_BITSTREAM* global_bs) { 451 #define NROF_SUBBANDS 8 452 #include "readsamplesjoint.inc" 453 #undef NROF_SUBBANDS 454 } 455 456 typedef void (*READ_SAMPLES)(OI_CODEC_SBC_DECODER_CONTEXT* context, 457 OI_BITSTREAM* global_bs); 458 459 static const READ_SAMPLES SpecializedReadSamples[] = {OI_SBC_ReadSamplesJoint4, 460 OI_SBC_ReadSamplesJoint8}; 461 462 #endif /* SPECIALIZE_READ_SAMPLES_JOINT */ 463 464 PRIVATE void OI_SBC_ReadSamplesJoint(OI_CODEC_SBC_DECODER_CONTEXT* context, 465 OI_BITSTREAM* global_bs) { 466 OI_CODEC_SBC_COMMON_CONTEXT* common = &context->common; 467 OI_UINT nrof_subbands = common->frameInfo.nrof_subbands; 468 #ifdef SPECIALIZE_READ_SAMPLES_JOINT 469 OI_ASSERT((nrof_subbands >> 3u) <= 1u); 470 SpecializedReadSamples[nrof_subbands >> 3](context, global_bs); 471 #else 472 473 #define NROF_SUBBANDS nrof_subbands 474 #include "readsamplesjoint.inc" 475 #undef NROF_SUBBANDS 476 #endif /* SPECIALIZE_READ_SAMPLES_JOINT */ 477 } 478 479 /**@}*/ 480