1*c37cd8f3SMatthias Ringwald /* 2*c37cd8f3SMatthias Ringwald * Copyright (C) 2014 BlueKitchen GmbH 3*c37cd8f3SMatthias Ringwald * 4*c37cd8f3SMatthias Ringwald * Redistribution and use in source and binary forms, with or without 5*c37cd8f3SMatthias Ringwald * modification, are permitted provided that the following conditions 6*c37cd8f3SMatthias Ringwald * are met: 7*c37cd8f3SMatthias Ringwald * 8*c37cd8f3SMatthias Ringwald * 1. Redistributions of source code must retain the above copyright 9*c37cd8f3SMatthias Ringwald * notice, this list of conditions and the following disclaimer. 10*c37cd8f3SMatthias Ringwald * 2. Redistributions in binary form must reproduce the above copyright 11*c37cd8f3SMatthias Ringwald * notice, this list of conditions and the following disclaimer in the 12*c37cd8f3SMatthias Ringwald * documentation and/or other materials provided with the distribution. 13*c37cd8f3SMatthias Ringwald * 3. Neither the name of the copyright holders nor the names of 14*c37cd8f3SMatthias Ringwald * contributors may be used to endorse or promote products derived 15*c37cd8f3SMatthias Ringwald * from this software without specific prior written permission. 16*c37cd8f3SMatthias Ringwald * 4. Any redistribution, use, or modification is done solely for 17*c37cd8f3SMatthias Ringwald * personal benefit and not for any commercial purpose or for 18*c37cd8f3SMatthias Ringwald * monetary gain. 19*c37cd8f3SMatthias Ringwald * 20*c37cd8f3SMatthias Ringwald * THIS SOFTWARE IS PROVIDED BY BLUEKITCHEN GMBH AND CONTRIBUTORS 21*c37cd8f3SMatthias Ringwald * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 22*c37cd8f3SMatthias Ringwald * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 23*c37cd8f3SMatthias Ringwald * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL MATTHIAS 24*c37cd8f3SMatthias Ringwald * RINGWALD OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 25*c37cd8f3SMatthias Ringwald * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 26*c37cd8f3SMatthias Ringwald * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 27*c37cd8f3SMatthias Ringwald * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 28*c37cd8f3SMatthias Ringwald * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 29*c37cd8f3SMatthias Ringwald * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF 30*c37cd8f3SMatthias Ringwald * THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31*c37cd8f3SMatthias Ringwald * SUCH DAMAGE. 32*c37cd8f3SMatthias Ringwald * 33*c37cd8f3SMatthias Ringwald * Please inquire about commercial licensing options at 34*c37cd8f3SMatthias Ringwald * [email protected] 35*c37cd8f3SMatthias Ringwald * 36*c37cd8f3SMatthias Ringwald */ 37*c37cd8f3SMatthias Ringwald 38*c37cd8f3SMatthias Ringwald #define __BTSTACK_FILE__ "btstack_sbc_decoder_bluedroid.c" 39*c37cd8f3SMatthias Ringwald 40*c37cd8f3SMatthias Ringwald // ***************************************************************************** 41*c37cd8f3SMatthias Ringwald // 42*c37cd8f3SMatthias Ringwald // SBC decoder based on Bluedroid library 43*c37cd8f3SMatthias Ringwald // 44*c37cd8f3SMatthias Ringwald // ***************************************************************************** 45*c37cd8f3SMatthias Ringwald 46*c37cd8f3SMatthias Ringwald #include "btstack_config.h" 47*c37cd8f3SMatthias Ringwald 48*c37cd8f3SMatthias Ringwald #include <stdint.h> 49*c37cd8f3SMatthias Ringwald #include <stdio.h> 50*c37cd8f3SMatthias Ringwald #include <stdlib.h> 51*c37cd8f3SMatthias Ringwald #include <string.h> 52*c37cd8f3SMatthias Ringwald 53*c37cd8f3SMatthias Ringwald #include "btstack_sbc.h" 54*c37cd8f3SMatthias Ringwald #include "btstack_sbc_plc.h" 55*c37cd8f3SMatthias Ringwald 56*c37cd8f3SMatthias Ringwald #include "oi_codec_sbc.h" 57*c37cd8f3SMatthias Ringwald #include "oi_assert.h" 58*c37cd8f3SMatthias Ringwald #include "btstack.h" 59*c37cd8f3SMatthias Ringwald 60*c37cd8f3SMatthias Ringwald #define mSBC_SYNCWORD 0xad 61*c37cd8f3SMatthias Ringwald #define SBC_SYNCWORD 0x9c 62*c37cd8f3SMatthias Ringwald #define SBC_MAX_CHANNELS 2 63*c37cd8f3SMatthias Ringwald // #define LOG_FRAME_STATUS 64*c37cd8f3SMatthias Ringwald 65*c37cd8f3SMatthias Ringwald #define DECODER_DATA_SIZE (SBC_MAX_CHANNELS*SBC_MAX_BLOCKS*SBC_MAX_BANDS * 4 + SBC_CODEC_MIN_FILTER_BUFFERS*SBC_MAX_BANDS*SBC_MAX_CHANNELS * 2) 66*c37cd8f3SMatthias Ringwald 67*c37cd8f3SMatthias Ringwald typedef struct { 68*c37cd8f3SMatthias Ringwald OI_UINT32 bytes_in_frame_buffer; 69*c37cd8f3SMatthias Ringwald OI_CODEC_SBC_DECODER_CONTEXT decoder_context; 70*c37cd8f3SMatthias Ringwald 71*c37cd8f3SMatthias Ringwald uint8_t frame_buffer[SBC_MAX_FRAME_LEN]; 72*c37cd8f3SMatthias Ringwald int16_t pcm_plc_data[SBC_MAX_CHANNELS * SBC_MAX_BANDS * SBC_MAX_BLOCKS]; 73*c37cd8f3SMatthias Ringwald int16_t pcm_data[SBC_MAX_CHANNELS * SBC_MAX_BANDS * SBC_MAX_BLOCKS]; 74*c37cd8f3SMatthias Ringwald uint32_t pcm_bytes; 75*c37cd8f3SMatthias Ringwald OI_UINT32 decoder_data[(DECODER_DATA_SIZE+3)/4]; 76*c37cd8f3SMatthias Ringwald int h2_sequence_nr; 77*c37cd8f3SMatthias Ringwald int search_new_sync_word; 78*c37cd8f3SMatthias Ringwald int sync_word_found; 79*c37cd8f3SMatthias Ringwald int first_good_frame_found; 80*c37cd8f3SMatthias Ringwald } bludroid_decoder_state_t; 81*c37cd8f3SMatthias Ringwald 82*c37cd8f3SMatthias Ringwald static btstack_sbc_decoder_state_t * sbc_decoder_state_singleton = NULL; 83*c37cd8f3SMatthias Ringwald static bludroid_decoder_state_t bd_decoder_state; 84*c37cd8f3SMatthias Ringwald 85*c37cd8f3SMatthias Ringwald // Testing only - START 86*c37cd8f3SMatthias Ringwald static int plc_enabled = 1; 87*c37cd8f3SMatthias Ringwald static int corrupt_frame_period = -1; 88*c37cd8f3SMatthias Ringwald // Testing - STOP 89*c37cd8f3SMatthias Ringwald 90*c37cd8f3SMatthias Ringwald void btstack_sbc_decoder_test_disable_plc(void){ 91*c37cd8f3SMatthias Ringwald plc_enabled = 0; 92*c37cd8f3SMatthias Ringwald } 93*c37cd8f3SMatthias Ringwald 94*c37cd8f3SMatthias Ringwald void btstack_sbc_decoder_test_simulate_corrupt_frames(int period){ 95*c37cd8f3SMatthias Ringwald corrupt_frame_period = period; 96*c37cd8f3SMatthias Ringwald } 97*c37cd8f3SMatthias Ringwald 98*c37cd8f3SMatthias Ringwald static int find_sequence_of_zeros(const OI_BYTE *frame_data, OI_UINT32 frame_bytes, int seq_length){ 99*c37cd8f3SMatthias Ringwald int zero_seq_count = 0; 100*c37cd8f3SMatthias Ringwald unsigned int i; 101*c37cd8f3SMatthias Ringwald for (i=0; i<frame_bytes; i++){ 102*c37cd8f3SMatthias Ringwald if (frame_data[i] == 0) { 103*c37cd8f3SMatthias Ringwald zero_seq_count++; 104*c37cd8f3SMatthias Ringwald if (zero_seq_count >= seq_length) return zero_seq_count; 105*c37cd8f3SMatthias Ringwald } else { 106*c37cd8f3SMatthias Ringwald zero_seq_count = 0; 107*c37cd8f3SMatthias Ringwald } 108*c37cd8f3SMatthias Ringwald } 109*c37cd8f3SMatthias Ringwald return 0; 110*c37cd8f3SMatthias Ringwald } 111*c37cd8f3SMatthias Ringwald 112*c37cd8f3SMatthias Ringwald static int find_h2_syncword(const OI_BYTE *frame_data, OI_UINT32 frame_bytes){ 113*c37cd8f3SMatthias Ringwald int syncword = mSBC_SYNCWORD; 114*c37cd8f3SMatthias Ringwald uint8_t h2_first_byte = 0; 115*c37cd8f3SMatthias Ringwald uint8_t h2_second_byte = 0; 116*c37cd8f3SMatthias Ringwald 117*c37cd8f3SMatthias Ringwald unsigned int i; 118*c37cd8f3SMatthias Ringwald for (i=0; i<frame_bytes; i++){ 119*c37cd8f3SMatthias Ringwald if (frame_data[i] == syncword) { 120*c37cd8f3SMatthias Ringwald break; 121*c37cd8f3SMatthias Ringwald } 122*c37cd8f3SMatthias Ringwald h2_first_byte = h2_second_byte; 123*c37cd8f3SMatthias Ringwald h2_second_byte = frame_data[i]; 124*c37cd8f3SMatthias Ringwald } 125*c37cd8f3SMatthias Ringwald if (h2_first_byte != 1) return -1; 126*c37cd8f3SMatthias Ringwald 127*c37cd8f3SMatthias Ringwald // check if upper nibble of second byte is 0x08 128*c37cd8f3SMatthias Ringwald uint8_t ln = h2_second_byte & 0x0F; 129*c37cd8f3SMatthias Ringwald if (ln != 8) return -1; 130*c37cd8f3SMatthias Ringwald 131*c37cd8f3SMatthias Ringwald // check that bits 0+2 == bits 1+3 132*c37cd8f3SMatthias Ringwald uint8_t hn = h2_second_byte >> 4; 133*c37cd8f3SMatthias Ringwald if ( ((hn>>1) & 0x05) != (hn & 0x05) ) return -1; 134*c37cd8f3SMatthias Ringwald 135*c37cd8f3SMatthias Ringwald return ((hn & 0x04) >> 1) | (hn & 0x01); 136*c37cd8f3SMatthias Ringwald } 137*c37cd8f3SMatthias Ringwald 138*c37cd8f3SMatthias Ringwald int btstack_sbc_decoder_num_samples_per_frame(btstack_sbc_decoder_state_t * state){ 139*c37cd8f3SMatthias Ringwald bludroid_decoder_state_t * decoder_state = (bludroid_decoder_state_t *) state->decoder_state; 140*c37cd8f3SMatthias Ringwald return decoder_state->decoder_context.common.frameInfo.nrof_blocks * decoder_state->decoder_context.common.frameInfo.nrof_subbands; 141*c37cd8f3SMatthias Ringwald } 142*c37cd8f3SMatthias Ringwald 143*c37cd8f3SMatthias Ringwald int btstack_sbc_decoder_num_channels(btstack_sbc_decoder_state_t * state){ 144*c37cd8f3SMatthias Ringwald bludroid_decoder_state_t * decoder_state = (bludroid_decoder_state_t *) state->decoder_state; 145*c37cd8f3SMatthias Ringwald return decoder_state->decoder_context.common.frameInfo.nrof_channels; 146*c37cd8f3SMatthias Ringwald } 147*c37cd8f3SMatthias Ringwald 148*c37cd8f3SMatthias Ringwald int btstack_sbc_decoder_sample_rate(btstack_sbc_decoder_state_t * state){ 149*c37cd8f3SMatthias Ringwald bludroid_decoder_state_t * decoder_state = (bludroid_decoder_state_t *) state->decoder_state; 150*c37cd8f3SMatthias Ringwald return decoder_state->decoder_context.common.frameInfo.frequency; 151*c37cd8f3SMatthias Ringwald } 152*c37cd8f3SMatthias Ringwald 153*c37cd8f3SMatthias Ringwald #ifdef OI_DEBUG 154*c37cd8f3SMatthias Ringwald void OI_AssertFail(const char* file, int line, const char* reason){ 155*c37cd8f3SMatthias Ringwald log_error("AssertFail file %s, line %d, reason %s", file, line, reason); 156*c37cd8f3SMatthias Ringwald } 157*c37cd8f3SMatthias Ringwald #endif 158*c37cd8f3SMatthias Ringwald 159*c37cd8f3SMatthias Ringwald void btstack_sbc_decoder_init(btstack_sbc_decoder_state_t * state, btstack_sbc_mode_t mode, void (*callback)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context), void * context){ 160*c37cd8f3SMatthias Ringwald if (sbc_decoder_state_singleton && sbc_decoder_state_singleton != state ){ 161*c37cd8f3SMatthias Ringwald log_error("SBC decoder: different sbc decoder state is allready registered"); 162*c37cd8f3SMatthias Ringwald } 163*c37cd8f3SMatthias Ringwald OI_STATUS status = OI_STATUS_SUCCESS; 164*c37cd8f3SMatthias Ringwald switch (mode){ 165*c37cd8f3SMatthias Ringwald case SBC_MODE_STANDARD: 166*c37cd8f3SMatthias Ringwald // note: we always request stereo output, even for mono input 167*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_DecoderReset(&(bd_decoder_state.decoder_context), bd_decoder_state.decoder_data, sizeof(bd_decoder_state.decoder_data), 2, 2, FALSE); 168*c37cd8f3SMatthias Ringwald break; 169*c37cd8f3SMatthias Ringwald case SBC_MODE_mSBC: 170*c37cd8f3SMatthias Ringwald status = OI_CODEC_mSBC_DecoderReset(&(bd_decoder_state.decoder_context), bd_decoder_state.decoder_data, sizeof(bd_decoder_state.decoder_data)); 171*c37cd8f3SMatthias Ringwald break; 172*c37cd8f3SMatthias Ringwald default: 173*c37cd8f3SMatthias Ringwald break; 174*c37cd8f3SMatthias Ringwald } 175*c37cd8f3SMatthias Ringwald 176*c37cd8f3SMatthias Ringwald if (status != OI_STATUS_SUCCESS){ 177*c37cd8f3SMatthias Ringwald log_error("SBC decoder: error during reset %d\n", status); 178*c37cd8f3SMatthias Ringwald } 179*c37cd8f3SMatthias Ringwald 180*c37cd8f3SMatthias Ringwald sbc_decoder_state_singleton = state; 181*c37cd8f3SMatthias Ringwald 182*c37cd8f3SMatthias Ringwald bd_decoder_state.bytes_in_frame_buffer = 0; 183*c37cd8f3SMatthias Ringwald bd_decoder_state.pcm_bytes = sizeof(bd_decoder_state.pcm_data); 184*c37cd8f3SMatthias Ringwald bd_decoder_state.h2_sequence_nr = -1; 185*c37cd8f3SMatthias Ringwald bd_decoder_state.sync_word_found = 0; 186*c37cd8f3SMatthias Ringwald bd_decoder_state.search_new_sync_word = 0; 187*c37cd8f3SMatthias Ringwald if (mode == SBC_MODE_mSBC){ 188*c37cd8f3SMatthias Ringwald bd_decoder_state.search_new_sync_word = 1; 189*c37cd8f3SMatthias Ringwald } 190*c37cd8f3SMatthias Ringwald bd_decoder_state.first_good_frame_found = 0; 191*c37cd8f3SMatthias Ringwald 192*c37cd8f3SMatthias Ringwald memset(state, 0, sizeof(btstack_sbc_decoder_state_t)); 193*c37cd8f3SMatthias Ringwald state->handle_pcm_data = callback; 194*c37cd8f3SMatthias Ringwald state->mode = mode; 195*c37cd8f3SMatthias Ringwald state->context = context; 196*c37cd8f3SMatthias Ringwald state->decoder_state = &bd_decoder_state; 197*c37cd8f3SMatthias Ringwald btstack_sbc_plc_init(&state->plc_state); 198*c37cd8f3SMatthias Ringwald } 199*c37cd8f3SMatthias Ringwald 200*c37cd8f3SMatthias Ringwald static void append_received_sbc_data(bludroid_decoder_state_t * state, uint8_t * buffer, int size){ 201*c37cd8f3SMatthias Ringwald int numFreeBytes = sizeof(state->frame_buffer) - state->bytes_in_frame_buffer; 202*c37cd8f3SMatthias Ringwald 203*c37cd8f3SMatthias Ringwald if (size > numFreeBytes){ 204*c37cd8f3SMatthias Ringwald log_error("SBC data: more bytes read %u than free bytes in buffer %u", size, numFreeBytes); 205*c37cd8f3SMatthias Ringwald } 206*c37cd8f3SMatthias Ringwald 207*c37cd8f3SMatthias Ringwald memcpy(state->frame_buffer + state->bytes_in_frame_buffer, buffer, size); 208*c37cd8f3SMatthias Ringwald state->bytes_in_frame_buffer += size; 209*c37cd8f3SMatthias Ringwald } 210*c37cd8f3SMatthias Ringwald 211*c37cd8f3SMatthias Ringwald 212*c37cd8f3SMatthias Ringwald static void btstack_sbc_decoder_process_sbc_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size){ 213*c37cd8f3SMatthias Ringwald bludroid_decoder_state_t * decoder_state = (bludroid_decoder_state_t*)state->decoder_state; 214*c37cd8f3SMatthias Ringwald int input_bytes_to_process = size; 215*c37cd8f3SMatthias Ringwald 216*c37cd8f3SMatthias Ringwald while (input_bytes_to_process){ 217*c37cd8f3SMatthias Ringwald int bytes_free_in_buffer = SBC_MAX_FRAME_LEN - decoder_state->bytes_in_frame_buffer; 218*c37cd8f3SMatthias Ringwald int bytes_to_append = btstack_min(input_bytes_to_process, bytes_free_in_buffer); 219*c37cd8f3SMatthias Ringwald if (!bytes_to_append) break; 220*c37cd8f3SMatthias Ringwald append_received_sbc_data(decoder_state, buffer, bytes_to_append); 221*c37cd8f3SMatthias Ringwald buffer += bytes_to_append; 222*c37cd8f3SMatthias Ringwald input_bytes_to_process -= bytes_to_append; 223*c37cd8f3SMatthias Ringwald 224*c37cd8f3SMatthias Ringwald uint16_t bytes_in_buffer_before = decoder_state->bytes_in_frame_buffer; 225*c37cd8f3SMatthias Ringwald uint16_t bytes_processed = 0; 226*c37cd8f3SMatthias Ringwald const OI_BYTE *frame_data = decoder_state->frame_buffer; 227*c37cd8f3SMatthias Ringwald 228*c37cd8f3SMatthias Ringwald static int frame_count = 0; 229*c37cd8f3SMatthias Ringwald while (1){ 230*c37cd8f3SMatthias Ringwald if (corrupt_frame_period > 0){ 231*c37cd8f3SMatthias Ringwald frame_count++; 232*c37cd8f3SMatthias Ringwald 233*c37cd8f3SMatthias Ringwald if (frame_count % corrupt_frame_period == 0){ 234*c37cd8f3SMatthias Ringwald *(uint8_t*)&frame_data[5] = 0; 235*c37cd8f3SMatthias Ringwald frame_count = 0; 236*c37cd8f3SMatthias Ringwald } 237*c37cd8f3SMatthias Ringwald } 238*c37cd8f3SMatthias Ringwald 239*c37cd8f3SMatthias Ringwald OI_STATUS status = OI_STATUS_SUCCESS; 240*c37cd8f3SMatthias Ringwald int bad_frame = 0; 241*c37cd8f3SMatthias Ringwald int zero_seq_found = 0; 242*c37cd8f3SMatthias Ringwald 243*c37cd8f3SMatthias Ringwald if (decoder_state->first_good_frame_found){ 244*c37cd8f3SMatthias Ringwald zero_seq_found = find_sequence_of_zeros(frame_data, decoder_state->bytes_in_frame_buffer, 20); 245*c37cd8f3SMatthias Ringwald bad_frame = zero_seq_found || packet_status_flag; 246*c37cd8f3SMatthias Ringwald } 247*c37cd8f3SMatthias Ringwald 248*c37cd8f3SMatthias Ringwald if (bad_frame){ 249*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_CHECKSUM_MISMATCH; 250*c37cd8f3SMatthias Ringwald decoder_state->bytes_in_frame_buffer = 0; 251*c37cd8f3SMatthias Ringwald } else { 252*c37cd8f3SMatthias Ringwald memset(decoder_state->pcm_plc_data, 0x55, SBC_MAX_CHANNELS * SBC_MAX_BANDS * SBC_MAX_BLOCKS * 2); 253*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_DecodeFrame(&(decoder_state->decoder_context), 254*c37cd8f3SMatthias Ringwald &frame_data, 255*c37cd8f3SMatthias Ringwald &(decoder_state->bytes_in_frame_buffer), 256*c37cd8f3SMatthias Ringwald decoder_state->pcm_plc_data, 257*c37cd8f3SMatthias Ringwald &(decoder_state->pcm_bytes)); 258*c37cd8f3SMatthias Ringwald } 259*c37cd8f3SMatthias Ringwald 260*c37cd8f3SMatthias Ringwald bytes_processed = bytes_in_buffer_before - decoder_state->bytes_in_frame_buffer; 261*c37cd8f3SMatthias Ringwald switch(status){ 262*c37cd8f3SMatthias Ringwald case OI_STATUS_SUCCESS: 263*c37cd8f3SMatthias Ringwald decoder_state->first_good_frame_found = 1; 264*c37cd8f3SMatthias Ringwald 265*c37cd8f3SMatthias Ringwald if (state->mode == SBC_MODE_mSBC){ 266*c37cd8f3SMatthias Ringwald decoder_state->search_new_sync_word = 1; 267*c37cd8f3SMatthias Ringwald decoder_state->sync_word_found = 0; 268*c37cd8f3SMatthias Ringwald } 269*c37cd8f3SMatthias Ringwald 270*c37cd8f3SMatthias Ringwald state->handle_pcm_data(decoder_state->pcm_plc_data, 271*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_samples_per_frame(state), 272*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_channels(state), 273*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_sample_rate(state), state->context); 274*c37cd8f3SMatthias Ringwald state->good_frames_nr++; 275*c37cd8f3SMatthias Ringwald continue; 276*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA: 277*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA: 278*c37cd8f3SMatthias Ringwald // printf(" NOT_ENOUGH_DATA\n"); 279*c37cd8f3SMatthias Ringwald if (decoder_state->sync_word_found){ 280*c37cd8f3SMatthias Ringwald decoder_state->search_new_sync_word = 0; 281*c37cd8f3SMatthias Ringwald } 282*c37cd8f3SMatthias Ringwald break; 283*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NO_SYNCWORD: 284*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_CHECKSUM_MISMATCH: 285*c37cd8f3SMatthias Ringwald // printf("NO_SYNCWORD or CHECKSUM_MISMATCH\n"); 286*c37cd8f3SMatthias Ringwald decoder_state->bytes_in_frame_buffer = 0; 287*c37cd8f3SMatthias Ringwald if (!decoder_state->first_good_frame_found) break; 288*c37cd8f3SMatthias Ringwald 289*c37cd8f3SMatthias Ringwald if (zero_seq_found){ 290*c37cd8f3SMatthias Ringwald state->zero_frames_nr++; 291*c37cd8f3SMatthias Ringwald } else { 292*c37cd8f3SMatthias Ringwald state->bad_frames_nr++; 293*c37cd8f3SMatthias Ringwald } 294*c37cd8f3SMatthias Ringwald if (!plc_enabled) break; 295*c37cd8f3SMatthias Ringwald break; 296*c37cd8f3SMatthias Ringwald default: 297*c37cd8f3SMatthias Ringwald log_info("Frame decode error: %d", status); 298*c37cd8f3SMatthias Ringwald break; 299*c37cd8f3SMatthias Ringwald } 300*c37cd8f3SMatthias Ringwald 301*c37cd8f3SMatthias Ringwald memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer); 302*c37cd8f3SMatthias Ringwald if ((status != OI_STATUS_SUCCESS) || (decoder_state->bytes_in_frame_buffer == 0)) break; 303*c37cd8f3SMatthias Ringwald 304*c37cd8f3SMatthias Ringwald } 305*c37cd8f3SMatthias Ringwald } 306*c37cd8f3SMatthias Ringwald } 307*c37cd8f3SMatthias Ringwald 308*c37cd8f3SMatthias Ringwald 309*c37cd8f3SMatthias Ringwald static void btstack_sbc_decoder_process_msbc_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size){ 310*c37cd8f3SMatthias Ringwald 311*c37cd8f3SMatthias Ringwald bludroid_decoder_state_t * decoder_state = (bludroid_decoder_state_t*)state->decoder_state; 312*c37cd8f3SMatthias Ringwald int input_bytes_to_process = size; 313*c37cd8f3SMatthias Ringwald unsigned int msbc_frame_size = 57; 314*c37cd8f3SMatthias Ringwald 315*c37cd8f3SMatthias Ringwald // printf("<<-- enter -->>\n"); 316*c37cd8f3SMatthias Ringwald // printf("Process data: in buffer %u, new %u\n", decoder_state->bytes_in_frame_buffer, size); 317*c37cd8f3SMatthias Ringwald 318*c37cd8f3SMatthias Ringwald while (input_bytes_to_process > 0){ 319*c37cd8f3SMatthias Ringwald 320*c37cd8f3SMatthias Ringwald int bytes_missing_for_complete_msbc_frame = msbc_frame_size - decoder_state->bytes_in_frame_buffer; 321*c37cd8f3SMatthias Ringwald int bytes_to_append = btstack_min(input_bytes_to_process, bytes_missing_for_complete_msbc_frame); 322*c37cd8f3SMatthias Ringwald 323*c37cd8f3SMatthias Ringwald append_received_sbc_data(decoder_state, buffer, bytes_to_append); 324*c37cd8f3SMatthias Ringwald // printf("Append %u bytes, now %u in buffer \n", bytes_to_append, decoder_state->bytes_in_frame_buffer); 325*c37cd8f3SMatthias Ringwald buffer += bytes_to_append; 326*c37cd8f3SMatthias Ringwald input_bytes_to_process -= bytes_to_append; 327*c37cd8f3SMatthias Ringwald 328*c37cd8f3SMatthias Ringwald if (decoder_state->bytes_in_frame_buffer < msbc_frame_size){ 329*c37cd8f3SMatthias Ringwald // printf("not enough data %d > %d\n", msbc_frame_size, decoder_state->bytes_in_frame_buffer); 330*c37cd8f3SMatthias Ringwald if (input_bytes_to_process){ 331*c37cd8f3SMatthias Ringwald log_error("SHOULD NOT HAPPEN... not enough bytes, but bytes left to process"); 332*c37cd8f3SMatthias Ringwald } 333*c37cd8f3SMatthias Ringwald break; 334*c37cd8f3SMatthias Ringwald } 335*c37cd8f3SMatthias Ringwald 336*c37cd8f3SMatthias Ringwald uint16_t bytes_in_buffer_before = decoder_state->bytes_in_frame_buffer; 337*c37cd8f3SMatthias Ringwald uint16_t bytes_processed = 0; 338*c37cd8f3SMatthias Ringwald const OI_BYTE *frame_data = decoder_state->frame_buffer; 339*c37cd8f3SMatthias Ringwald 340*c37cd8f3SMatthias Ringwald static int frame_count = 0; 341*c37cd8f3SMatthias Ringwald if (corrupt_frame_period > 0){ 342*c37cd8f3SMatthias Ringwald frame_count++; 343*c37cd8f3SMatthias Ringwald 344*c37cd8f3SMatthias Ringwald if (frame_count % corrupt_frame_period == 0){ 345*c37cd8f3SMatthias Ringwald *(uint8_t*)&frame_data[5] = 0; 346*c37cd8f3SMatthias Ringwald frame_count = 0; 347*c37cd8f3SMatthias Ringwald } 348*c37cd8f3SMatthias Ringwald } 349*c37cd8f3SMatthias Ringwald 350*c37cd8f3SMatthias Ringwald OI_STATUS status = OI_STATUS_SUCCESS; 351*c37cd8f3SMatthias Ringwald int bad_frame = 0; 352*c37cd8f3SMatthias Ringwald int zero_seq_found = 0; 353*c37cd8f3SMatthias Ringwald 354*c37cd8f3SMatthias Ringwald if (decoder_state->first_good_frame_found){ 355*c37cd8f3SMatthias Ringwald zero_seq_found = find_sequence_of_zeros(frame_data, decoder_state->bytes_in_frame_buffer, 20); 356*c37cd8f3SMatthias Ringwald bad_frame = zero_seq_found || packet_status_flag; 357*c37cd8f3SMatthias Ringwald } 358*c37cd8f3SMatthias Ringwald 359*c37cd8f3SMatthias Ringwald if (bad_frame){ 360*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_CHECKSUM_MISMATCH; 361*c37cd8f3SMatthias Ringwald decoder_state->bytes_in_frame_buffer = 0; 362*c37cd8f3SMatthias Ringwald } else { 363*c37cd8f3SMatthias Ringwald if (decoder_state->search_new_sync_word && !decoder_state->sync_word_found){ 364*c37cd8f3SMatthias Ringwald int h2_syncword = find_h2_syncword(frame_data, decoder_state->bytes_in_frame_buffer); 365*c37cd8f3SMatthias Ringwald 366*c37cd8f3SMatthias Ringwald if (h2_syncword != -1){ 367*c37cd8f3SMatthias Ringwald decoder_state->sync_word_found = 1; 368*c37cd8f3SMatthias Ringwald decoder_state->h2_sequence_nr = h2_syncword; 369*c37cd8f3SMatthias Ringwald } 370*c37cd8f3SMatthias Ringwald } 371*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_DecodeFrame(&(decoder_state->decoder_context), 372*c37cd8f3SMatthias Ringwald &frame_data, 373*c37cd8f3SMatthias Ringwald &(decoder_state->bytes_in_frame_buffer), 374*c37cd8f3SMatthias Ringwald decoder_state->pcm_plc_data, 375*c37cd8f3SMatthias Ringwald &(decoder_state->pcm_bytes)); 376*c37cd8f3SMatthias Ringwald } 377*c37cd8f3SMatthias Ringwald 378*c37cd8f3SMatthias Ringwald bytes_processed = bytes_in_buffer_before - decoder_state->bytes_in_frame_buffer; 379*c37cd8f3SMatthias Ringwald OI_UINT32 bytes_in_frame_buffer = msbc_frame_size; 380*c37cd8f3SMatthias Ringwald 381*c37cd8f3SMatthias Ringwald switch(status){ 382*c37cd8f3SMatthias Ringwald case 0: 383*c37cd8f3SMatthias Ringwald decoder_state->first_good_frame_found = 1; 384*c37cd8f3SMatthias Ringwald 385*c37cd8f3SMatthias Ringwald if (state->mode == SBC_MODE_mSBC){ 386*c37cd8f3SMatthias Ringwald decoder_state->search_new_sync_word = 1; 387*c37cd8f3SMatthias Ringwald decoder_state->sync_word_found = 0; 388*c37cd8f3SMatthias Ringwald } 389*c37cd8f3SMatthias Ringwald 390*c37cd8f3SMatthias Ringwald btstack_sbc_plc_good_frame(&state->plc_state, decoder_state->pcm_plc_data, decoder_state->pcm_data); 391*c37cd8f3SMatthias Ringwald state->handle_pcm_data(decoder_state->pcm_data, 392*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_samples_per_frame(state), 393*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_channels(state), 394*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_sample_rate(state), state->context); 395*c37cd8f3SMatthias Ringwald state->good_frames_nr++; 396*c37cd8f3SMatthias Ringwald continue; 397*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NOT_ENOUGH_HEADER_DATA: 398*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NOT_ENOUGH_BODY_DATA: 399*c37cd8f3SMatthias Ringwald // printf(" NOT_ENOUGH_DATA\n"); 400*c37cd8f3SMatthias Ringwald if (decoder_state->sync_word_found){ 401*c37cd8f3SMatthias Ringwald decoder_state->search_new_sync_word = 0; 402*c37cd8f3SMatthias Ringwald } 403*c37cd8f3SMatthias Ringwald break; 404*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_NO_SYNCWORD: 405*c37cd8f3SMatthias Ringwald case OI_CODEC_SBC_CHECKSUM_MISMATCH: 406*c37cd8f3SMatthias Ringwald // printf("NO_SYNCWORD or CHECKSUM_MISMATCH\n"); 407*c37cd8f3SMatthias Ringwald decoder_state->bytes_in_frame_buffer = 0; 408*c37cd8f3SMatthias Ringwald if (!decoder_state->first_good_frame_found) break; 409*c37cd8f3SMatthias Ringwald 410*c37cd8f3SMatthias Ringwald if (state->mode == SBC_MODE_mSBC){ 411*c37cd8f3SMatthias Ringwald if (!decoder_state->sync_word_found){ 412*c37cd8f3SMatthias Ringwald decoder_state->h2_sequence_nr = (decoder_state->h2_sequence_nr + 1)%4; 413*c37cd8f3SMatthias Ringwald } 414*c37cd8f3SMatthias Ringwald decoder_state->search_new_sync_word = 1; 415*c37cd8f3SMatthias Ringwald decoder_state->sync_word_found = 0; 416*c37cd8f3SMatthias Ringwald } 417*c37cd8f3SMatthias Ringwald 418*c37cd8f3SMatthias Ringwald if (zero_seq_found){ 419*c37cd8f3SMatthias Ringwald state->zero_frames_nr++; 420*c37cd8f3SMatthias Ringwald } else { 421*c37cd8f3SMatthias Ringwald state->bad_frames_nr++; 422*c37cd8f3SMatthias Ringwald } 423*c37cd8f3SMatthias Ringwald 424*c37cd8f3SMatthias Ringwald #ifdef LOG_FRAME_STATUS 425*c37cd8f3SMatthias Ringwald if (zero_seq_found){ 426*c37cd8f3SMatthias Ringwald printf("%d : ZERO FRAME\n", decoder_state->h2_sequence_nr); 427*c37cd8f3SMatthias Ringwald } else { 428*c37cd8f3SMatthias Ringwald printf("%d : BAD FRAME\n", decoder_state->h2_sequence_nr); 429*c37cd8f3SMatthias Ringwald } 430*c37cd8f3SMatthias Ringwald if (decoder_state->h2_sequence_nr == 3) printf("\n"); 431*c37cd8f3SMatthias Ringwald #endif 432*c37cd8f3SMatthias Ringwald if (!plc_enabled) break; 433*c37cd8f3SMatthias Ringwald 434*c37cd8f3SMatthias Ringwald frame_data = btstack_sbc_plc_zero_signal_frame(); 435*c37cd8f3SMatthias Ringwald 436*c37cd8f3SMatthias Ringwald status = OI_CODEC_SBC_DecodeFrame(&(decoder_state->decoder_context), 437*c37cd8f3SMatthias Ringwald &frame_data, 438*c37cd8f3SMatthias Ringwald &bytes_in_frame_buffer, 439*c37cd8f3SMatthias Ringwald decoder_state->pcm_plc_data, 440*c37cd8f3SMatthias Ringwald &(decoder_state->pcm_bytes)); 441*c37cd8f3SMatthias Ringwald 442*c37cd8f3SMatthias Ringwald if (status != 0) { 443*c37cd8f3SMatthias Ringwald log_error("SBC decoder: error %d\n", status); 444*c37cd8f3SMatthias Ringwald } 445*c37cd8f3SMatthias Ringwald btstack_sbc_plc_bad_frame(&state->plc_state, decoder_state->pcm_plc_data, decoder_state->pcm_data); 446*c37cd8f3SMatthias Ringwald state->handle_pcm_data(decoder_state->pcm_data, 447*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_samples_per_frame(state), 448*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_num_channels(state), 449*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_sample_rate(state), state->context); 450*c37cd8f3SMatthias Ringwald 451*c37cd8f3SMatthias Ringwald 452*c37cd8f3SMatthias Ringwald break; 453*c37cd8f3SMatthias Ringwald default: 454*c37cd8f3SMatthias Ringwald log_info("Frame decode error: %d", status); 455*c37cd8f3SMatthias Ringwald break; 456*c37cd8f3SMatthias Ringwald } 457*c37cd8f3SMatthias Ringwald 458*c37cd8f3SMatthias Ringwald memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer); 459*c37cd8f3SMatthias Ringwald } 460*c37cd8f3SMatthias Ringwald } 461*c37cd8f3SMatthias Ringwald 462*c37cd8f3SMatthias Ringwald void btstack_sbc_decoder_process_data(btstack_sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size){ 463*c37cd8f3SMatthias Ringwald if (state->mode == SBC_MODE_mSBC){ 464*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_process_msbc_data(state, packet_status_flag, buffer, size); 465*c37cd8f3SMatthias Ringwald } else { 466*c37cd8f3SMatthias Ringwald btstack_sbc_decoder_process_sbc_data(state, packet_status_flag, buffer, size); 467*c37cd8f3SMatthias Ringwald } 468*c37cd8f3SMatthias Ringwald } 469