btstack_sbc_decoder_bluedroid: allow to resync in all cases

This commit is contained in:
Matthias Ringwald 2018-12-17 10:28:52 +01:00
parent 57f61fbe2c
commit cca2ddcca3

View File

@ -353,6 +353,35 @@ static void btstack_sbc_decoder_process_msbc_data(btstack_sbc_decoder_state_t *
}
}
int h2_syncword = 0;
int h2_sync_pos = find_h2_sync(frame_data, decoder_state->bytes_in_frame_buffer, &h2_syncword);
// printf("Sync Pos: %d, nr %d\n", h2_sync_pos, h2_syncword);
if (h2_sync_pos < 0){
// no sync found, discard all but last 2 bytes
bytes_processed = decoder_state->bytes_in_frame_buffer - 2;
memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer);
decoder_state->bytes_in_frame_buffer -= bytes_processed; // == 2
// don't try PLC without at least a single good frame
if (decoder_state->first_good_frame_found){
decoder_state->msbc_bad_bytes += bytes_processed;
}
continue;
}
decoder_state->h2_sequence_nr = h2_syncword;
// drop data before it
bytes_processed = h2_sync_pos - 2;
if (bytes_processed > 2){
memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer);
decoder_state->bytes_in_frame_buffer -= bytes_processed;
// don't try PLC without at least a single good frame
if (decoder_state->first_good_frame_found){
decoder_state->msbc_bad_bytes += bytes_processed;
}
continue;
}
int bad_frame = 0;
int zero_seq_found = find_sequence_of_zeros(frame_data, decoder_state->bytes_in_frame_buffer, 20);
@ -362,14 +391,12 @@ static void btstack_sbc_decoder_process_msbc_data(btstack_sbc_decoder_state_t *
}
if (bad_frame){
// stats
if (zero_seq_found){
state->zero_frames_nr++;
} else {
state->bad_frames_nr++;
}
#ifdef LOG_FRAME_STATUS
if (zero_seq_found){
printf("%d : ZERO FRAME\n", decoder_state->h2_sequence_nr);
@ -377,29 +404,8 @@ static void btstack_sbc_decoder_process_msbc_data(btstack_sbc_decoder_state_t *
printf("%d : BAD FRAME\n", decoder_state->h2_sequence_nr);
}
#endif
decoder_state->bytes_in_frame_buffer = 0;
decoder_state->msbc_bad_bytes += msbc_frame_size;
continue;
}
int h2_syncword = 0;
int h2_sync_pos = find_h2_sync(frame_data, decoder_state->bytes_in_frame_buffer, &h2_syncword);
// printf("Sync Pos: %d, nr %d\n", h2_sync_pos, h2_syncword);
if (h2_sync_pos < 0){
// no sync found, discard all but last 2 bytes
bytes_processed = decoder_state->bytes_in_frame_buffer - 2;
memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer);
decoder_state->bytes_in_frame_buffer -= bytes_processed; // == 2
decoder_state->msbc_bad_bytes += bytes_processed;
continue;
}
decoder_state->h2_sequence_nr = h2_syncword;
// drop data before it
bytes_processed = h2_sync_pos - 2;
if (bytes_processed > 2){
// retry after dropoing 3 byte sync
bytes_processed = 3;
memmove(decoder_state->frame_buffer, decoder_state->frame_buffer + bytes_processed, decoder_state->bytes_in_frame_buffer);
decoder_state->bytes_in_frame_buffer -= bytes_processed;
decoder_state->msbc_bad_bytes += bytes_processed;