Mercurial > mplayer.hg
annotate libmpcodecs/ad_faad.c @ 27985:1c77b86d355d
Remove a ColorFill that is not necessary since the surface it is used
on has exactly the same size as the video image and the video will
be copied into it before it is used the first time.
author | reimar |
---|---|
date | Mon, 24 Nov 2008 09:46:23 +0000 |
parents | e7c989f7a7c9 |
children | 4932a522100e |
rev | line source |
---|---|
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
1 /* ad_faad.c - MPlayer AAC decoder using libfaad2 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
2 * This file is part of MPlayer, see http://mplayerhq.hu/ for info. |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
3 * (c)2002 by Felix Buenemann <atmosfear at users.sourceforge.net> |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
4 * File licensed under the GPL, see http://www.fsf.org/ for more info. |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
5 */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
6 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
7 #include <stdio.h> |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
8 #include <stdlib.h> |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
9 #include <unistd.h> |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
10 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
11 #include "config.h" |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
12 #include "ad_internal.h" |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
13 #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
|
14 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
15 static ad_info_t info = |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
16 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
17 "AAC (MPEG2/4 Advanced Audio Coding)", |
7174 | 18 "faad", |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
19 "Felix Buenemann", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
20 "faad2", |
7191
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
21 "uses libfaad2" |
5356
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 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
24 LIBAD_EXTERN(faad) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
25 |
27341
e7c989f7a7c9
Start unifying names of internal preprocessor directives.
diego
parents:
25638
diff
changeset
|
26 #ifndef CONFIG_FAAD_INTERNAL |
10921 | 27 #include <faad.h> |
28 #else | |
17012 | 29 #include "libfaad2/faad.h" |
10921 | 30 #endif |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
31 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
32 /* configure maximum supported channels, * |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
33 * this is theoretically max. 64 chans */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
34 #define FAAD_MAX_CHANNELS 6 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
35 #define FAAD_BUFFLEN (FAAD_MIN_STREAMSIZE*FAAD_MAX_CHANNELS) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
36 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
37 //#define AAC_DUMP_COMPRESSED |
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 static faacDecHandle faac_hdec; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
40 static faacDecFrameInfo faac_finfo; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
41 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
42 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
|
43 { |
12095
cef97e8c85c0
Support for HE-AAC. Patch by Loren Merritt <lorenm at u dot washington anotherdot edu>.
mosu
parents:
10921
diff
changeset
|
44 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
|
45 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
|
46 return 1; |
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 |
14564
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
49 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
|
50 { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
51 int i = 0, pos = 0; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
52 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
|
53 while(i <= len-4) { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
54 if( |
15708
bdb826438aa8
fixed wrong binary mask: it precluded the syncword of adts-4 from being recognized as valid
nicodvb
parents:
15019
diff
changeset
|
55 ((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
|
56 (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
|
57 ) { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
58 pos = i; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
59 break; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
60 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
61 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
|
62 i++; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
63 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
64 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
|
65 return pos; |
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 |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
68 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
|
69 { |
7648
7ee8239bfcc0
I think libfaad2 changed recently. The functions faacDecInit() and
arpi
parents:
7191
diff
changeset
|
70 unsigned long faac_samplerate; |
7ee8239bfcc0
I think libfaad2 changed recently. The functions faacDecInit() and
arpi
parents:
7191
diff
changeset
|
71 unsigned char faac_channels; |
14564
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
72 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
|
73 faac_hdec = faacDecOpen(); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
74 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
75 // 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
|
76 if(!sh->codecdata_len && sh->wf) { |
6f11d107f7b8
If demuxer does not fill codecdata try to get if from waveformatex
rtognimp
parents:
12095
diff
changeset
|
77 sh->codecdata_len = sh->wf->cbSize; |
25638
a4c3eb7ef547
Use malloc for codecdata. Fixes segfault in free_sh_sub.
eugeni
parents:
25315
diff
changeset
|
78 sh->codecdata = malloc(sh->codecdata_len); |
a4c3eb7ef547
Use malloc for codecdata. Fixes segfault in free_sh_sub.
eugeni
parents:
25315
diff
changeset
|
79 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
|
80 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
|
81 } |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
82 if(!sh->codecdata_len) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
83 #if 1 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
84 faacDecConfigurationPtr faac_conf; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
85 /* 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
|
86 /* 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
|
87 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
|
88 if(sh->samplerate) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
89 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
|
90 /* 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
|
91 * 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
|
92 */ |
15019 | 93 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
|
94 switch(sh->samplesize){ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
95 case 1: // 8Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
96 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
|
97 default: |
13427
9d0b052c4f74
setting samplesize to 2 in decoders where neccessary.
reimar
parents:
13307
diff
changeset
|
98 sh->samplesize=2; |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
99 case 2: // 16Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
100 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
|
101 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
102 case 3: // 24Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
103 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
|
104 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
105 case 4: // 32Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
106 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
|
107 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
108 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
109 //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
|
110 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
111 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
|
112 #endif |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
113 |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
114 sh->a_in_buffer_len = demux_read_data(sh->ds, sh->a_in_buffer, sh->a_in_buffer_size); |
14564
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
115 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
|
116 if(pos) { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
117 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
|
118 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
|
119 sh->a_in_buffer_len += |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
120 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
|
121 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
|
122 pos = 0; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
123 } |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
124 |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
125 /* init the codec */ |
9321
6fa743f3094b
libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents:
7648
diff
changeset
|
126 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer, |
6fa743f3094b
libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents:
7648
diff
changeset
|
127 sh->a_in_buffer_len, &faac_samplerate, &faac_channels); |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
128 |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
129 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
|
130 // 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
|
131 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
132 } else { // We have ES DS in codecdata |
15019 | 133 faacDecConfigurationPtr faac_conf = faacDecGetCurrentConfiguration(faac_hdec); |
134 if (audio_output_channels <= 2) { | |
135 faac_conf->downMatrix = 1; | |
136 faacDecSetConfiguration(faac_hdec, faac_conf); | |
137 } | |
138 | |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
139 /*int i; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
140 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
|
141 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
|
142 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
143 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
|
144 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
|
145 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
146 if(faac_init < 0) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
147 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
|
148 faacDecClose(faac_hdec); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
149 // 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
|
150 return 0; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
151 } else { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
152 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug! |
17366 | 153 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %ldHz channels: %d\n", faac_samplerate, faac_channels); |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
154 sh->channels = faac_channels; |
15019 | 155 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
|
156 sh->samplerate = faac_samplerate; |
13427
9d0b052c4f74
setting samplesize to 2 in decoders where neccessary.
reimar
parents:
13307
diff
changeset
|
157 sh->samplesize=2; |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
158 //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
|
159 if(!sh->i_bps) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
160 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
|
161 sh->i_bps = 128*1000/8; // XXX: HACK!!! ::atmos |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
162 } else |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
163 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: got %dkbit/s bitrate from MP4 header!\n",sh->i_bps*8/1000); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
164 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
165 return 1; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
166 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
167 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
168 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
|
169 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
170 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
|
171 faacDecClose(faac_hdec); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
172 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
173 |
14564
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
174 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
|
175 { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
176 int pos = 0; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
177 if(!sh->codecdata_len) { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
178 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
|
179 sh->a_in_buffer_len += |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
180 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
|
181 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
|
182 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
183 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
|
184 if(pos) { |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
185 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
|
186 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
|
187 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
|
188 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
189 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
190 return pos; |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
191 } |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
192 |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
193 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
|
194 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
195 switch(cmd) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
196 { |
14564
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
197 case ADCTRL_RESYNC_STREAM: |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
198 aac_sync(sh); |
f85875877de9
tries to sync to ADTS/ADIF header before initializing the decoder; implement SYNC
nicodvb
parents:
13427
diff
changeset
|
199 return CONTROL_TRUE; |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
200 #if 0 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
201 case ADCTRL_SKIP_FRAME: |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
202 return CONTROL_TRUE; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
203 #endif |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
204 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
205 return CONTROL_UNKNOWN; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
206 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
207 |
16337
7252d024193b
* really keep track on how many samples were decoded last round (fix 10l)
attila
parents:
16336
diff
changeset
|
208 #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
|
209 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
|
210 { |
24120 | 211 int len = 0, last_dec_len = 1, errors = 0; |
212 // 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
|
213 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
|
214 |
16337
7252d024193b
* really keep track on how many samples were decoded last round (fix 10l)
attila
parents:
16336
diff
changeset
|
215 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
|
216 |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
217 /* update buffer for raw aac streams: */ |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
218 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
|
219 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
|
220 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
|
221 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
|
222 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
|
223 } |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
224 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
225 #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
|
226 {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
|
227 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
|
228 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
|
229 printf ("\n");} |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
230 #endif |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
231 |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
232 if(!sh->codecdata_len){ |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
233 // raw aac stream: |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
234 do { |
18644
82263a36cfa4
fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents:
18242
diff
changeset
|
235 faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, sh->a_in_buffer, sh->a_in_buffer_len); |
9321
6fa743f3094b
libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents:
7648
diff
changeset
|
236 |
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
|
237 /* 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
|
238 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
|
239 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
|
240 } 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
|
241 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
|
242 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
|
243 } |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
244 |
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
|
245 if(faac_finfo.error > 0) { |
13307
b94f228dfed6
output faad error message in case of a decoder error
reimar
parents:
12473
diff
changeset
|
246 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
|
247 faacDecGetErrorMessage(faac_finfo.error)); |
19995
9cd5e242121e
in case of errors after decoding quit the main decoding
nicodvb
parents:
19348
diff
changeset
|
248 if (sh->a_in_buffer_len <= 0) { |
9cd5e242121e
in case of errors after decoding quit the main decoding
nicodvb
parents:
19348
diff
changeset
|
249 errors = MAX_FAAD_ERRORS; |
9cd5e242121e
in case of errors after decoding quit the main decoding
nicodvb
parents:
19348
diff
changeset
|
250 break; |
9cd5e242121e
in case of errors after decoding quit the main decoding
nicodvb
parents:
19348
diff
changeset
|
251 } |
18644
82263a36cfa4
fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents:
18242
diff
changeset
|
252 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
|
253 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
|
254 aac_sync(sh); |
16337
7252d024193b
* really keep track on how many samples were decoded last round (fix 10l)
attila
parents:
16336
diff
changeset
|
255 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
|
256 } 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
|
257 break; |
18644
82263a36cfa4
fixes the infinite loop which occurs when there is a decode error in a frame.
gpoirier
parents:
18242
diff
changeset
|
258 } while(errors < MAX_FAAD_ERRORS); |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
259 } else { |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
260 // packetized (.mp4) aac stream: |
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
261 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
|
262 double pts; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
17366
diff
changeset
|
263 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
|
264 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
|
265 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
|
266 sh->pts = pts; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
17366
diff
changeset
|
267 sh->pts_bytes = 0; |
caac2ca98168
4 - Implement a better way to calculate current audio pts and use it for
rtognimp
parents:
17366
diff
changeset
|
268 } |
9321
6fa743f3094b
libfaad2 v1.0, v1.1, v1.2 detection, and API change workaround in ad_faad.c
arpi
parents:
7648
diff
changeset
|
269 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
|
270 } |
15019 | 271 //for (j=0;j<faac_finfo.channels;j++) printf("%d:%d\n", j, faac_finfo.channel_position[j]); |
6894
a32870fd043b
support for packetized aac streams (used in .mp4 files)
arpi
parents:
5458
diff
changeset
|
272 |
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
|
273 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
|
274 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
|
275 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
|
276 } 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
|
277 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
|
278 } 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
|
279 /* XXX: samples already multiplied by channels! */ |
17366 | 280 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
|
281 sh->samplesize*faac_finfo.samples); |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
282 |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
283 if (sh->channels >= 5) |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
284 reorder_channel_copy_nch(faac_sample_buffer, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
285 AF_CHANNEL_LAYOUT_AAC_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
286 buf+len, AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
287 sh->channels, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
288 faac_finfo.samples, sh->samplesize); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
24120
diff
changeset
|
289 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
|
290 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
|
291 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
|
292 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
|
293 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
|
294 //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
|
295 } |
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
|
296 } |
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
|
297 return len; |
5356
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
298 } |