From 81dc09f8eddde6aa45864a6621c1f9912c05be67 Mon Sep 17 00:00:00 2001 From: Matthias Ringwald Date: Sat, 23 Jul 2016 15:42:20 +0200 Subject: [PATCH] sbc: pass SCO packet status flag into sbc_decoder_process_data and invalidate frames that contain SCO data that might be corrupted --- example/hfp_hf_demo.c | 2 +- example/sco_demo_util.c | 2 +- src/classic/btstack_sbc_decoder.h | 35 ++++++++++++++++++++-- src/classic/btstack_sbc_decoder_bludroid.c | 8 +++-- test/sbc/sbc_decoder_test.c | 2 +- 5 files changed, 41 insertions(+), 8 deletions(-) diff --git a/example/hfp_hf_demo.c b/example/hfp_hf_demo.c index 02b740965..406d78232 100644 --- a/example/hfp_hf_demo.c +++ b/example/hfp_hf_demo.c @@ -59,7 +59,7 @@ #include #include "btstack.h" -#include "sbc_decoder.h" +#include "btstack_sbc_decoder.h" #include "sco_demo_util.h" #ifdef HAVE_POSIX_STDIN diff --git a/example/sco_demo_util.c b/example/sco_demo_util.c index 5cecf76dc..40ae61c81 100644 --- a/example/sco_demo_util.c +++ b/example/sco_demo_util.c @@ -213,7 +213,7 @@ static void sco_demo_init_CVSD(void){ static void sco_demo_receive_mSBC(uint8_t * packet, uint16_t size){ if (num_samples_to_write){ - sbc_decoder_process_data(&decoder_state, packet+3, size-3); + sbc_decoder_process_data(&decoder_state, packet[2], packet+3, size-3); dump_data = 0; } } diff --git a/src/classic/btstack_sbc_decoder.h b/src/classic/btstack_sbc_decoder.h index 267cd5ffb..49fa93ed5 100644 --- a/src/classic/btstack_sbc_decoder.h +++ b/src/classic/btstack_sbc_decoder.h @@ -50,6 +50,8 @@ extern "C" { #endif +/* API_START */ + typedef enum{ SBC_MODE_STANDARD, SBC_MODE_mSBC @@ -69,13 +71,42 @@ typedef struct { int zero_frames_nr; } sbc_decoder_state_t; -void sbc_decoder_init(sbc_decoder_state_t * state, sbc_mode_t mode, void (*callback)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context), void * context); -void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int size); +/** + * @brief Init SBC decoder + * @param state + * @param mode + * @param callback for decoded PCM data + * @param context provided in callback + */ +void sbc_decoder_init(sbc_decoder_state_t * state, sbc_mode_t mode, void (*callback)(int16_t * data, int num_samples, int num_channels, int sample_rate, void * context), void * context); + +/** + * @brief Process received SCO data + * @param state + * @param packet_status_flag from SCO packet: 0 = OK, 1 = possibly invalid data, 2 = no data received, 3 = data partially lost + * @param buffer + * @param size + */ +void sbc_decoder_process_data(sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size); + +/** + * @brief Get number of samples per SBC frame + */ int sbc_decoder_num_samples_per_frame(sbc_decoder_state_t * state); + +/* + * @brief Get number of channels + */ int sbc_decoder_num_channels(sbc_decoder_state_t * state); + +/* + * @brief Get sample rate in hz + */ int sbc_decoder_sample_rate(sbc_decoder_state_t * state); +/* API_END */ + // testing only void sbc_decoder_test_disable_plc(void); void sbc_decoder_test_simulate_corrupt_frames(int period); diff --git a/src/classic/btstack_sbc_decoder_bludroid.c b/src/classic/btstack_sbc_decoder_bludroid.c index 22f3b145a..98efff412 100644 --- a/src/classic/btstack_sbc_decoder_bludroid.c +++ b/src/classic/btstack_sbc_decoder_bludroid.c @@ -208,8 +208,8 @@ static void append_received_sbc_data(bludroid_decoder_state_t * state, uint8_t * state->bytes_in_frame_buffer += size; } +void sbc_decoder_process_data(sbc_decoder_state_t * state, int packet_status_flag, uint8_t * buffer, int size){ -void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int size){ bludroid_decoder_state_t * bd_decoder_state = (bludroid_decoder_state_t*)state->decoder_state; int bytes_to_process = size; int msbc_frame_size = 57; @@ -250,13 +250,15 @@ void sbc_decoder_process_data(sbc_decoder_state_t * state, uint8_t * buffer, int } OI_STATUS status = 0; + int bad_frame = 0; int zero_seq_found = 0; - + if (bd_decoder_state->first_good_frame_found){ zero_seq_found = find_sequence_of_zeros(frame_data, bd_decoder_state->bytes_in_frame_buffer, 20); + bad_frame = zero_seq_found || packet_status_flag; } - if (zero_seq_found){ + if (bad_frame){ status = OI_CODEC_SBC_CHECKSUM_MISMATCH; bd_decoder_state->bytes_in_frame_buffer = 0; } else { diff --git a/test/sbc/sbc_decoder_test.c b/test/sbc/sbc_decoder_test.c index 43d5dd772..a5a81a35a 100644 --- a/test/sbc/sbc_decoder_test.c +++ b/test/sbc/sbc_decoder_test.c @@ -211,7 +211,7 @@ int main (int argc, const char * argv[]){ int bytes_read = __read(fd, read_buffer, sizeof(read_buffer)); if (0 >= bytes_read) break; // process chunk - sbc_decoder_process_data(&state, read_buffer, bytes_read); + sbc_decoder_process_data(&state, 0, read_buffer, bytes_read); } rewind(wav_file);