Mercurial > mplayer.hg
annotate libmpcodecs/ad_faad.c @ 5356:739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
author | atmos4 |
---|---|
date | Tue, 26 Mar 2002 15:53:18 +0000 |
parents | |
children | 3c5d5626d3a1 |
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" |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
13 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
14 #ifdef HAVE_FAAD |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
15 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
16 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
|
17 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
18 "AAC (MPEG2/4 Advanced Audio Coding)", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
19 "libfaad2", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
20 AFM_AAC, |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
21 "Felix Buenemann", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
22 "faad2", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
23 "Under development!" |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
24 }; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
25 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
26 LIBAD_EXTERN(faad) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
27 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
28 #include <faad.h> |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
29 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
30 /* configure maximum supported channels, * |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
31 * 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
|
32 #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
|
33 #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
|
34 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
35 //#define AAC_DUMP_COMPRESSED |
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 static faacDecHandle faac_hdec; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
38 static faacDecFrameInfo faac_finfo; |
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 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
|
41 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
42 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
|
43 sh->audio_out_minsize=2048*FAAD_MAX_CHANNELS; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
44 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
45 // XXX: why is this duplicated in sh struct? ::atmos |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
46 sh->a_in_buffer_size=sh->audio_in_minsize; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
47 sh->a_in_buffer=malloc(sh->a_in_buffer_size); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
48 sh->a_in_buffer_len=0; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
49 return 1; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
50 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
51 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
52 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
|
53 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
54 unsigned long faac_samplerate, faac_channels; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
55 int faac_init; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
56 faac_hdec = faacDecOpen(); |
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 sh->a_in_buffer_len = demux_read_data(sh->ds, sh->a_in_buffer, sh->a_in_buffer_size); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
59 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
60 // If we don't get the ES descriptor, try manual config |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
61 if(!sh->codecdata_len) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
62 #if 1 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
63 faacDecConfigurationPtr faac_conf; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
64 /* 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
|
65 /* 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
|
66 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
|
67 if(sh->samplerate) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
68 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
|
69 /* 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
|
70 * 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
|
71 */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
72 if(sh->samplesize) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
73 switch(sh->samplesize){ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
74 case 1: // 8Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
75 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
|
76 default: |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
77 case 2: // 16Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
78 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
|
79 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
80 case 3: // 24Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
81 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
|
82 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
83 case 4: // 32Bit |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
84 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
|
85 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
86 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
87 //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
|
88 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
89 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
|
90 #endif |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
91 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
92 /* init the codec */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
93 faac_init = faacDecInit(faac_hdec, sh->a_in_buffer, |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
94 &faac_samplerate, &faac_channels); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
95 sh->a_in_buffer_len -= (faac_init > 0)?faac_init:0; // how many bytes init consumed |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
96 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
97 } else { // We have ES DS in codecdata |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
98 /*int i; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
99 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
|
100 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
|
101 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
102 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
|
103 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
|
104 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
105 if(faac_init < 0) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
106 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
|
107 faacDecClose(faac_hdec); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
108 // 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
|
109 return 0; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
110 } else { |
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_V,"FAAD: Decoder init done (%dBytes)!\n", sh->a_in_buffer_len); // XXX: remove or move to debug! |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
112 mp_msg(MSGT_DECAUDIO,MSGL_V,"FAAD: Negotiated samplerate: %dHz channels: %d\n", faac_samplerate, faac_channels); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
113 sh->channels = faac_channels; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
114 sh->samplerate = faac_samplerate; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
115 //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
|
116 if(!sh->i_bps) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
117 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
|
118 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
|
119 } else |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
120 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
|
121 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
122 return 1; |
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 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
125 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
|
126 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
127 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
|
128 faacDecClose(faac_hdec); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
129 if(sh->a_in_buffer_size) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
130 free(sh->a_in_buffer); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
131 sh->a_in_buffer = NULL; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
132 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
133 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
134 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
135 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
|
136 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
137 switch(cmd) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
138 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
139 #if 0 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
140 case ADCTRL_RESYNC_STREAM: |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
141 return CONTROL_TRUE; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
142 case ADCTRL_SKIP_FRAME: |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
143 return CONTROL_TRUE; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
144 #endif |
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 return CONTROL_UNKNOWN; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
147 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
148 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
149 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
|
150 { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
151 int j = 0, len = 0; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
152 void *faac_sample_buffer; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
153 //memset(sh->a_buffer,0,sh->a_buffer_size); // XXX: check if needed. |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
154 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
155 while(len < minlen) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
156 /* update buffer */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
157 if(sh->a_in_buffer_len < sh->a_in_buffer_size){ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
158 sh->a_in_buffer_len += |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
159 demux_read_data(sh->ds,&sh->a_in_buffer[sh->a_in_buffer_len], |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
160 sh->a_in_buffer_size - sh->a_in_buffer_len); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
161 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
162 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
163 #ifdef DUMP_AAC_COMPRESSED |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
164 {int i; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
165 for (i = 0; i < 16; i++) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
166 printf ("%02X ", sh->a_in_buffer[i]); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
167 printf ("\n");} |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
168 #endif |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
169 do { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
170 faac_sample_buffer = faacDecDecode(faac_hdec, &faac_finfo, sh->a_in_buffer+j); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
171 /* update buffer index after faacDecDecode */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
172 if(faac_finfo.bytesconsumed >= sh->a_in_buffer_len){ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
173 sh->a_in_buffer_len=0; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
174 } else { |
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_finfo.bytesconsumed; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
176 memcpy(sh->a_in_buffer,&sh->a_in_buffer[faac_finfo.bytesconsumed],sh->a_in_buffer_len); |
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 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
179 if(faac_finfo.error > 0) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
180 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Trying to resync!\n"); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
181 j++; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
182 } else |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
183 break; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
184 } while(j < FAAD_BUFFLEN); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
185 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
186 if(faac_finfo.error > 0) { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
187 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"FAAD: Failed to decode frame: %s \n", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
188 faacDecGetErrorMessage(faac_finfo.error)); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
189 } else if (faac_finfo.samples == 0) |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
190 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"FAAD: Decoded zero samples!\n"); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
191 else { |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
192 /* XXX: samples already multiplied by channels! */ |
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_DBG2,"FAAD: Successfully decoded frame (%d Bytes)!\n", |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
194 sh->samplesize*faac_finfo.samples); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
195 memcpy(buf+len,faac_sample_buffer, sh->samplesize*faac_finfo.samples); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
196 len += sh->samplesize*faac_finfo.samples; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
197 //printf("FAAD: buffer: %d bytes consumed: %d \n", k, faac_finfo.bytesconsumed); |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
198 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
199 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
200 return len; |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
201 } |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
202 |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
203 #endif /* !HAVE_FAAD */ |
739cad21c32c
Port dec_audio.c faad aac decoder to libmpcodecs, cleaned up code, improved buffering scheme.
atmos4
parents:
diff
changeset
|
204 |