annotate libmpcodecs/ad_faad.c @ 31904:f8af1068e397

100l, re-add vobsub_get_id_by_index call accidentally removed in r31678. Patch by ubitux [ubitux gmail com].
author reimar
date Fri, 20 Aug 2010 15:48:09 +0000
parents 8e5ba4ae7c36
children 9986a61354e6
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
28106
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
1 /*
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
2 * MPlayer AAC decoder using libfaad2
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
3 *
28110
fc04fa771074 license header consistency cosmetics
diego
parents: 28106
diff changeset
4 * Copyright (C) 2002 Felix Buenemann <atmosfear at users.sourceforge.net>
28106
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
5 *
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
6 * This file is part of MPlayer.
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
7 *
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
8 * MPlayer is free software; you can redistribute it and/or modify
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
9 * it under the terms of the GNU General Public License as published by
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
10 * the Free Software Foundation; either version 2 of the License, or
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
11 * (at your option) any later version.
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
12 *
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
13 * MPlayer is distributed in the hope that it will be useful,
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
16 * GNU General Public License for more details.
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
17 *
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
18 * You should have received a copy of the GNU General Public License along
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
19 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
4932a522100e Replace informal GPL notes by standard GPL header.
diego
parents: 27341
diff changeset
20 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
21 */
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
22
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
23 #include <stdio.h>
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
24 #include <stdlib.h>
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
25 #include <unistd.h>
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
26
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
27 #include "config.h"
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
28 #include "ad_internal.h"
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
29 #include "libaf/reorder_ch.h"
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
30
30504
cc27da5d7286 Mark all ad_info_t/vd_info_t structure declarations as const.
diego
parents: 29826
diff changeset
31 static const ad_info_t info =
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
32 {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
33 "AAC (MPEG2/4 Advanced Audio Coding)",
7174
7672615cc811 sync driver names with codec-cfg
arpi
parents: 6894
diff changeset
34 "faad",
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
35 "Felix Buenemann",
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
36 "faad2",
7191
1eadce15446c -afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents: 7180
diff changeset
37 "uses libfaad2"
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
38 };
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
39
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
40 LIBAD_EXTERN(faad)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
41
27341
e7c989f7a7c9 Start unifying names of internal preprocessor directives.
diego
parents: 25638
diff changeset
42 #ifndef CONFIG_FAAD_INTERNAL
10921
3eda9985bc7d 10l really disable faad if gcc is broken
faust3
parents: 10726
diff changeset
43 #include <faad.h>
3eda9985bc7d 10l really disable faad if gcc is broken
faust3
parents: 10726
diff changeset
44 #else
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16337
diff changeset
45 #include "libfaad2/faad.h"
10921
3eda9985bc7d 10l really disable faad if gcc is broken
faust3
parents: 10726
diff changeset
46 #endif
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
47
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
48 /* configure maximum supported channels, *
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
49 * this is theoretically max. 64 chans */
29826
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29263
diff changeset
50 #define FAAD_MAX_CHANNELS 8
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
51 #define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS)
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
52
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
53 //#define AAC_DUMP_COMPRESSED
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
54
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
55 static faacDecHandle faac_hdec;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
56 static faacDecFrameInfo faac_finfo;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
57
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
58 static int preinit(sh_audio_t *sh)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
59 {
12095
cef97e8c85c0 Support for HE-AAC. Patch by Loren Merritt <lorenm at u dot washington anotherdot edu>.
mosu
parents: 10921
diff changeset
60 sh->audio_out_minsize=8192*FAAD_MAX_CHANNELS;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
61 sh->audio_in_minsize=FAAD_BUFFLEN;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
62 return 1;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
63 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
64
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
65 static int aac_probe(unsigned char *buffer, int len)
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
66 {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
67 int i = 0, pos = 0;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
68 mp_msg(MSGT_DECAUDIO,MSGL_V, "\nAAC_PROBE: %d bytes\n", len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
69 while(i <= len-4) {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
70 if(
15708
bdb826438aa8 fixed wrong binary mask: it precluded the syncword of adts-4 from being recognized as valid
nicodvb
parents: 15019
diff changeset
71 ((buffer[i] == 0xff) && ((buffer[i+1] & 0xf6) == 0xf0)) ||
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
72 (buffer[i] == 'A' && buffer[i+1] == 'D' && buffer[i+2] == 'I' && buffer[i+3] == 'F')
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
73 ) {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
74 pos = i;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
75 break;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
76 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
77 mp_msg(MSGT_DECAUDIO,MSGL_V, "AUDIO PAYLOAD: %x %x %x %x\n", buffer[i], buffer[i+1], buffer[i+2], buffer[i+3]);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
78 i++;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
79 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
80 mp_msg(MSGT_DECAUDIO,MSGL_V, "\nAAC_PROBE: ret %d\n", pos);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
81 return pos;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
82 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
83
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
84 static int init(sh_audio_t *sh)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
85 {
7648
7ee8239bfcc0 I think libfaad2 changed recently. The functions faacDecInit() and
arpi
parents: 7191
diff changeset
86 unsigned long faac_samplerate;
7ee8239bfcc0 I think libfaad2 changed recently. The functions faacDecInit() and
arpi
parents: 7191
diff changeset
87 unsigned char faac_channels;
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
88 int faac_init, pos = 0;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
89 faac_hdec = faacDecOpen();
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
90
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
91 // If we don't get the ES descriptor, try manual config
12473
6f11d107f7b8 If demuxer does not fill codecdata try to get if from waveformatex
rtognimp
parents: 12095
diff changeset
92 if(!sh->codecdata_len && sh->wf) {
6f11d107f7b8 If demuxer does not fill codecdata try to get if from waveformatex
rtognimp
parents: 12095
diff changeset
93 sh->codecdata_len = sh->wf->cbSize;
25638
a4c3eb7ef547 Use malloc for codecdata. Fixes segfault in free_sh_sub.
eugeni
parents: 25315
diff changeset
94 sh->codecdata = malloc(sh->codecdata_len);
a4c3eb7ef547 Use malloc for codecdata. Fixes segfault in free_sh_sub.
eugeni
parents: 25315
diff changeset
95 memcpy(sh->codecdata, sh->wf+1, sh->codecdata_len);
12473
6f11d107f7b8 If demuxer does not fill codecdata try to get if from waveformatex
rtognimp
parents: 12095
diff changeset
96 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: codecdata extracted from WAVEFORMATEX\n");
6f11d107f7b8 If demuxer does not fill codecdata try to get if from waveformatex
rtognimp
parents: 12095
diff changeset
97 }
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
98 if(!sh->codecdata_len) {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
99 faacDecConfigurationPtr faac_conf;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
100 /* Set the default object type and samplerate */
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
101 /* This is useful for RAW AAC files */
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
102 faac_conf = faacDecGetCurrentConfiguration(faac_hdec);
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
103 if(sh->samplerate)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
104 faac_conf->defSampleRate = sh->samplerate;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
105 /* XXX: FAAD support FLOAT output, how do we handle
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
106 * that (FAAD_FMT_FLOAT)? ::atmos
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
107 */
15019
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
108 if (audio_output_channels <= 2) faac_conf->downMatrix = 1;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
109 switch(sh->samplesize){
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
110 case 1: // 8Bit
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
111 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: 8Bit samplesize not supported by FAAD, assuming 16Bit!\n");
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
112 default:
13427
9d0b052c4f74 setting samplesize to 2 in decoders where neccessary.
reimar
parents: 13307
diff changeset
113 sh->samplesize=2;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
114 case 2: // 16Bit
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
115 faac_conf->outputFormat = FAAD_FMT_16BIT;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
116 break;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
117 case 3: // 24Bit
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
118 faac_conf->outputFormat = FAAD_FMT_24BIT;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
119 break;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
120 case 4: // 32Bit
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
121 faac_conf->outputFormat = FAAD_FMT_32BIT;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
122 break;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
123 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
124 //faac_conf->defObjectType = LTP; // => MAIN, LC, SSR, LTP available.
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
125
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
126 faacDecSetConfiguration(faac_hdec, faac_conf);
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
127
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
128 sh->a_in_buffer_len = demux_read_data(sh->ds, sh->a_in_buffer, sh->a_in_buffer_size);
31537
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
129 #if CONFIG_FAAD_INTERNAL
31477
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
130 /* init the codec, look for LATM */
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
131 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer,
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
132 sh->a_in_buffer_len, &faac_samplerate, &faac_channels,1);
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
133 if (faac_init < 0 && sh->a_in_buffer_len >= 3 && sh->format == mmioFOURCC('M', 'P', '4', 'L')) {
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
134 // working LATM not found at first try, look further on in stream
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
135 int i;
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
136
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
137 for (i = 0; i < 5; i++) {
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
138 pos = sh->a_in_buffer_len-3;
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
139 memmove(sh->a_in_buffer, &(sh->a_in_buffer[pos]), 3);
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
140 sh->a_in_buffer_len = 3;
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
141 sh->a_in_buffer_len += demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len],
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
142 sh->a_in_buffer_size - sh->a_in_buffer_len);
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
143 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer,
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
144 sh->a_in_buffer_len, &faac_samplerate, &faac_channels,1);
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
145 if (faac_init >= 0) break;
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
146 }
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
147 }
31537
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
148 #else
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
149 /* external faad does not have latm lookup support */
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
150 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer,
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
151 sh->a_in_buffer_len, &faac_samplerate, &faac_channels);
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
152 #endif
31477
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
153
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
154 if (faac_init < 0) {
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
155 pos = aac_probe(sh->a_in_buffer, sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
156 if(pos) {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
157 sh->a_in_buffer_len -= pos;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
158 memmove(sh->a_in_buffer, &(sh->a_in_buffer[pos]), sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
159 sh->a_in_buffer_len +=
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
160 demux_read_data(sh->ds,&(sh->a_in_buffer[sh->a_in_buffer_len]),
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
161 sh->a_in_buffer_size - sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
162 pos = 0;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
163 }
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
164
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
165 /* init the codec */
31537
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
166 #if CONFIG_FAAD_INTERNAL
9321
6fa743f3094b libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents: 7648
diff changeset
167 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer,
31477
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
168 sh->a_in_buffer_len, &faac_samplerate, &faac_channels,0);
31537
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
169 #else
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
170 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer,
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
171 sh->a_in_buffer_len, &faac_samplerate, &faac_channels);
8e5ba4ae7c36 * fix compilation using external libfaad
attila
parents: 31477
diff changeset
172 #endif
31477
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
173 }
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
174
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
175 sh->a_in_buffer_len -= (faac_init > 0)?faac_init:0; // how many bytes init consumed
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
176 // XXX FIXME: shouldn't we memcpy() here in a_in_buffer ?? --A'rpi
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
177
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
178 } else { // We have ES DS in codecdata
15019
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
179 faacDecConfigurationPtr faac_conf = faacDecGetCurrentConfiguration(faac_hdec);
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
180 if (audio_output_channels <= 2) {
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
181 faac_conf->downMatrix = 1;
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
182 faacDecSetConfiguration(faac_hdec, faac_conf);
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
183 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
184
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
185 /*int i;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
186 for(i = 0; i < sh_audio->codecdata_len; i++)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
187 printf("codecdata_dump %d: 0x%02X\n", i, sh_audio->codecdata[i]);*/
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
188
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
189 faac_init = faacDecInit2(faac_hdec, sh->codecdata,
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
190 sh->codecdata_len, &faac_samplerate, &faac_channels);
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
191 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
192 if(faac_init < 0) {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
193 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to initialize the decoder!\n"); // XXX: deal with cleanup!
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
194 faacDecClose(faac_hdec);
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
195 // XXX: free a_in_buffer here or in uninit?
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
196 return 0;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
197 } else {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
198 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug!
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17012
diff changeset
199 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %ldHz channels: %d\n", faac_samplerate, faac_channels);
29826
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29263
diff changeset
200 // 8 channels is aac channel order #7.
4eae69f3f4f4 Add support for 8 channel audio.
tack
parents: 29263
diff changeset
201 sh->channels = faac_channels == 7 ? 8 : faac_channels;
15019
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
202 if (audio_output_channels <= 2) sh->channels = faac_channels > 1 ? 2 : 1;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
203 sh->samplerate = faac_samplerate;
13427
9d0b052c4f74 setting samplesize to 2 in decoders where neccessary.
reimar
parents: 13307
diff changeset
204 sh->samplesize=2;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
205 //sh->o_bps = sh->samplesize*faac_channels*faac_samplerate;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
206 if(!sh->i_bps) {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
207 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: compressed input bitrate missing, assuming 128kbit/s!\n");
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
208 sh->i_bps = 128*1000/8; // XXX: HACK!!! ::atmos
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
209 } else
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
210 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: got %dkbit/s bitrate from MP4 header!\n",sh->i_bps*8/1000);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
211 }
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
212 return 1;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
213 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
214
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
215 static void uninit(sh_audio_t *sh)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
216 {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
217 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Closing decoder!\n");
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
218 faacDecClose(faac_hdec);
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
219 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
220
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
221 static int aac_sync(sh_audio_t *sh)
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
222 {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
223 int pos = 0;
31477
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
224 // do not probe LATM, faad does that
86888a4c406e Improve LATM recognition.
cehoyos
parents: 30566
diff changeset
225 if(!sh->codecdata_len && sh->format != mmioFOURCC('M', 'P', '4', 'L')) {
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
226 if(sh->a_in_buffer_len < sh->a_in_buffer_size){
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
227 sh->a_in_buffer_len +=
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
228 demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len],
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
229 sh->a_in_buffer_size - sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
230 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
231 pos = aac_probe(sh->a_in_buffer, sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
232 if(pos) {
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
233 sh->a_in_buffer_len -= pos;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
234 memmove(sh->a_in_buffer, &(sh->a_in_buffer[pos]), sh->a_in_buffer_len);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
235 mp_msg(MSGT_DECAUDIO,MSGL_V, "\nAAC SYNC AFTER %d bytes\n", pos);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
236 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
237 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
238 return pos;
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
239 }
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
240
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
241 static int control(sh_audio_t *sh,int cmd,void* arg, ...)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
242 {
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
243 switch(cmd)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
244 {
14564
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
245 case ADCTRL_RESYNC_STREAM:
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
246 aac_sync(sh);
f85875877de9 tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents: 13427
diff changeset
247 return CONTROL_TRUE;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
248 #if 0
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
249 case ADCTRL_SKIP_FRAME:
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
250 return CONTROL_TRUE;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
251 #endif
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
252 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
253 return CONTROL_UNKNOWN;
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
254 }
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
255
16337
7252d024193b * really keep track on how many samples were decoded last round (fix 10l)
attila
parents: 16336
diff changeset
256 #define MAX_FAAD_ERRORS 10
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
257 static int decode_audio(sh_audio_t *sh,unsigned char *buf,int minlen,int maxlen)
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
258 {
24120
dac788e0857d Fix unused variable warning.
diego
parents: 23918
diff changeset
259 int len = 0, last_dec_len = 1, errors = 0;
dac788e0857d Fix unused variable warning.
diego
parents: 23918
diff changeset
260 // int j = 0;
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
261 void *faac_sample_buffer;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
262
16337
7252d024193b * really keep track on how many samples were decoded last round (fix 10l)
attila
parents: 16336
diff changeset
263 while(len < minlen && last_dec_len > 0 && errors < MAX_FAAD_ERRORS) {
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
264
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
265 /* update buffer for raw aac streams: */
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
266 if(!sh->codecdata_len)
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
267 if(sh->a_in_buffer_len < sh->a_in_buffer_size){
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
268 sh->a_in_buffer_len +=
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
269 demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len],
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
270 sh->a_in_buffer_size - sh->a_in_buffer_len);
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
271 }
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
272
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
273 #ifdef DUMP_AAC_COMPRESSED
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
274 {int i;
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
275 for (i = 0; i < 16; i++)
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
276 printf ("%02X ", sh->a_in_buffer[i]);
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
277 printf ("\n");}
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
278 #endif
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
279
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
280 if(!sh->codecdata_len){
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
281 // raw aac stream:
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
282 do {
18644
82263a36cfa4 fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents: 18242
diff changeset
283 faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, sh->a_in_buffer, sh->a_in_buffer_len);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
284
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
285 /* update buffer index after faacDecDecode */
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
286 if(faac_finfo.bytesconsumed >= sh->a_in_buffer_len) {
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
287 sh->a_in_buffer_len=0;
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
288 } else {
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
289 sh->a_in_buffer_len-=faac_finfo.bytesconsumed;
15978
c8dc500e078e memcpy and memmove both copy memory, but when using memcpy the source and destination must not overlap, but here, they did overlap.
gpoirier
parents: 15708
diff changeset
290 memmove(sh->a_in_buffer,&sh->a_in_buffer[faac_finfo.bytesconsumed],sh->a_in_buffer_len);
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
291 }
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
292
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
293 if(faac_finfo.error > 0) {
13307
b94f228dfed6 output faad error message in case of a decoder error
reimar
parents: 12473
diff changeset
294 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: error: %s, trying to resync!\n",
b94f228dfed6 output faad error message in case of a decoder error
reimar
parents: 12473
diff changeset
295 faacDecGetErrorMessage(faac_finfo.error));
19995
9cd5e242121e in case of errors after decoding quit the main decoding
nicodvb
parents: 19348
diff changeset
296 if (sh->a_in_buffer_len <= 0) {
9cd5e242121e in case of errors after decoding quit the main decoding
nicodvb
parents: 19348
diff changeset
297 errors = MAX_FAAD_ERRORS;
9cd5e242121e in case of errors after decoding quit the main decoding
nicodvb
parents: 19348
diff changeset
298 break;
9cd5e242121e in case of errors after decoding quit the main decoding
nicodvb
parents: 19348
diff changeset
299 }
18644
82263a36cfa4 fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents: 18242
diff changeset
300 sh->a_in_buffer_len--;
82263a36cfa4 fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents: 18242
diff changeset
301 memmove(sh->a_in_buffer,&sh->a_in_buffer[1],sh->a_in_buffer_len);
82263a36cfa4 fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents: 18242
diff changeset
302 aac_sync(sh);
16337
7252d024193b * really keep track on how many samples were decoded last round (fix 10l)
attila
parents: 16336
diff changeset
303 errors++;
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
304 } else
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
305 break;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
306 } while(errors < MAX_FAAD_ERRORS);
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
307 } else {
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
308 // packetized (.mp4) aac stream:
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
309 unsigned char* bufptr=NULL;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
310 double pts;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
311 int buflen=ds_get_packet_pts(sh->ds, &bufptr, &pts);
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
312 if(buflen<=0) break;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
313 if (pts != MP_NOPTS_VALUE) {
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
314 sh->pts = pts;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
315 sh->pts_bytes = 0;
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
316 }
9321
6fa743f3094b libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents: 7648
diff changeset
317 faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, bufptr, buflen);
6894
a32870fd043b support for packetized aac streams (used in .mp4 files)
arpi
parents: 5458
diff changeset
318 }
15019
bc17fdd4e2ef step 1 of fixing ad_faad:
rfelker
parents: 14638
diff changeset
319 //for (j=0;j<faac_finfo.channels;j++) printf("%d:%d\n", j, faac_finfo.channel_position[j]);
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 28110
diff changeset
320
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
321 if(faac_finfo.error > 0) {
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
322 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to decode frame: %s \n",
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
323 faacDecGetErrorMessage(faac_finfo.error));
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
324 } else if (faac_finfo.samples == 0) {
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
325 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Decoded zero samples!\n");
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
326 } else {
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
327 /* XXX: samples already multiplied by channels! */
17366
934380353fd6 massive attack: mp_msg printf format fixes
rathann
parents: 17012
diff changeset
328 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Successfully decoded frame (%ld Bytes)!\n",
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
329 sh->samplesize*faac_finfo.samples);
25315
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
330
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
331 if (sh->channels >= 5)
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
332 reorder_channel_copy_nch(faac_sample_buffer,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
333 AF_CHANNEL_LAYOUT_AAC_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
334 buf+len, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
335 sh->channels,
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
336 faac_finfo.samples, sh->samplesize);
dfa8a510c81c Fix all current known multi-channel wrong order problems by adding
ulion
parents: 24120
diff changeset
337 else
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
338 memcpy(buf+len,faac_sample_buffer, sh->samplesize*faac_finfo.samples);
16337
7252d024193b * really keep track on how many samples were decoded last round (fix 10l)
attila
parents: 16336
diff changeset
339 last_dec_len = sh->samplesize*faac_finfo.samples;
7252d024193b * really keep track on how many samples were decoded last round (fix 10l)
attila
parents: 16336
diff changeset
340 len += last_dec_len;
18242
caac2ca98168 4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents: 17366
diff changeset
341 sh->pts_bytes += last_dec_len;
5357
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
342 //printf("FAAD: buffer: %d bytes consumed: %d \n", k, faac_finfo.bytesconsumed);
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
343 }
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
344 }
3c5d5626d3a1 Don't kill me, pure indent change as I forgot to reindent when copy and pasting from dec_audio.c, as this is the first revision it doesn't break changelog!
atmos4
parents: 5356
diff changeset
345 return len;
5356
739cad21c32c Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff changeset
346 }