Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2003 - 2016 Sony Corporation
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 #include "ldaclib.h"
     18 #include "ldac.h"
     19 
     20 #define LDACLIB_MAJOR_VERSION  01
     21 #define LDACLIB_MINOR_VERSION  00
     22 #define LDACLIB_BRANCH_VERSION 00
     23 
     24 /***************************************************************************************************
     25     Local Assert Functions
     26 ***************************************************************************************************/
     27 static int ldaclib_assert_sampling_rate_index(
     28 int smplrate_id)
     29 {
     30     if ((LDAC_SMPLRATEID_0 <= smplrate_id) && (smplrate_id < LDAC_NSMPLRATEID)) {
     31         return LDAC_TRUE;
     32     }
     33     else {
     34         return LDAC_FALSE;
     35     }
     36 }
     37 
     38 static int ldaclib_assert_supported_sampling_rate_index(
     39 int smplrate_id)
     40 {
     41     if ((LDAC_SMPLRATEID_0 <= smplrate_id) && (smplrate_id < LDAC_NSUPSMPLRATEID)) {
     42         return LDAC_TRUE;
     43     }
     44     else {
     45         return LDAC_FALSE;
     46     }
     47 }
     48 
     49 static int ldaclib_assert_channel_config_index(
     50 int chconfig_id)
     51 {
     52     if ((chconfig_id == LDAC_CHCONFIGID_MN)
     53             || (chconfig_id == LDAC_CHCONFIGID_DL) || (chconfig_id == LDAC_CHCONFIGID_ST)) {
     54         return LDAC_TRUE;
     55     }
     56     else {
     57         return LDAC_FALSE;
     58     }
     59 }
     60 
     61 static int ldaclib_assert_channel(
     62 int ch)
     63 {
     64     if ((ch == LDAC_CHANNEL_1CH) || (ch == LDAC_CHANNEL_2CH)) {
     65         return LDAC_TRUE;
     66     }
     67     else {
     68         return LDAC_FALSE;
     69     }
     70 }
     71 
     72 static int ldaclib_assert_frame_length(
     73 int frame_length)
     74 {
     75     if ((0 < frame_length) && (frame_length <= LDAC_MAXNBYTES)) {
     76         return LDAC_TRUE;
     77     }
     78     else {
     79         return LDAC_FALSE;
     80     }
     81 }
     82 
     83 static int ldaclib_assert_supported_frame_length(
     84 int frame_length,
     85 int chconfig_id)
     86 {
     87     if (chconfig_id == LDAC_CHCONFIGID_MN) {
     88         if ((LDAC_MINSUPNBYTES/2 <= frame_length) && (frame_length <= LDAC_MAXSUPNBYTES/2)) {
     89             return LDAC_TRUE;
     90         }
     91         else {
     92             return LDAC_FALSE;
     93         }
     94     }
     95     else if ((chconfig_id == LDAC_CHCONFIGID_DL) || (chconfig_id == LDAC_CHCONFIGID_ST)) {
     96         if ((LDAC_MINSUPNBYTES <= frame_length) && (frame_length <= LDAC_MAXSUPNBYTES)) {
     97             return LDAC_TRUE;
     98         }
     99         else {
    100             return LDAC_FALSE;
    101         }
    102     }
    103     else {
    104         return LDAC_FALSE;
    105     }
    106 }
    107 
    108 static int ldaclib_assert_frame_status(
    109 int frame_status)
    110 {
    111     if ((LDAC_FRMSTAT_LEV_0 <= frame_status) && (frame_status <= LDAC_FRMSTAT_LEV_3)) {
    112         return LDAC_TRUE;
    113     }
    114     else {
    115         return LDAC_FALSE;
    116     }
    117 }
    118 
    119 static int ldaclib_assert_nlnn_shift(
    120 int nlnn_shift)
    121 {
    122     if ((-2 <= nlnn_shift) && (nlnn_shift < LDAC_NSFTSTEP-2)) {
    123         return LDAC_TRUE;
    124     }
    125     else {
    126         return LDAC_FALSE;
    127     }
    128 }
    129 
    130 static int ldaclib_assert_sample_format(
    131 LDAC_SMPL_FMT_T sample_format)
    132 {
    133 #ifndef _32BIT_FIXED_POINT
    134     if ((LDAC_SMPL_FMT_S16 <= sample_format) && (sample_format <= LDAC_SMPL_FMT_F32)) {
    135 #else /* _32BIT_FIXED_POINT */
    136     if ((LDAC_SMPL_FMT_S16 <= sample_format) && (sample_format <= LDAC_SMPL_FMT_S32)) {
    137 #endif /* _32BIT_FIXED_POINT */
    138         return LDAC_TRUE;
    139     }
    140     else {
    141         return LDAC_FALSE;
    142     }
    143 }
    144 
    145 
    146 /***************************************************************************************************
    147     Common API Functions
    148 ***************************************************************************************************/
    149 
    150 /***************************************************************************************************
    151     Get Library Version
    152 ***************************************************************************************************/
    153 DECLSPEC int ldaclib_get_version(void) {
    154     return (LDACLIB_MAJOR_VERSION<<16) | (LDACLIB_MINOR_VERSION<<8) | LDACLIB_BRANCH_VERSION;
    155 }
    156 
    157 DECLSPEC int ldaclib_get_major_version(void) {
    158     return LDACLIB_MAJOR_VERSION;
    159 }
    160 
    161 DECLSPEC int ldaclib_get_minor_version(void) {
    162     return LDACLIB_MINOR_VERSION;
    163 }
    164 
    165 DECLSPEC int ldaclib_get_branch_version(void) {
    166     return LDACLIB_BRANCH_VERSION;
    167 }
    168 
    169 /***************************************************************************************************
    170     Get Basic Parameters
    171 ***************************************************************************************************/
    172 DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate_index(
    173 int smplrate,
    174 int *p_smplrate_id)
    175 {
    176     if (smplrate == 44100) {
    177         *p_smplrate_id = LDAC_SMPLRATEID_0;
    178     }
    179     else if (smplrate == 48000) {
    180         *p_smplrate_id = LDAC_SMPLRATEID_1;
    181     }
    182     else if (smplrate == 88200) {
    183         *p_smplrate_id = LDAC_SMPLRATEID_2;
    184     }
    185     else if (smplrate == 96000) {
    186         *p_smplrate_id = LDAC_SMPLRATEID_3;
    187     }
    188     else {
    189         return LDAC_E_FAIL;
    190     }
    191 
    192     return LDAC_S_OK;
    193 }
    194 
    195 DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate(
    196 int smplrate_id,
    197 int *p_smplrate)
    198 {
    199     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    200         return LDAC_E_FAIL;
    201     }
    202     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    203         return LDAC_E_FAIL;
    204     }
    205 
    206     *p_smplrate = ga_smplrate_ldac[smplrate_id];
    207 
    208     return LDAC_S_OK;
    209 }
    210 
    211 DECLSPEC LDAC_RESULT ldaclib_get_frame_samples(
    212 int smplrate_id,
    213 int *p_framesmpls)
    214 {
    215     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    216         return LDAC_E_FAIL;
    217     }
    218     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    219         return LDAC_E_FAIL;
    220     }
    221 
    222     *p_framesmpls = ga_framesmpls_ldac[smplrate_id];
    223 
    224     return LDAC_S_OK;
    225 }
    226 
    227 DECLSPEC LDAC_RESULT ldaclib_get_nlnn(
    228 int smplrate_id,
    229 int *p_nlnn)
    230 {
    231     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    232         return LDAC_E_FAIL;
    233     }
    234     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    235         return LDAC_E_FAIL;
    236     }
    237 
    238     *p_nlnn = ga_ln_framesmpls_ldac[smplrate_id];
    239 
    240     return LDAC_S_OK;
    241 }
    242 
    243 DECLSPEC LDAC_RESULT ldaclib_get_channel(
    244 int chconfig_id,
    245 int *p_ch)
    246 {
    247     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
    248         return LDAC_E_FAIL;
    249     }
    250 
    251     *p_ch = ga_ch_ldac[chconfig_id];
    252 
    253     return LDAC_S_OK;
    254 }
    255 
    256 DECLSPEC LDAC_RESULT ldaclib_get_channel_config_index(
    257 int ch,
    258 int *p_chconfig_id)
    259 {
    260     if (!ldaclib_assert_channel(ch)) {
    261         return LDAC_E_FAIL;
    262     }
    263 
    264     *p_chconfig_id = ga_chconfig_id_ldac[ch];
    265 
    266     return LDAC_S_OK;
    267 }
    268 
    269 DECLSPEC LDAC_RESULT ldaclib_check_nlnn_shift(
    270 int smplrate_id,
    271 int nlnn_shift)
    272 {
    273     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    274         return LDAC_E_FAIL;
    275     }
    276     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    277         return LDAC_E_FAIL;
    278     }
    279     if (!ldaclib_assert_nlnn_shift(nlnn_shift)) {
    280         return LDAC_E_FAIL;
    281     }
    282 
    283     if (gaa_nlnn_shift_ldac[smplrate_id][nlnn_shift+2] < 0) {
    284         return LDAC_E_FAIL;
    285     }
    286 
    287     return LDAC_S_OK;
    288 }
    289 
    290 /***************************************************************************************************
    291     Get Handle
    292 ***************************************************************************************************/
    293 DECLSPEC HANDLE_LDAC ldaclib_get_handle(
    294 void)
    295 {
    296     HANDLE_LDAC hData;
    297 
    298     hData = (HANDLE_LDAC)malloc(sizeof(HANDLE_LDAC_STRUCT));
    299     if (hData != (HANDLE_LDAC)NULL) {
    300         clear_data_ldac(hData, sizeof(HANDLE_LDAC_STRUCT));
    301         hData->sfinfo.p_mempos = (char *)NULL;
    302         hData->error_code = LDAC_ERR_NONE;
    303     }
    304 
    305     return hData;
    306 }
    307 
    308 /***************************************************************************************************
    309     Free Handle
    310 ***************************************************************************************************/
    311 DECLSPEC LDAC_RESULT ldaclib_free_handle(
    312 HANDLE_LDAC hData)
    313 {
    314     if (hData != (HANDLE_LDAC)NULL) {
    315         if (hData->sfinfo.p_mempos != (char *)NULL) {
    316             return LDAC_S_OK;
    317         }
    318 
    319         free(hData);
    320     }
    321 
    322     return LDAC_S_OK;
    323 }
    324 
    325 /***************************************************************************************************
    326     Set Configuration Information
    327 ***************************************************************************************************/
    328 DECLSPEC LDAC_RESULT ldaclib_set_config_info(
    329 HANDLE_LDAC hData,
    330 int smplrate_id,
    331 int chconfig_id,
    332 int frame_length,
    333 int frame_status)
    334 {
    335     CFG *p_cfg = &hData->sfinfo.cfg;
    336 
    337     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    338         hData->error_code = LDAC_ERR_ASSERT_SAMPLING_RATE;
    339         return LDAC_E_FAIL;
    340     }
    341 
    342     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    343         hData->error_code = LDAC_ERR_ASSERT_SUP_SAMPLING_RATE;
    344         return LDAC_E_FAIL;
    345     }
    346 
    347     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
    348         hData->error_code = LDAC_ERR_ASSERT_CHANNEL_CONFIG;
    349         return LDAC_E_FAIL;
    350     }
    351 
    352     if (!ldaclib_assert_frame_length(frame_length)) {
    353         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
    354         return LDAC_E_FAIL;
    355     }
    356 
    357     if (!ldaclib_assert_supported_frame_length(frame_length, chconfig_id)) {
    358         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
    359         return LDAC_E_FAIL;
    360     }
    361 
    362     if (!ldaclib_assert_frame_status(frame_status)) {
    363         hData->error_code = LDAC_ERR_ASSERT_FRAME_STATUS;
    364         return LDAC_E_FAIL;
    365     }
    366 
    367     p_cfg->smplrate_id = smplrate_id;
    368     p_cfg->chconfig_id = chconfig_id;
    369     p_cfg->frame_length = frame_length;
    370     p_cfg->frame_status = frame_status;
    371 
    372     ldaclib_get_channel(chconfig_id, &p_cfg->ch);
    373 
    374     return LDAC_S_OK;
    375 }
    376 
    377 /***************************************************************************************************
    378     Get Configuration Information
    379 ***************************************************************************************************/
    380 DECLSPEC LDAC_RESULT ldaclib_get_config_info(
    381 HANDLE_LDAC hData,
    382 int *p_smplrate_id,
    383 int *p_chconfig_id,
    384 int *p_frame_length,
    385 int *p_frame_status)
    386 {
    387     CFG *p_cfg = &hData->sfinfo.cfg;
    388 
    389     *p_smplrate_id = p_cfg->smplrate_id;
    390     *p_chconfig_id = p_cfg->chconfig_id;
    391     *p_frame_length = p_cfg->frame_length;
    392     *p_frame_status = p_cfg->frame_status;
    393 
    394     return LDAC_S_OK;
    395 }
    396 
    397 
    398 /***************************************************************************************************
    399     Set Frame Header
    400 ***************************************************************************************************/
    401 DECLSPEC LDAC_RESULT ldaclib_set_frame_header(
    402 HANDLE_LDAC hData,
    403 unsigned char *p_stream,
    404 int smplrate_id,
    405 int chconfig_id,
    406 int frame_length,
    407 int frame_status)
    408 {
    409     if (!ldaclib_assert_sampling_rate_index(smplrate_id)) {
    410         hData->error_code = LDAC_ERR_ASSERT_SAMPLING_RATE;
    411         return LDAC_E_FAIL;
    412     }
    413 
    414     if (!ldaclib_assert_supported_sampling_rate_index(smplrate_id)) {
    415         hData->error_code = LDAC_ERR_ASSERT_SUP_SAMPLING_RATE;
    416         return LDAC_E_FAIL;
    417     }
    418 
    419     if (!ldaclib_assert_channel_config_index(chconfig_id)) {
    420         hData->error_code = LDAC_ERR_ASSERT_CHANNEL_CONFIG;
    421         return LDAC_E_FAIL;
    422     }
    423 
    424     if (!ldaclib_assert_frame_length(frame_length)) {
    425         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
    426         return LDAC_E_FAIL;
    427     }
    428 
    429     if (!ldaclib_assert_supported_frame_length(frame_length, chconfig_id)) {
    430         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
    431         return LDAC_E_FAIL;
    432     }
    433 
    434     if (!ldaclib_assert_frame_status(frame_status)) {
    435         hData->error_code = LDAC_ERR_ASSERT_FRAME_STATUS;
    436         return LDAC_E_FAIL;
    437     }
    438 
    439     pack_frame_header_ldac(smplrate_id, chconfig_id, frame_length, frame_status,
    440             (STREAM *)p_stream);
    441 
    442     return LDAC_S_OK;
    443 }
    444 
    445 
    446 /***************************************************************************************************
    447     Encoder API Functions
    448 ***************************************************************************************************/
    449 
    450 /***************************************************************************************************
    451     Get Encoder Setting
    452 ***************************************************************************************************/
    453 #define LDAC_ENC_NSETTING 15
    454 #define LDAC_ENC_NPROPERTY 9
    455 
    456 static const int saa_encode_setting_ldac[LDAC_ENC_NSETTING][LDAC_ENC_NPROPERTY] = {
    457     {0, 512,  17,   0,  28,  44,   8,  24,   0},
    458     {0, 256,  17,   0,  28,  44,   6,  22,   0},
    459 #ifdef MODIFY_LDAC_ENC_SETTING_FOR_ABR_DEBUG  // See file "ldacBT_abr.h" for description
    460     {0, 164,  16,   0,  18,  32,   7,  23,   0},
    461     {0, 110,   8,   0,  16,  32,  10,  31,   0},
    462     {0,  82,   6,   0,  16,  32,  12,  31,   0},
    463     {0,  66,   4,   0,  14,  26,  12,  31,   0},
    464     {0,  54,   2,   0,  14,  26,  12,  31,   0},
    465     {0,  46,   2,   1,  10,  26,  12,  31,   0},
    466     {0,  40,   2,   2,  10,  26,  12,  31,   0},
    467     {0,  36,   2,   2,   8,  26,  12,  31,   0},
    468     {0,  32,   2,   2,   8,  26,  16,  31,   0},
    469     {0,  30,   2,   2,   4,  26,  16,  31,   0},
    470     {0,  26,   2,   3,   4,  26,  16,  31,   0},
    471     {0,  24,   2,   3,   4,  26,  16,  31,   0},
    472 #else
    473     {0, 164,  16,   0,  18,  32,   7,  23,   0},
    474     {0, 110,  13,   0,  16,  32,  10,  31,   0},
    475     {0,  82,  12,   0,  16,  32,  12,  31,   0},
    476     {0,  66,  11,   0,  14,  26,  12,  31,   0},
    477     {0,  54,  10,   0,  14,  26,  12,  31,   0},
    478     {0,  46,   9,   1,  10,  26,  12,  31,   0},
    479     {0,  40,   8,   2,  10,  26,  12,  31,   0},
    480     {0,  36,   7,   2,   8,  26,  12,  31,   0},
    481     {0,  32,   6,   2,   8,  26,  16,  31,   0},
    482     {0,  30,   5,   2,   4,  26,  16,  31,   0},
    483     {0,  26,   4,   3,   4,  26,  16,  31,   0},
    484     {0,  24,   3,   3,   4,  26,  16,  31,   0},
    485 #endif
    486     {0,  22,   2,   3,   4,  26,  16,  31,   0},
    487 };
    488 
    489 DECLSPEC LDAC_RESULT ldaclib_get_encode_setting(
    490 int nbytes_ch,
    491 int smplrate_id,
    492 int *p_nbands,
    493 int *p_grad_mode,
    494 int *p_grad_qu_l,
    495 int *p_grad_qu_h,
    496 int *p_grad_os_l,
    497 int *p_grad_os_h,
    498 int *p_abc_status)
    499 {
    500     int i, id;
    501 
    502     id = LDAC_ENC_NSETTING-1;
    503     for (i = LDAC_ENC_NSETTING-1; i >= 0; i--) {
    504         if (nbytes_ch >= saa_encode_setting_ldac[i][1]) {
    505             id = i;
    506         }
    507     }
    508 
    509     *p_nbands = min_ldac(saa_encode_setting_ldac[id][2], ga_max_nbands_ldac[smplrate_id]);
    510     *p_grad_mode = saa_encode_setting_ldac[id][3];
    511     *p_grad_qu_l = saa_encode_setting_ldac[id][4];
    512     *p_grad_qu_h = saa_encode_setting_ldac[id][5];
    513     *p_grad_os_l = saa_encode_setting_ldac[id][6];
    514     *p_grad_os_h = saa_encode_setting_ldac[id][7];
    515     *p_abc_status = saa_encode_setting_ldac[id][8];
    516 
    517     return LDAC_S_OK;
    518 }
    519 
    520 /***************************************************************************************************
    521     Set Frame Length
    522 ***************************************************************************************************/
    523 DECLSPEC LDAC_RESULT ldaclib_set_encode_frame_length(
    524 HANDLE_LDAC hData,
    525 int frame_length)
    526 {
    527     CFG *p_cfg = &hData->sfinfo.cfg;
    528 
    529     if (!ldaclib_assert_frame_length(frame_length)) {
    530         hData->error_code = LDAC_ERR_ASSERT_FRAME_LENGTH;
    531         return LDAC_E_FAIL;
    532     }
    533 
    534     if (!ldaclib_assert_supported_frame_length(frame_length, p_cfg->chconfig_id)) {
    535         hData->error_code = LDAC_ERR_ASSERT_SUP_FRAME_LENGTH;
    536         return LDAC_E_FAIL;
    537     }
    538 
    539     p_cfg->frame_length = frame_length;
    540 
    541     calc_initial_bits_ldac(&hData->sfinfo);
    542 
    543     return LDAC_S_OK;
    544 }
    545 
    546 /***************************************************************************************************
    547     Get Frame Length
    548 ***************************************************************************************************/
    549 DECLSPEC LDAC_RESULT ldaclib_get_encode_frame_length(
    550 HANDLE_LDAC hData,
    551 int *p_frame_length)
    552 {
    553     CFG *p_cfg = &hData->sfinfo.cfg;
    554 
    555     *p_frame_length = p_cfg->frame_length;
    556 
    557     return LDAC_S_OK;
    558 }
    559 
    560 /***************************************************************************************************
    561     Set Information
    562 ***************************************************************************************************/
    563 DECLSPEC LDAC_RESULT ldaclib_set_encode_info(
    564 HANDLE_LDAC hData,
    565 int nbands,
    566 int grad_mode,
    567 int grad_qu_l,
    568 int grad_qu_h,
    569 int grad_os_l,
    570 int grad_os_h,
    571 int abc_status)
    572 {
    573     if ((nbands < LDAC_BAND_OFFSET) ||
    574             (ga_max_nbands_ldac[hData->sfinfo.cfg.smplrate_id] < nbands)) {
    575         hData->error_code = LDAC_ERR_ENC_ILL_NBANDS;
    576         return LDAC_E_FAIL;
    577     }
    578 
    579     if ((grad_mode < LDAC_MODE_0) || (LDAC_MODE_3 < grad_mode)) {
    580             hData->error_code = LDAC_ERR_ENC_ILL_GRADMODE;
    581             return LDAC_E_FAIL;
    582     }
    583 
    584     if (grad_mode == LDAC_MODE_0) {
    585         if ((grad_qu_l < 0) || (LDAC_MAXGRADQU <= grad_qu_l)) {
    586             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_A;
    587             return LDAC_E_FAIL;
    588         }
    589 
    590         if ((grad_qu_h < 1) || (LDAC_MAXGRADQU+1 <= grad_qu_h) || (grad_qu_h < grad_qu_l)) {
    591             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_B;
    592             return LDAC_E_FAIL;
    593         }
    594 
    595         if ((grad_os_h < 0) || (LDAC_NIDSF <= grad_os_h)) {
    596             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_C;
    597             return LDAC_E_FAIL;
    598         }
    599     }
    600     else {
    601         if ((grad_qu_l < 0) || (LDAC_DEFGRADQUH < grad_qu_l)) {
    602             hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_A;
    603             return LDAC_E_FAIL;
    604         }
    605     }
    606 
    607     if ((grad_os_l < 0) || (LDAC_NIDSF <= grad_os_l)) {
    608         hData->error_code = LDAC_ERR_ENC_ILL_GRADPAR_D;
    609         return LDAC_E_FAIL;
    610     }
    611 
    612     hData->nbands = nbands;
    613     hData->grad_mode = grad_mode;
    614     hData->grad_qu_l = grad_qu_l;
    615     hData->grad_os_l = grad_os_l;
    616     if (grad_mode == LDAC_MODE_0) {
    617         hData->grad_qu_h = grad_qu_h;
    618         hData->grad_os_h = grad_os_h;
    619     }
    620     else {
    621         hData->grad_qu_h = LDAC_DEFGRADQUH;
    622         hData->grad_os_h = LDAC_DEFGRADOSH;
    623     }
    624     hData->abc_status = abc_status;
    625 
    626     return LDAC_S_OK;
    627 }
    628 
    629 /***************************************************************************************************
    630     Initialize
    631 ***************************************************************************************************/
    632 DECLSPEC LDAC_RESULT ldaclib_init_encode(
    633 HANDLE_LDAC hData)
    634 {
    635     SFINFO *p_sfinfo = &hData->sfinfo;
    636     LDAC_RESULT result;
    637 
    638 
    639     ldaclib_get_nlnn(p_sfinfo->cfg.smplrate_id, &hData->nlnn);
    640 
    641     set_mdct_table_ldac(hData->nlnn);
    642 
    643     result = init_encode_ldac(p_sfinfo);
    644     if (result != LDAC_S_OK) {
    645         hData->error_code = LDAC_ERR_ENC_INIT_ALLOC;
    646         return LDAC_E_FAIL;
    647     }
    648 
    649     return LDAC_S_OK;
    650 }
    651 
    652 /***************************************************************************************************
    653     Free
    654 ***************************************************************************************************/
    655 DECLSPEC LDAC_RESULT ldaclib_free_encode(
    656 HANDLE_LDAC hData)
    657 {
    658     if (hData->sfinfo.p_mempos == NULL) {
    659         free_encode_ldac(&hData->sfinfo);
    660     }
    661 
    662     return LDAC_S_OK;
    663 }
    664 
    665 /***************************************************************************************************
    666     Encode
    667 ***************************************************************************************************/
    668 DECLSPEC LDAC_RESULT ldaclib_encode(
    669 HANDLE_LDAC hData,
    670 char *ap_pcm[],
    671 LDAC_SMPL_FMT_T sample_format,
    672 unsigned char *p_stream,
    673 int *p_nbytes_used)
    674 {
    675     SFINFO *p_sfinfo = &hData->sfinfo;
    676     int loc = 0;
    677     int error_code;
    678     int frame_length;
    679 
    680 
    681     if (!ldaclib_assert_sample_format(sample_format)) {
    682         hData->error_code = LDAC_ERR_ILL_SMPL_FORMAT;
    683         return LDAC_E_FAIL;
    684     }
    685 
    686     frame_length = p_sfinfo->cfg.frame_length;
    687     clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
    688 
    689     set_input_pcm_ldac(p_sfinfo, ap_pcm, sample_format, hData->nlnn);
    690 
    691     proc_mdct_ldac(p_sfinfo, hData->nlnn);
    692 
    693     p_sfinfo->cfg.frame_status = ana_frame_status_ldac(p_sfinfo, hData->nlnn);
    694 
    695     error_code = encode_ldac(p_sfinfo, hData->nbands, hData->grad_mode,
    696             hData->grad_qu_l, hData->grad_qu_h, hData->grad_os_l, hData->grad_os_h,
    697             hData->abc_status);
    698     if (LDAC_ERROR(error_code) && !LDAC_FATAL_ERROR(error_code)) {
    699         int error_code2;
    700         error_code2 = pack_null_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
    701         if (LDAC_FATAL_ERROR(error_code2)) {
    702             clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
    703             hData->error_code = error_code2;
    704             return LDAC_E_FAIL;
    705         }
    706         hData->error_code = error_code;
    707         return LDAC_S_FALSE;
    708     }
    709 
    710     error_code = pack_raw_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
    711     if (LDAC_FATAL_ERROR(error_code)) {
    712         int error_code2;
    713         loc = 0;
    714         clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
    715         error_code2 = pack_null_data_frame_ldac(p_sfinfo, (STREAM *)p_stream, &loc, p_nbytes_used);
    716         if (LDAC_FATAL_ERROR(error_code2)) {
    717             clear_data_ldac(p_stream, frame_length*sizeof(unsigned char));
    718             hData->error_code = error_code2;
    719             return LDAC_E_FAIL;
    720         }
    721         hData->error_code = error_code;
    722         return LDAC_E_FAIL;
    723     }
    724 
    725     return LDAC_S_OK;
    726 }
    727 
    728 /***************************************************************************************************
    729     Flush Encode
    730 ***************************************************************************************************/
    731 DECLSPEC LDAC_RESULT ldaclib_flush_encode(
    732 HANDLE_LDAC hData,
    733 LDAC_SMPL_FMT_T sample_format,
    734 unsigned char *p_stream,
    735 int *p_nbytes_used)
    736 {
    737     LDAC_RESULT result;
    738     int ich;
    739     char *ap_buf[LDAC_PRCNCH];
    740     int a_buf[LDAC_MAXLSU*LDAC_PRCNCH];
    741 
    742     if (!ldaclib_assert_sample_format(sample_format)) {
    743         hData->error_code = LDAC_ERR_ILL_SMPL_FORMAT;
    744         return LDAC_E_FAIL;
    745     }
    746 
    747     clear_data_ldac(a_buf, (LDAC_MAXLSU*LDAC_PRCNCH)*sizeof(int));
    748 
    749     for (ich = 0; ich < LDAC_PRCNCH; ich++) {
    750         ap_buf[ich] = (char *)(a_buf + ich * LDAC_MAXLSU);
    751     }
    752 
    753     result = ldaclib_encode(hData, ap_buf, sample_format, p_stream, p_nbytes_used);
    754 
    755     return result;
    756 }
    757 
    758 
    759 
    760 
    761 /***************************************************************************************************
    762     Error Code Dispatch
    763 ***************************************************************************************************/
    764 
    765 /***************************************************************************************************
    766     Clear Error Code at Handle Level
    767 ***************************************************************************************************/
    768 DECLSPEC LDAC_RESULT ldaclib_clear_error_code(
    769 HANDLE_LDAC hData)
    770 {
    771     hData->error_code = LDAC_ERR_NONE;
    772 
    773     return LDAC_S_OK;
    774 }
    775 
    776 /***************************************************************************************************
    777     Get Error Code at Handle Level
    778 ***************************************************************************************************/
    779 DECLSPEC LDAC_RESULT ldaclib_get_error_code(
    780 HANDLE_LDAC hData,
    781 int *p_error_code)
    782 {
    783     *p_error_code = hData->error_code;
    784 
    785     return LDAC_S_OK;
    786 }
    787 
    788 /***************************************************************************************************
    789     Clear Error Code at Internal Block Level
    790 ***************************************************************************************************/
    791 DECLSPEC LDAC_RESULT ldaclib_clear_internal_error_code(
    792 HANDLE_LDAC hData)
    793 {
    794     hData->sfinfo.error_code = LDAC_ERR_NONE;
    795 
    796     return LDAC_S_OK;
    797 }
    798 
    799 /***************************************************************************************************
    800     Get Error Code at Internal Block Level
    801 ***************************************************************************************************/
    802 DECLSPEC LDAC_RESULT ldaclib_get_internal_error_code(
    803 HANDLE_LDAC hData,
    804 int *p_error_code)
    805 {
    806     *p_error_code = hData->sfinfo.error_code;
    807 
    808     return LDAC_S_OK;
    809 }
    810 
    811