From 7b735ba4b863b107c34539a7fd060aed16b0d780 Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Thu, 1 Oct 2020 02:17:48 +0300 Subject: [PATCH 1/9] WIP --- inc/ldacBT.h | 3 ++ src/ldacBT_api.c | 110 +++++++++++++++++++++++++++++++++++++++++++++++ src/ldaclib.h | 1 + 3 files changed, 114 insertions(+) diff --git a/inc/ldacBT.h b/inc/ldacBT.h index f43820c..bfe25d4 100644 --- a/inc/ldacBT.h +++ b/inc/ldacBT.h @@ -349,6 +349,9 @@ LDACBT_API int ldacBT_alter_eqmid_priority( HANDLE_LDAC_BT hLdacBt, int priorit LDACBT_API int ldacBT_encode( HANDLE_LDAC_BT hLdacBt, void *p_pcm, int *pcm_used, unsigned char *p_stream, int *stream_sz, int *frame_num ); +LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char* p_bs, void *p_pcm, + LDACBT_SMPL_FMT_T fmt, int bs_bytes, int* used_bytes, int* wrote_bytes ); + /* Acquisition of previously established error code. * The LDAC handle must be allocated by API function ldacBT_get_handle() prior to calling this function. * The details of error code are described below at the end of this header file. diff --git a/src/ldacBT_api.c b/src/ldacBT_api.c index a490a62..1232f06 100644 --- a/src/ldacBT_api.c +++ b/src/ldacBT_api.c @@ -624,3 +624,113 @@ LDACBT_API int ldacBT_encode( HANDLE_LDAC_BT hLdacBT, void *p_pcm, int *pcm_used return LDACBT_S_OK; } + +LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void *p_pcm, + LDACBT_SMPL_FMT_T fmt, int bs_bytes, int *used_bytes, int *wrote_bytes) + +{ + int iVar1; + uint uVar2; + size_t sVar3; + int frm_status; + int frmlen; + int cci; + int sfid; + int cm; + int local_10; + int ret; + + if (hLdacBt == NULL) { + return LDACBT_E_FAIL; + } + + if (hLdacBt->proc_mode != LDACBT_PROCMODE_DECODE) { + hLdacBt->error_code_api = 1000; + ret = LDACBT_E_FAIL; + } + + if (p_bs == NULL || p_pcm == NULL || used_bytes == NULL || wrote_bytes == NULL) { + hLdacBt->error_code_api = LDAC_ERR_ILL_DECODE; + return LDACBT_E_FAIL; + } + + if (bs_bytes < 5) { + hLdacBt->error_code_api = LDAC_ERR_INPUT_BUFFER_SIZE; + return LDACBT_E_FAIL; + } + + hLdacBt->error_code_api = ldacBT_assert_sample_format(fmt); + if (hLdacBt->error_code_api != 0) { + return LDACBT_E_FAIL; + } + + *used_bytes = 0; + *wrote_bytes = 0; + ret = 0; + local_10 = ldaclib_get_frame_header(hLdacBt->hLDAC, p_bs, &sfid, &cci, &frmlen, &frm_status); + if (local_10 < 0) { + hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + return LDACBT_E_FAIL; + } + hLdacBt -> error_code_api = FUN_0001e288(cci); + + if (hLdacBt -> error_code_api != 0) { + return LDACBT_E_FAIL; + } + + cm = FUN_0001f078(cci); + if (( * (int * )(hLdacBt -> ldac_trns_frm_buf).buf != 0) && + (local_10 = ldaclib_check_frame_header(hLdacBt -> hLDAC, sfid, cci), + local_10 < 0)) { + ldaclib_get_sampling_rate(sfid, hLdacBt -> pcm); + local_10 = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt -> pcm.sf, hLdacBt -> nshift); + if (local_10 != 0) { + return LDACBT_E_FAIL; + } + hLdacBt -> error_code_api = 0x28; + ret = LDACBT_E_FAIL; + } + local_10 = ldaclib_set_config_info(hLdacBt -> hLDAC, sfid, cci, frmlen, frm_status); + if (local_10 < 0) { + hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + ret = LDACBT_E_FAIL; + } else { + hLdacBt -> sfid = sfid; + hLdacBt -> frmlen = frmlen; + hLdacBt -> cm = cm; + hLdacBt -> cci = cci; + hLdacBt -> frm_status = frm_status; + if ((-1 < local_10) && ( * (int * )(hLdacBt -> ldac_trns_frm_buf).buf == 0)) { + local_10 = ldaclib_init_decode(hLdacBt -> hLDAC, hLdacBt -> nshift); + if (local_10 < 0) { + hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + return LDACBT_E_FAIL; + } + hLdacBt -> ldac_trns_frm_buf.buf = 1; + local_10 = ldaclib_get_frame_samples(hLdacBt -> sfid, & hLdacBt -> frm_samples); + if (local_10 < 0) { + hLdacBt -> error_code_api = 0x401; + return LDACBT_E_FAIL; + } + } + if (hLdacBt->ldac_trns_frm_buf.buf == 0) { + ret = LDACBT_E_FAIL; + } else { + local_10 = ldaclib_decode(hLdacBt -> hLDAC, p_bs + 3, hLdacBt -> ap_pcm[0], + bs_bytes + -3, used_bytes, (uint) fmt); + if ( *used_bytes != 0) { + *used_bytes = *used_bytes + 3; + } + if (local_10 < 0) { + hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + ret = LDACBT_E_FAIL; + } else { + uVar2 = __divsi3( * used_bytes * hLdacBt -> pcm.sf, hLdacBt -> frm_samples); + hLdacBt -> bitrate = (int)(uVar2 << 3) / 1000; + *wrote_bytes = FUN_0001e90c(p_pcm, (void ** ) hLdacBt->ap_pcm[0], hLdacBt->frm_samples, hLdacBt->pcm.ch, fmt); + } + } + } + + return ret; +} diff --git a/src/ldaclib.h b/src/ldaclib.h index 58336d2..1e85ef6 100644 --- a/src/ldaclib.h +++ b/src/ldaclib.h @@ -134,6 +134,7 @@ DECLSPEC LDAC_RESULT ldaclib_clear_internal_error_code(HANDLE_LDAC); #define LDAC_ERR_ILL_SYNCWORD 516 #define LDAC_ERR_ILL_SMPL_FORMAT 517 +#define LDAC_ERR_ILL_DECODE 518 #define LDAC_ERR_ASSERT_SAMPLING_RATE 530 #define LDAC_ERR_ASSERT_SUP_SAMPLING_RATE 531 From cc9ea2885568b0a87d00773a36285bc2585c520b Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Mon, 25 Jan 2021 00:00:18 +0300 Subject: [PATCH 2/9] Add memory holes to Audio Channel and Audio Block structures --- src/ldac.h | 3 +++ src/ldacBT_internal.h | 1 + 2 files changed, 4 insertions(+) diff --git a/src/ldac.h b/src/ldac.h index 7b012b6..c29a539 100644 --- a/src/ldac.h +++ b/src/ldac.h @@ -188,6 +188,7 @@ struct _audio_channel_sub_ldac { struct _audio_channel_ldac { int ich; int frmana_cnt; + int unk3; int sfc_mode; int sfc_bitlen; int sfc_offset; @@ -209,6 +210,8 @@ struct _audio_block_ldac { int blk_nchs; int nbands; int nqus; + int unk1; + int unk2; int grad_mode; int grad_qu_l; int grad_qu_h; diff --git a/src/ldacBT_internal.h b/src/ldacBT_internal.h index 1bdc4d5..dc10334 100644 --- a/src/ldacBT_internal.h +++ b/src/ldacBT_internal.h @@ -173,6 +173,7 @@ typedef struct _st_ldacbt_handle { int cm; /* Channel Mode */ int cci; /* Channel Config Index */ int transport; /* Transport Stream ( with frame header) */ + int unk4; /* buffer for "ldac_transport_frame" sequence */ LDACBT_TRANSPORT_FRM_BUF ldac_trns_frm_buf; /* buffer for input pcm */ From f75b3b9da3c36f178491ac2be7a713f269288348 Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Mon, 25 Jan 2021 16:03:01 +0300 Subject: [PATCH 3/9] Do not restrict some functions to encode mode --- src/ldacBT_api.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ldacBT_api.c b/src/ldacBT_api.c index 1232f06..efb60de 100644 --- a/src/ldacBT_api.c +++ b/src/ldacBT_api.c @@ -52,6 +52,8 @@ LDACBT_API void ldacBT_free_handle( HANDLE_LDAC_BT hLdacBT ) /* close ldaclib handle */ if( hLdacBT->proc_mode == LDACBT_PROCMODE_ENCODE ){ ldaclib_free_encode( hLdacBT->hLDAC ); + }else if( hLdacBT->proc_mode == LDACBT_PROCMODE_DECODE ){ + ldaclib_free_decode( hLdacBT->hLDAC ); } /* free ldaclib handle */ ldaclib_free_handle( hLdacBT->hLDAC ); @@ -70,6 +72,8 @@ LDACBT_API void ldacBT_close_handle( HANDLE_LDAC_BT hLdacBT ) /* close ldaclib handle */ if( hLdacBT->proc_mode == LDACBT_PROCMODE_ENCODE ){ ldaclib_free_encode( hLdacBT->hLDAC ); + }else if( hLdacBT->proc_mode == LDACBT_PROCMODE_DECODE ){ + ldaclib_free_decode( hLdacBT->hLDAC ); } /* clear error code */ ldaclib_clear_error_code(hLdacBT->hLDAC); @@ -103,7 +107,8 @@ LDACBT_API int ldacBT_get_sampling_freq( HANDLE_LDAC_BT hLdacBT ) if( hLdacBT == NULL ){ return LDACBT_E_FAIL; } - if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ) + if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE && + hLdacBT->proc_mode != LDACBT_PROCMODE_DECODE ) { hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT; return LDACBT_E_FAIL; @@ -117,7 +122,8 @@ LDACBT_API int ldacBT_get_bitrate( HANDLE_LDAC_BT hLdacBT ) if( hLdacBT == NULL ){ return LDACBT_E_FAIL; } - if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE ) + if( hLdacBT->proc_mode != LDACBT_PROCMODE_ENCODE && + hLdacBT->proc_mode != LDACBT_PROCMODE_DECODE ) { hLdacBT->error_code_api = LDACBT_ERR_HANDLE_NOT_INIT; return LDACBT_E_FAIL; From 2d4b0d4065e96633b0671d5529dd5b5ea0492223 Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Mon, 25 Jan 2021 17:46:51 +0300 Subject: [PATCH 4/9] Improve ldacBT_decode * Account for a memory hole * Name some functions --- src/ldacBT_api.c | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/ldacBT_api.c b/src/ldacBT_api.c index efb60de..78520ec 100644 --- a/src/ldacBT_api.c +++ b/src/ldacBT_api.c @@ -678,18 +678,18 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; return LDACBT_E_FAIL; } - hLdacBt -> error_code_api = FUN_0001e288(cci); + hLdacBt -> error_code_api = ldacBT_assert_cci(cci); if (hLdacBt -> error_code_api != 0) { return LDACBT_E_FAIL; } - cm = FUN_0001f078(cci); - if (( * (int * )(hLdacBt -> ldac_trns_frm_buf).buf != 0) && + cm = ldacBT_cci_to_cm_weird_ret(cci); + if ((hLdacBt->unk4 != 0) && (local_10 = ldaclib_check_frame_header(hLdacBt -> hLDAC, sfid, cci), local_10 < 0)) { ldaclib_get_sampling_rate(sfid, hLdacBt -> pcm); - local_10 = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt -> pcm.sf, hLdacBt -> nshift); + local_10 = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt -> pcm.sf, hLdacBt -> nshift, 0, 0); if (local_10 != 0) { return LDACBT_E_FAIL; } @@ -706,26 +706,26 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void hLdacBt -> cm = cm; hLdacBt -> cci = cci; hLdacBt -> frm_status = frm_status; - if ((-1 < local_10) && ( * (int * )(hLdacBt -> ldac_trns_frm_buf).buf == 0)) { + if ((-1 < local_10) && (hLdacBt->unk4 == 0)) { local_10 = ldaclib_init_decode(hLdacBt -> hLDAC, hLdacBt -> nshift); if (local_10 < 0) { hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; return LDACBT_E_FAIL; } - hLdacBt -> ldac_trns_frm_buf.buf = 1; + hLdacBt->unk4 = 1; local_10 = ldaclib_get_frame_samples(hLdacBt -> sfid, & hLdacBt -> frm_samples); if (local_10 < 0) { hLdacBt -> error_code_api = 0x401; return LDACBT_E_FAIL; } } - if (hLdacBt->ldac_trns_frm_buf.buf == 0) { + if (hLdacBt->unk4 == 0) { ret = LDACBT_E_FAIL; } else { - local_10 = ldaclib_decode(hLdacBt -> hLDAC, p_bs + 3, hLdacBt -> ap_pcm[0], + local_10 = ldaclib_decode(hLdacBt -> hLDAC, p_bs + 3, hLdacBt -> pp_pcm, bs_bytes + -3, used_bytes, (uint) fmt); if ( *used_bytes != 0) { - *used_bytes = *used_bytes + 3; + *used_bytes += 3; } if (local_10 < 0) { hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; @@ -733,7 +733,7 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void } else { uVar2 = __divsi3( * used_bytes * hLdacBt -> pcm.sf, hLdacBt -> frm_samples); hLdacBt -> bitrate = (int)(uVar2 << 3) / 1000; - *wrote_bytes = FUN_0001e90c(p_pcm, (void ** ) hLdacBt->ap_pcm[0], hLdacBt->frm_samples, hLdacBt->pcm.ch, fmt); + *wrote_bytes = ldacBT_prepare_pcm_decode(p_pcm, hLdacBt->pp_pcm, hLdacBt->frm_samples, hLdacBt->pcm.ch, fmt); } } } From 5bb2d6c492c8ad6655990c9a75b169d955e3694d Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Mon, 25 Jan 2021 18:08:16 +0300 Subject: [PATCH 5/9] Remove "unused" attribute from some functions --- src/ldacBT_internal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/ldacBT_internal.c b/src/ldacBT_internal.c index 94affa4..d399a0c 100644 --- a/src/ldacBT_internal.c +++ b/src/ldacBT_internal.c @@ -149,7 +149,7 @@ DECLFUNC int ldacBT_assert_cm( int cm ) } return LDACBT_ERR_NONE; } -UNUSED_ATTR DECLFUNC int ldacBT_assert_cci( int cci ) +DECLFUNC int ldacBT_assert_cci( int cci ) { if( (cci != LDAC_CCI_STEREO ) && (cci != LDAC_CCI_DUAL_CHANNEL ) @@ -403,7 +403,7 @@ DECLFUNC int ldacBT_cm_to_cci( int cm ) * The argument cci, channel_config_index, must be checked by the function ldacBT_assert_cci() before * calling this function. */ -UNUSED_ATTR DECLFUNC int ldacBT_cci_to_cm( int cci ) +DECLFUNC int ldacBT_cci_to_cm( int cci ) { if( cci == LDAC_CCI_STEREO ){ return LDACBT_CHANNEL_MODE_STEREO; From 57a2acd931dd11afe5e229a83ea6caa004013c73 Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Wed, 27 Jan 2021 02:21:38 +0300 Subject: [PATCH 6/9] Resolve few (of many) issues in ldacBT_decode --- src/decode_ldac.c | 31 +++++++++++++++++++++++++++++++ src/ldacBT_api.c | 6 +++--- src/ldaclib.c | 3 ++- src/ldaclib.h | 1 - src/ldaclib_api.c | 10 ++++++++++ 5 files changed, 46 insertions(+), 5 deletions(-) create mode 100644 src/decode_ldac.c diff --git a/src/decode_ldac.c b/src/decode_ldac.c new file mode 100644 index 0000000..1bf17ec --- /dev/null +++ b/src/decode_ldac.c @@ -0,0 +1,31 @@ +#include "ldac.h" + +/*************************************************************************************************** + Free Memory +***************************************************************************************************/ +DECLFUNC void free_decode_ldac( +SFINFO *p_sfinfo) +{ + int ich; + int nchs = p_sfinfo->cfg.ch; + + /* Free AB */ + if (p_sfinfo->p_ab != (AB *)NULL) { + free(p_sfinfo->p_ab); + p_sfinfo->p_ab = (AB *)NULL; + } + + /* Free AC */ + for (ich = 0; ich < nchs; ich++) { + if (p_sfinfo->ap_ac[ich] != (AC *)NULL) { + if (p_sfinfo->ap_ac[ich]->p_acsub != (ACSUB *)NULL) { + free(p_sfinfo->ap_ac[ich]->p_acsub); + p_sfinfo->ap_ac[ich]->p_acsub = (ACSUB *)NULL; + } + free(p_sfinfo->ap_ac[ich]); + p_sfinfo->ap_ac[ich] = (AC *)NULL; + } + } + + return; +} diff --git a/src/ldacBT_api.c b/src/ldacBT_api.c index 78520ec..45909ed 100644 --- a/src/ldacBT_api.c +++ b/src/ldacBT_api.c @@ -631,7 +631,7 @@ LDACBT_API int ldacBT_encode( HANDLE_LDAC_BT hLdacBT, void *p_pcm, int *pcm_used return LDACBT_S_OK; } -LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void *p_pcm, +LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void *p_pcm, LDACBT_SMPL_FMT_T fmt, int bs_bytes, int *used_bytes, int *wrote_bytes) { @@ -684,11 +684,11 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void return LDACBT_E_FAIL; } - cm = ldacBT_cci_to_cm_weird_ret(cci); + cm = ldacBT_cci_to_cm(cci); // FIXME weird ret if ((hLdacBt->unk4 != 0) && (local_10 = ldaclib_check_frame_header(hLdacBt -> hLDAC, sfid, cci), local_10 < 0)) { - ldaclib_get_sampling_rate(sfid, hLdacBt -> pcm); + ldaclib_get_sampling_rate(sfid, &hLdacBt->pcm.sf); local_10 = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt -> pcm.sf, hLdacBt -> nshift, 0, 0); if (local_10 != 0) { return LDACBT_E_FAIL; diff --git a/src/ldaclib.c b/src/ldaclib.c index 17d1613..6f657cf 100644 --- a/src/ldaclib.c +++ b/src/ldaclib.c @@ -45,4 +45,5 @@ #include "pack_ldac.c" #include "encode_ldac.c" - +/* Decoder Files */ +#include "decode_ldac.c" diff --git a/src/ldaclib.h b/src/ldaclib.h index 1e85ef6..58336d2 100644 --- a/src/ldaclib.h +++ b/src/ldaclib.h @@ -134,7 +134,6 @@ DECLSPEC LDAC_RESULT ldaclib_clear_internal_error_code(HANDLE_LDAC); #define LDAC_ERR_ILL_SYNCWORD 516 #define LDAC_ERR_ILL_SMPL_FORMAT 517 -#define LDAC_ERR_ILL_DECODE 518 #define LDAC_ERR_ASSERT_SAMPLING_RATE 530 #define LDAC_ERR_ASSERT_SUP_SAMPLING_RATE 531 diff --git a/src/ldaclib_api.c b/src/ldaclib_api.c index 4c54407..d592634 100644 --- a/src/ldaclib_api.c +++ b/src/ldaclib_api.c @@ -662,6 +662,16 @@ HANDLE_LDAC hData) return LDAC_S_OK; } +DECLSPEC LDAC_RESULT ldaclib_free_decode( +HANDLE_LDAC hData) +{ + if (hData->sfinfo.p_mempos == NULL) { + free_decode_ldac(&hData->sfinfo); + } + + return LDAC_S_OK; +} + /*************************************************************************************************** Encode ***************************************************************************************************/ From a22e5e91d5a2d7ee330b6e2b4e7c2b0bcf0a00ca Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Wed, 27 Jan 2021 02:35:21 +0300 Subject: [PATCH 7/9] Fix float division, remove unused vars --- src/ldacBT_api.c | 64 +++++++++++++++++++++++------------------------- 1 file changed, 30 insertions(+), 34 deletions(-) diff --git a/src/ldacBT_api.c b/src/ldacBT_api.c index 45909ed..c5a30c1 100644 --- a/src/ldacBT_api.c +++ b/src/ldacBT_api.c @@ -635,15 +635,12 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void LDACBT_SMPL_FMT_T fmt, int bs_bytes, int *used_bytes, int *wrote_bytes) { - int iVar1; - uint uVar2; - size_t sVar3; + LDAC_RESULT result; int frm_status; int frmlen; int cci; int sfid; int cm; - int local_10; int ret; if (hLdacBt == NULL) { @@ -656,7 +653,7 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void } if (p_bs == NULL || p_pcm == NULL || used_bytes == NULL || wrote_bytes == NULL) { - hLdacBt->error_code_api = LDAC_ERR_ILL_DECODE; + hLdacBt->error_code_api = LDACBT_ERR_ILL_PARAM; return LDACBT_E_FAIL; } @@ -673,66 +670,65 @@ LDACBT_API int ldacBT_decode( HANDLE_LDAC_BT hLdacBt, unsigned char *p_bs, void *used_bytes = 0; *wrote_bytes = 0; ret = 0; - local_10 = ldaclib_get_frame_header(hLdacBt->hLDAC, p_bs, &sfid, &cci, &frmlen, &frm_status); - if (local_10 < 0) { + result = ldaclib_get_frame_header(hLdacBt->hLDAC, p_bs, &sfid, &cci, &frmlen, &frm_status); + if (result < 0) { hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; return LDACBT_E_FAIL; } - hLdacBt -> error_code_api = ldacBT_assert_cci(cci); + hLdacBt->error_code_api = ldacBT_assert_cci(cci); - if (hLdacBt -> error_code_api != 0) { + if (hLdacBt->error_code_api != 0) { return LDACBT_E_FAIL; } cm = ldacBT_cci_to_cm(cci); // FIXME weird ret if ((hLdacBt->unk4 != 0) && - (local_10 = ldaclib_check_frame_header(hLdacBt -> hLDAC, sfid, cci), - local_10 < 0)) { + (result = ldaclib_check_frame_header(hLdacBt->hLDAC, sfid, cci), + result < 0)) { ldaclib_get_sampling_rate(sfid, &hLdacBt->pcm.sf); - local_10 = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt -> pcm.sf, hLdacBt -> nshift, 0, 0); - if (local_10 != 0) { + result = ldacBT_init_handle_decode(hLdacBt, cm, hLdacBt->pcm.sf, hLdacBt->nshift, 0, 0); + if (result != 0) { return LDACBT_E_FAIL; } - hLdacBt -> error_code_api = 0x28; + hLdacBt->error_code_api = 0x28; ret = LDACBT_E_FAIL; } - local_10 = ldaclib_set_config_info(hLdacBt -> hLDAC, sfid, cci, frmlen, frm_status); - if (local_10 < 0) { - hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + result = ldaclib_set_config_info(hLdacBt->hLDAC, sfid, cci, frmlen, frm_status); + if (result < 0) { + hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; ret = LDACBT_E_FAIL; } else { - hLdacBt -> sfid = sfid; - hLdacBt -> frmlen = frmlen; - hLdacBt -> cm = cm; - hLdacBt -> cci = cci; - hLdacBt -> frm_status = frm_status; - if ((-1 < local_10) && (hLdacBt->unk4 == 0)) { - local_10 = ldaclib_init_decode(hLdacBt -> hLDAC, hLdacBt -> nshift); - if (local_10 < 0) { - hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + hLdacBt->sfid = sfid; + hLdacBt->frmlen = frmlen; + hLdacBt->cm = cm; + hLdacBt->cci = cci; + hLdacBt->frm_status = frm_status; + if ((-1 < result) && (hLdacBt->unk4 == 0)) { + result = ldaclib_init_decode(hLdacBt->hLDAC, hLdacBt->nshift); + if (result < 0) { + hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; return LDACBT_E_FAIL; } hLdacBt->unk4 = 1; - local_10 = ldaclib_get_frame_samples(hLdacBt -> sfid, & hLdacBt -> frm_samples); - if (local_10 < 0) { - hLdacBt -> error_code_api = 0x401; + result = ldaclib_get_frame_samples(hLdacBt->sfid, & hLdacBt->frm_samples); + if (result < 0) { + hLdacBt->error_code_api = 0x401; return LDACBT_E_FAIL; } } if (hLdacBt->unk4 == 0) { ret = LDACBT_E_FAIL; } else { - local_10 = ldaclib_decode(hLdacBt -> hLDAC, p_bs + 3, hLdacBt -> pp_pcm, + result = ldaclib_decode(hLdacBt->hLDAC, p_bs + 3, hLdacBt->pp_pcm, bs_bytes + -3, used_bytes, (uint) fmt); if ( *used_bytes != 0) { *used_bytes += 3; } - if (local_10 < 0) { - hLdacBt -> error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; + if (result < 0) { + hLdacBt->error_code_api = LDACBT_GET_LDACLIB_ERROR_CODE; ret = LDACBT_E_FAIL; } else { - uVar2 = __divsi3( * used_bytes * hLdacBt -> pcm.sf, hLdacBt -> frm_samples); - hLdacBt -> bitrate = (int)(uVar2 << 3) / 1000; + hLdacBt->bitrate = *used_bytes * hLdacBt->pcm.sf / hLdacBt->frm_samples / (1000 / 8); // FIXME check validity *wrote_bytes = ldacBT_prepare_pcm_decode(p_pcm, hLdacBt->pp_pcm, hLdacBt->frm_samples, hLdacBt->pcm.ch, fmt); } } From 6a74e5630c36a55e1b5463d46146e864c0ea6afa Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Wed, 27 Jan 2021 02:48:15 +0300 Subject: [PATCH 8/9] Get Frame Header --- src/ldaclib.h | 1 + src/ldaclib_api.c | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) diff --git a/src/ldaclib.h b/src/ldaclib.h index 58336d2..67665c6 100644 --- a/src/ldaclib.h +++ b/src/ldaclib.h @@ -79,6 +79,7 @@ DECLSPEC LDAC_RESULT ldaclib_free_handle(HANDLE_LDAC); DECLSPEC LDAC_RESULT ldaclib_set_config_info(HANDLE_LDAC, int, int, int, int); DECLSPEC LDAC_RESULT ldaclib_get_config_info(HANDLE_LDAC, int *, int *, int *, int *); DECLSPEC LDAC_RESULT ldaclib_set_frame_header(HANDLE_LDAC, unsigned char *, int, int, int, int); +DECLSPEC LDAC_RESULT ldaclib_get_frame_header(HANDLE_LDAC, unsigned char *, int *, int *, int *, int *); /* Encoder API Functions */ DECLSPEC LDAC_RESULT ldaclib_get_encode_setting(int, int, int *, int *, int *, int *, int *, int *, int *); diff --git a/src/ldaclib_api.c b/src/ldaclib_api.c index d592634..e5f8869 100644 --- a/src/ldaclib_api.c +++ b/src/ldaclib_api.c @@ -443,6 +443,31 @@ int frame_status) } +/*************************************************************************************************** + Get Frame Header +***************************************************************************************************/ +DECLSPEC LDAC_RESULT ldaclib_get_frame_header( +HANDLE_LDAC hData, +unsigned char *p_stream, +int smplrate_id, +int chconfig_id, +int frame_length, +int frame_status) +{ + int res; + + res = unpack_frame_header_ldac(smplrate_id, chconfig_id, frame_length, frame_status, + (STREAM *)p_stream); + if (res == 0) { + hData->error_code = 0x204; + res = -0x7fffbffb; + } + else { + res = 0; + } + return res; +} + /*************************************************************************************************** Encoder API Functions ***************************************************************************************************/ From 4222f82396c1ea25c8068ba609f681a4ae15d907 Mon Sep 17 00:00:00 2001 From: Artem Labazov <123321artyom@gmail.com> Date: Wed, 27 Jan 2021 02:59:51 +0300 Subject: [PATCH 9/9] Unpack frame header --- src/ldaclib.c | 1 + src/proto_ldac.h | 2 ++ src/unpack_ldac.c | 29 +++++++++++++++++++++++++++++ 3 files changed, 32 insertions(+) create mode 100644 src/unpack_ldac.c diff --git a/src/ldaclib.c b/src/ldaclib.c index 6f657cf..f4c156f 100644 --- a/src/ldaclib.c +++ b/src/ldaclib.c @@ -46,4 +46,5 @@ #include "encode_ldac.c" /* Decoder Files */ +#include "unpack_ldac.c" #include "decode_ldac.c" diff --git a/src/proto_ldac.h b/src/proto_ldac.h index 383e448..44110e3 100644 --- a/src/proto_ldac.h +++ b/src/proto_ldac.h @@ -55,6 +55,8 @@ DECLFUNC void pack_frame_header_ldac(int, int, int, int, STREAM *); DECLFUNC int pack_raw_data_frame_ldac(SFINFO *, STREAM *, int *, int *); DECLFUNC int pack_null_data_frame_ldac(SFINFO *, STREAM *, int *, int *); +/* unpack_ldac.c */ +DECLFUNC void unpack_frame_header_ldac(int *, int *, int *, int *, STREAM *); /* tables_ldac.c */ DECLFUNC int get_block_nchs_ldac(int); diff --git a/src/unpack_ldac.c b/src/unpack_ldac.c new file mode 100644 index 0000000..579e569 --- /dev/null +++ b/src/unpack_ldac.c @@ -0,0 +1,29 @@ +#include "ldac.h" + +/*************************************************************************************************** + Unpack Frame Header +***************************************************************************************************/ +DECLFUNC LDAC_RESULT unpack_frame_header_ldac( +int *smplrate_id, +int *chconfig_id, +int *frame_length, +int *frame_status, +STREAM *p_stream) +{ + int sync_word; + int dummy = 0; + + unpack_msb_ldac(8, p_stream, &dummy, &sync_word); + + if (sync_word != 0xaa) { + return LDAC_S_FALSE; + } + + unpack_msb_ldac(3, p_stream, &dummy, smplrate_id); + unpack_msb_ldac(2, p_stream, &dummy, chconfig_id); + unpack_msb_ldac(9, p_stream, &dummy, frame_length); + *frame_length = *frame_length + 1; + unpack_msb_ldac(2, p_stream, &dummy, frame_status); + + return LDAC_S_OK; +}