Mercurial > audlegacy-plugins
comparison src/aac/libfaad2/decoder.c @ 691:e6c5fdae6e88 trunk
[svn] - oh yes, commit mplayer patches as well
author | nenolod |
---|---|
date | Tue, 20 Feb 2007 06:38:03 -0800 |
parents | 1d8b08df98c3 |
children | f1b6f1b2cdb3 |
comparison
equal
deleted
inserted
replaced
690:0305b3165a01 | 691:e6c5fdae6e88 |
---|---|
1 /* | 1 /* |
2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding | 2 ** FAAD2 - Freeware Advanced Audio (AAC) Decoder including SBR decoding |
3 ** Copyright (C) 2003-2005 M. Bakker, Nero AG, http://www.nero.com | 3 ** Copyright (C) 2003-2004 M. Bakker, Ahead Software AG, http://www.nero.com |
4 ** | 4 ** |
5 ** This program is free software; you can redistribute it and/or modify | 5 ** This program is free software; you can redistribute it and/or modify |
6 ** it under the terms of the GNU General Public License as published by | 6 ** it under the terms of the GNU General Public License as published by |
7 ** the Free Software Foundation; either version 2 of the License, or | 7 ** the Free Software Foundation; either version 2 of the License, or |
8 ** (at your option) any later version. | 8 ** (at your option) any later version. |
9 ** | 9 ** |
10 ** This program is distributed in the hope that it will be useful, | 10 ** This program is distributed in the hope that it will be useful, |
11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of | 11 ** but WITHOUT ANY WARRANTY; without even the implied warranty of |
12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | 12 ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
13 ** GNU General Public License for more details. | 13 ** GNU General Public License for more details. |
14 ** | 14 ** |
15 ** You should have received a copy of the GNU General Public License | 15 ** You should have received a copy of the GNU General Public License |
16 ** along with this program; if not, write to the Free Software | 16 ** along with this program; if not, write to the Free Software |
17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | 17 ** Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. |
18 ** | 18 ** |
19 ** Any non-GPL usage of this software or parts of this software is strictly | 19 ** Any non-GPL usage of this software or parts of this software is strictly |
20 ** forbidden. | 20 ** forbidden. |
21 ** | 21 ** |
22 ** Software using this code must display the following message visibly in or | 22 ** Commercial non-GPL licensing of this software is possible. |
23 ** on each copy of the software: | 23 ** For more info contact Ahead Software through Mpeg4AAClicense@nero.com. |
24 ** "FAAD2 AAC/HE-AAC/HE-AACv2/DRM decoder (c) Nero AG, www.nero.com" | |
25 ** in, for example, the about-box or help/startup screen. | |
26 ** | 24 ** |
27 ** Commercial non-GPL licensing of this software is possible. | 25 ** $Id: decoder.c,v 1.107 2004/09/08 09:43:11 gcp Exp $ |
28 ** For more info contact Nero AG through Mpeg4AAClicense@nero.com. | |
29 ** | |
30 ** $Id: decoder.c,v 1.109 2006/05/07 18:09:00 menno Exp $ | |
31 **/ | 26 **/ |
32 | 27 |
33 #include "common.h" | 28 #include "common.h" |
34 #include "structs.h" | 29 #include "structs.h" |
35 | 30 |
119 hDecoder->frameLength = 1024; | 114 hDecoder->frameLength = 1024; |
120 | 115 |
121 hDecoder->frame = 0; | 116 hDecoder->frame = 0; |
122 hDecoder->sample_buffer = NULL; | 117 hDecoder->sample_buffer = NULL; |
123 | 118 |
124 hDecoder->__r1 = 1; | |
125 hDecoder->__r2 = 1; | |
126 | |
127 for (i = 0; i < MAX_CHANNELS; i++) | 119 for (i = 0; i < MAX_CHANNELS; i++) |
128 { | 120 { |
129 hDecoder->window_shape_prev[i] = 0; | 121 hDecoder->window_shape_prev[i] = 0; |
130 hDecoder->time_out[i] = NULL; | 122 hDecoder->time_out[i] = NULL; |
131 hDecoder->fb_intermed[i] = NULL; | 123 hDecoder->fb_intermed[i] = NULL; |
200 } | 192 } |
201 | 193 |
202 return 0; | 194 return 0; |
203 } | 195 } |
204 | 196 |
205 | |
206 int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, | 197 int32_t NEAACDECAPI NeAACDecInit(NeAACDecHandle hDecoder, uint8_t *buffer, |
207 uint32_t buffer_size, | 198 uint32_t buffer_size, |
208 uint32_t *samplerate, uint8_t *channels) | 199 uint32_t *samplerate, uint8_t *channels) |
209 { | 200 { |
210 uint32_t bits = 0; | 201 uint32_t bits = 0; |
211 bitfile ld; | 202 bitfile ld; |
212 adif_header adif; | 203 adif_header adif; |
213 adts_header adts; | 204 adts_header adts; |
214 | 205 |
215 | |
216 if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) | 206 if ((hDecoder == NULL) || (samplerate == NULL) || (channels == NULL)) |
217 return -1; | 207 return -1; |
218 | 208 |
219 hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); | 209 hDecoder->sf_index = get_sr_index(hDecoder->config.defSampleRate); |
220 hDecoder->object_type = hDecoder->config.defObjectType; | 210 hDecoder->object_type = hDecoder->config.defObjectType; |
265 faad_endbits(&ld); | 255 faad_endbits(&ld); |
266 return -1; | 256 return -1; |
267 } | 257 } |
268 faad_endbits(&ld); | 258 faad_endbits(&ld); |
269 } | 259 } |
260 hDecoder->channelConfiguration = *channels; | |
270 | 261 |
271 #if (defined(PS_DEC) || defined(DRM_PS)) | 262 #if (defined(PS_DEC) || defined(DRM_PS)) |
272 /* check if we have a mono file */ | 263 /* check if we have a mono file */ |
273 if (*channels == 1) | 264 if (*channels == 1) |
274 { | 265 { |
275 /* upMatrix to 2 channels for implicit signalling of PS */ | 266 /* upMatrix to 2 channels for implicit signalling of PS */ |
276 *channels = 2; | 267 *channels = 2; |
277 } | 268 } |
278 #endif | 269 #endif |
279 | |
280 hDecoder->channelConfiguration = *channels; | |
281 | 270 |
282 #ifdef SBR_DEC | 271 #ifdef SBR_DEC |
283 /* implicit signalling */ | 272 /* implicit signalling */ |
284 if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) | 273 if (*samplerate <= 24000 && !(hDecoder->config.dontUpSampleImplicitSBR)) |
285 { | 274 { |
431 | 420 |
432 #ifdef SBR_DEC | 421 #ifdef SBR_DEC |
433 if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) | 422 if ((channels == DRMCH_MONO) || (channels == DRMCH_STEREO)) |
434 (*hDecoder)->sbr_present_flag = 0; | 423 (*hDecoder)->sbr_present_flag = 0; |
435 else | 424 else |
436 (*hDecoder)->sbr_present_flag = 1; | 425 (*hDecoder)->sbr_present_flag = 1; |
437 #endif | 426 #endif |
438 | 427 |
439 (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); | 428 (*hDecoder)->fb = filter_bank_init((*hDecoder)->frameLength); |
440 | 429 |
441 return 0; | 430 return 0; |
442 } | 431 } |
534 hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; | 523 hInfo->num_lfe_channels = hDecoder->pce.num_lfe_channels; |
535 | 524 |
536 chdir = hInfo->num_front_channels; | 525 chdir = hInfo->num_front_channels; |
537 if (chdir & 1) | 526 if (chdir & 1) |
538 { | 527 { |
539 #if (defined(PS_DEC) || defined(DRM_PS)) | 528 hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; |
540 /* When PS is enabled output is always stereo */ | 529 chdir--; |
530 } | |
531 for (i = 0; i < chdir; i += 2) | |
532 { | |
541 hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; | 533 hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; |
542 hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; | 534 hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; |
543 #else | |
544 hInfo->channel_position[chpos++] = FRONT_CHANNEL_CENTER; | |
545 chdir--; | |
546 #endif | |
547 } | |
548 for (i = 0; i < chdir; i += 2) | |
549 { | |
550 hInfo->channel_position[chpos++] = FRONT_CHANNEL_LEFT; | |
551 hInfo->channel_position[chpos++] = FRONT_CHANNEL_RIGHT; | |
552 } | 535 } |
553 | 536 |
554 for (i = 0; i < hInfo->num_side_channels; i += 2) | 537 for (i = 0; i < hInfo->num_side_channels; i += 2) |
555 { | 538 { |
556 hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; | 539 hInfo->channel_position[chpos++] = SIDE_CHANNEL_LEFT; |
580 | 563 |
581 } else { | 564 } else { |
582 switch (hDecoder->channelConfiguration) | 565 switch (hDecoder->channelConfiguration) |
583 { | 566 { |
584 case 1: | 567 case 1: |
585 #if (defined(PS_DEC) || defined(DRM_PS)) | |
586 /* When PS is enabled output is always stereo */ | |
587 hInfo->num_front_channels = 2; | |
588 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | |
589 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | |
590 #else | |
591 hInfo->num_front_channels = 1; | 568 hInfo->num_front_channels = 1; |
592 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; | 569 hInfo->channel_position[0] = FRONT_CHANNEL_CENTER; |
593 #endif | |
594 break; | 570 break; |
595 case 2: | 571 case 2: |
596 hInfo->num_front_channels = 2; | 572 hInfo->num_front_channels = 2; |
597 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; | 573 hInfo->channel_position[0] = FRONT_CHANNEL_LEFT; |
598 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; | 574 hInfo->channel_position[1] = FRONT_CHANNEL_RIGHT; |
744 | 720 |
745 return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, | 721 return aac_frame_decode(hDecoder, hInfo, buffer, buffer_size, |
746 sample_buffer, sample_buffer_size); | 722 sample_buffer, sample_buffer_size); |
747 } | 723 } |
748 | 724 |
749 #ifdef DRM | |
750 | |
751 #define ERROR_STATE_INIT 6 | |
752 | |
753 static void conceal_output(NeAACDecHandle hDecoder, uint16_t frame_len, | |
754 uint8_t out_ch, void *sample_buffer) | |
755 { | |
756 return; | |
757 } | |
758 #endif | |
759 | |
760 static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, | 725 static void* aac_frame_decode(NeAACDecHandle hDecoder, NeAACDecFrameInfo *hInfo, |
761 uint8_t *buffer, uint32_t buffer_size, | 726 uint8_t *buffer, uint32_t buffer_size, |
762 void **sample_buffer2, uint32_t sample_buffer_size) | 727 void **sample_buffer2, uint32_t sample_buffer_size) |
763 { | 728 { |
764 uint16_t i; | |
765 uint8_t channels = 0; | 729 uint8_t channels = 0; |
766 uint8_t output_channels = 0; | 730 uint8_t output_channels = 0; |
767 bitfile ld = {0}; | 731 bitfile ld; |
768 uint32_t bitsconsumed; | 732 uint32_t bitsconsumed; |
769 uint16_t frame_len; | 733 uint16_t frame_len; |
770 void *sample_buffer; | 734 void *sample_buffer; |
771 | 735 |
772 #ifdef PROFILE | 736 #ifdef PROFILE |
786 frame_len = hDecoder->frameLength; | 750 frame_len = hDecoder->frameLength; |
787 | 751 |
788 | 752 |
789 memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); | 753 memset(hInfo, 0, sizeof(NeAACDecFrameInfo)); |
790 memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); | 754 memset(hDecoder->internal_channel, 0, MAX_CHANNELS*sizeof(hDecoder->internal_channel[0])); |
791 | |
792 #ifdef USE_TIME_LIMIT | |
793 if ((TIME_LIMIT * get_sample_rate(hDecoder->sf_index)) > hDecoder->TL_count) | |
794 { | |
795 hDecoder->TL_count += 1024; | |
796 } else { | |
797 hInfo->error = (NUM_ERROR_MESSAGES-1); | |
798 goto error; | |
799 } | |
800 #endif | |
801 | |
802 | |
803 /* check for some common metadata tag types in the bitstream | |
804 * No need to return an error | |
805 */ | |
806 /* ID3 */ | |
807 if (buffer_size >= 128) | |
808 { | |
809 if (memcmp(buffer, "TAG", 3) == 0) | |
810 { | |
811 /* found it */ | |
812 hInfo->bytesconsumed = 128; /* 128 bytes fixed size */ | |
813 /* no error, but no output either */ | |
814 return NULL; | |
815 } | |
816 } | |
817 | |
818 | 755 |
819 /* initialize the bitstream */ | 756 /* initialize the bitstream */ |
820 faad_initbits(&ld, buffer, buffer_size); | 757 faad_initbits(&ld, buffer, buffer_size); |
821 | 758 |
822 #if 0 | 759 #if 0 |
841 if (hDecoder->object_type == DRM_ER_LC) | 778 if (hDecoder->object_type == DRM_ER_LC) |
842 { | 779 { |
843 /* We do not support stereo right now */ | 780 /* We do not support stereo right now */ |
844 if (0) //(hDecoder->channelConfiguration == 2) | 781 if (0) //(hDecoder->channelConfiguration == 2) |
845 { | 782 { |
846 hInfo->error = 28; // Throw CRC error | 783 hInfo->error = 8; // Throw CRC error |
847 goto error; | 784 goto error; |
848 } | 785 } |
849 | 786 |
850 faad_getbits(&ld, 8 | 787 faad_getbits(&ld, 8 |
851 DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); | 788 DEBUGVAR(1,1,"NeAACDecDecode(): skip CRC")); |
869 #ifdef ANALYSIS | 806 #ifdef ANALYSIS |
870 dbg_count = 0; | 807 dbg_count = 0; |
871 #endif | 808 #endif |
872 | 809 |
873 /* decode the complete bitstream */ | 810 /* decode the complete bitstream */ |
874 #ifdef DRM | 811 #ifdef SCALABLE_DEC |
875 if (/*(hDecoder->object_type == 6) ||*/ (hDecoder->object_type == DRM_ER_LC)) | 812 if ((hDecoder->object_type == 6) || (hDecoder->object_type == DRM_ER_LC)) |
876 { | 813 { |
877 DRM_aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | 814 aac_scalable_main_element(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); |
878 } else { | 815 } else { |
879 #endif | 816 #endif |
880 raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); | 817 raw_data_block(hDecoder, hInfo, &ld, &hDecoder->pce, hDecoder->drc); |
881 #ifdef DRM | 818 #ifdef SCALABLE_DEC |
882 } | 819 } |
883 #endif | 820 #endif |
884 | 821 |
885 channels = hDecoder->fr_channels; | 822 channels = hDecoder->fr_channels; |
886 | 823 |
1039 hInfo->sbr = SBR_DOWNSAMPLED; | 976 hInfo->sbr = SBR_DOWNSAMPLED; |
1040 } | 977 } |
1041 } | 978 } |
1042 #endif | 979 #endif |
1043 | 980 |
1044 | |
1045 sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, | 981 sample_buffer = output_to_PCM(hDecoder, hDecoder->time_out, sample_buffer, |
1046 output_channels, frame_len, hDecoder->config.outputFormat); | 982 output_channels, frame_len, hDecoder->config.outputFormat); |
1047 | |
1048 | |
1049 #ifdef DRM | |
1050 //conceal_output(hDecoder, frame_len, output_channels, sample_buffer); | |
1051 #endif | |
1052 | 983 |
1053 | 984 |
1054 hDecoder->postSeekResetFlag = 0; | 985 hDecoder->postSeekResetFlag = 0; |
1055 | 986 |
1056 hDecoder->frame++; | 987 hDecoder->frame++; |
1080 | 1011 |
1081 return sample_buffer; | 1012 return sample_buffer; |
1082 | 1013 |
1083 error: | 1014 error: |
1084 | 1015 |
1085 | |
1086 #ifdef DRM | |
1087 hDecoder->error_state = ERROR_STATE_INIT; | |
1088 #endif | |
1089 | |
1090 /* reset filterbank state */ | |
1091 for (i = 0; i < MAX_CHANNELS; i++) | |
1092 { | |
1093 if (hDecoder->fb_intermed[i] != NULL) | |
1094 { | |
1095 memset(hDecoder->fb_intermed[i], 0, hDecoder->frameLength*sizeof(real_t)); | |
1096 } | |
1097 } | |
1098 #ifdef SBR_DEC | |
1099 for (i = 0; i < MAX_SYNTAX_ELEMENTS; i++) | |
1100 { | |
1101 if (hDecoder->sbr[i] != NULL) | |
1102 { | |
1103 sbrReset(hDecoder->sbr[i]); | |
1104 } | |
1105 } | |
1106 #endif | |
1107 | |
1108 | |
1109 faad_endbits(&ld); | 1016 faad_endbits(&ld); |
1110 | 1017 |
1111 /* cleanup */ | 1018 /* cleanup */ |
1112 #ifdef ANALYSIS | 1019 #ifdef ANALYSIS |
1113 fflush(stdout); | 1020 fflush(stdout); |