blob: 4c5440747039c641b6881581413f54a0f8a42e26 [file] [log] [blame]
Chisato Kenmochi94704432017-01-10 11:56:48 +09001/*
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***************************************************************************************************/
27static int ldaclib_assert_sampling_rate_index(
28int 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
38static int ldaclib_assert_supported_sampling_rate_index(
39int 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
49static int ldaclib_assert_channel_config_index(
50int 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
61static int ldaclib_assert_channel(
62int 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
72static int ldaclib_assert_frame_length(
73int 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
83static int ldaclib_assert_supported_frame_length(
84int frame_length,
85int 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
108static int ldaclib_assert_frame_status(
109int 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
119static int ldaclib_assert_nlnn_shift(
120int 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
130static int ldaclib_assert_sample_format(
131LDAC_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***************************************************************************************************/
153DECLSPEC int ldaclib_get_version(void) {
154 return (LDACLIB_MAJOR_VERSION<<16) | (LDACLIB_MINOR_VERSION<<8) | LDACLIB_BRANCH_VERSION;
155}
156
157DECLSPEC int ldaclib_get_major_version(void) {
158 return LDACLIB_MAJOR_VERSION;
159}
160
161DECLSPEC int ldaclib_get_minor_version(void) {
162 return LDACLIB_MINOR_VERSION;
163}
164
165DECLSPEC int ldaclib_get_branch_version(void) {
166 return LDACLIB_BRANCH_VERSION;
167}
168
169/***************************************************************************************************
170 Get Basic Parameters
171***************************************************************************************************/
172DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate_index(
173int smplrate,
174int *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
195DECLSPEC LDAC_RESULT ldaclib_get_sampling_rate(
196int smplrate_id,
197int *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
211DECLSPEC LDAC_RESULT ldaclib_get_frame_samples(
212int smplrate_id,
213int *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
227DECLSPEC LDAC_RESULT ldaclib_get_nlnn(
228int smplrate_id,
229int *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
243DECLSPEC LDAC_RESULT ldaclib_get_channel(
244int chconfig_id,
245int *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
256DECLSPEC LDAC_RESULT ldaclib_get_channel_config_index(
257int ch,
258int *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
269DECLSPEC LDAC_RESULT ldaclib_check_nlnn_shift(
270int smplrate_id,
271int 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***************************************************************************************************/
293DECLSPEC HANDLE_LDAC ldaclib_get_handle(
294void)
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***************************************************************************************************/
311DECLSPEC LDAC_RESULT ldaclib_free_handle(
312HANDLE_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***************************************************************************************************/
328DECLSPEC LDAC_RESULT ldaclib_set_config_info(
329HANDLE_LDAC hData,
330int smplrate_id,
331int chconfig_id,
332int frame_length,
333int 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***************************************************************************************************/
380DECLSPEC LDAC_RESULT ldaclib_get_config_info(
381HANDLE_LDAC hData,
382int *p_smplrate_id,
383int *p_chconfig_id,
384int *p_frame_length,
385int *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***************************************************************************************************/
401DECLSPEC LDAC_RESULT ldaclib_set_frame_header(
402HANDLE_LDAC hData,
403unsigned char *p_stream,
404int smplrate_id,
405int chconfig_id,
406int frame_length,
407int 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
456static 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},
Chisato Kenmochi878aad22017-02-28 13:55:31 +0900459#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
Chisato Kenmochi94704432017-01-10 11:56:48 +0900473 {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},
Chisato Kenmochi878aad22017-02-28 13:55:31 +0900485#endif
Chisato Kenmochi94704432017-01-10 11:56:48 +0900486 {0, 22, 2, 3, 4, 26, 16, 31, 0},
487};
488
489DECLSPEC LDAC_RESULT ldaclib_get_encode_setting(
490int nbytes_ch,
491int smplrate_id,
492int *p_nbands,
493int *p_grad_mode,
494int *p_grad_qu_l,
495int *p_grad_qu_h,
496int *p_grad_os_l,
497int *p_grad_os_h,
498int *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***************************************************************************************************/
523DECLSPEC LDAC_RESULT ldaclib_set_encode_frame_length(
524HANDLE_LDAC hData,
525int 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***************************************************************************************************/
549DECLSPEC LDAC_RESULT ldaclib_get_encode_frame_length(
550HANDLE_LDAC hData,
551int *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***************************************************************************************************/
563DECLSPEC LDAC_RESULT ldaclib_set_encode_info(
564HANDLE_LDAC hData,
565int nbands,
566int grad_mode,
567int grad_qu_l,
568int grad_qu_h,
569int grad_os_l,
570int grad_os_h,
571int 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***************************************************************************************************/
632DECLSPEC LDAC_RESULT ldaclib_init_encode(
633HANDLE_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***************************************************************************************************/
655DECLSPEC LDAC_RESULT ldaclib_free_encode(
656HANDLE_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***************************************************************************************************/
668DECLSPEC LDAC_RESULT ldaclib_encode(
669HANDLE_LDAC hData,
670char *ap_pcm[],
671LDAC_SMPL_FMT_T sample_format,
672unsigned char *p_stream,
673int *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***************************************************************************************************/
731DECLSPEC LDAC_RESULT ldaclib_flush_encode(
732HANDLE_LDAC hData,
733LDAC_SMPL_FMT_T sample_format,
734unsigned char *p_stream,
735int *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***************************************************************************************************/
768DECLSPEC LDAC_RESULT ldaclib_clear_error_code(
769HANDLE_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***************************************************************************************************/
779DECLSPEC LDAC_RESULT ldaclib_get_error_code(
780HANDLE_LDAC hData,
781int *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***************************************************************************************************/
791DECLSPEC LDAC_RESULT ldaclib_clear_internal_error_code(
792HANDLE_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***************************************************************************************************/
802DECLSPEC LDAC_RESULT ldaclib_get_internal_error_code(
803HANDLE_LDAC hData,
804int *p_error_code)
805{
806 *p_error_code = hData->sfinfo.error_code;
807
808 return LDAC_S_OK;
809}
810