sbc: pass SCO packet status flag into sbc_decoder_process_data and invalidate frames that contain SCO data that might be corrupted

This commit is contained in:
Matthias Ringwald 2016-07-23 15:42:20 +02:00
parent 5b4ff0f76d
commit 81dc09f8ed
5 changed files with 41 additions and 8 deletions

View File

@ -59,7 +59,7 @@
#include <unistd.h>
#include "btstack.h"
#include "sbc_decoder.h"
#include "btstack_sbc_decoder.h"
#include "sco_demo_util.h"
#ifdef HAVE_POSIX_STDIN

View File

@ -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;
}
}

View File

@ -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);

View File

@ -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 {

View File

@ -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);