Mercurial > mplayer.hg
annotate libmpcodecs/ad_liba52.c @ 28380:f521e54d47ee
Add support for libavcodec GMC flag, patch by Dave Baker, dbkr mxtelecom com.
author | diego |
---|---|
date | Sun, 01 Feb 2009 02:10:31 +0000 |
parents | 9b767bba79fb |
children | 606c3c97229c |
rev | line source |
---|---|
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
1 #include <stdio.h> |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
2 #include <stdlib.h> |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
3 #include <unistd.h> |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
4 #include <math.h> |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
5 #include <assert.h> |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
6 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
7 #include "config.h" |
8026
b465ba5897a3
usage of libmpeg2, liba52, mp3lib & svq1 can be disabled
arpi
parents:
7191
diff
changeset
|
8 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
9 #include "mp_msg.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
10 #include "help_mp.h" |
23638
a81e246e3b38
Make sure we always have a swab() prototype when we use it,
reimar
parents:
21507
diff
changeset
|
11 #include "mpbswap.h" |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
12 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
13 #include "ad_internal.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
14 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
15 #include "cpudetect.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
16 |
17012 | 17 #include "libaf/af_format.h" |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
18 |
27588 | 19 #ifdef CONFIG_LIBA52_INTERNAL |
17012 | 20 #include "liba52/a52.h" |
21 #include "liba52/mm_accel.h" | |
27588 | 22 #else |
23 #include <a52dec/a52.h> | |
24 #include <a52dec/mm_accel.h> | |
25 int (* a52_resample) (float * _f, int16_t * s16); | |
26 #endif | |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
27 |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
28 static a52_state_t *a52_state; |
5341 | 29 static uint32_t a52_flags=0; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
30 /** Used by a52_resample_float, it defines the mapping between liba52 |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
31 * channels and output channels. The ith nibble from the right in the |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
32 * hex representation of channel_map is the index of the source |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
33 * channel corresponding to the ith output channel. Source channels are |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
34 * indexed 1-6. Silent output channels are marked by 0xf. */ |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
35 static uint32_t channel_map; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
36 |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
37 #define DRC_NO_ACTION 0 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
38 #define DRC_NO_COMPRESSION 1 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
39 #define DRC_CALLBACK 2 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
40 |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
41 /** The output is multiplied by this var. Used for volume control */ |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
42 static sample_t a52_level = 1; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
43 /** The value of the -a52drc switch. */ |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
44 float a52_drc_level = 1.0; |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
45 static int a52_drc_action = DRC_NO_ACTION; |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
46 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
47 static ad_info_t info = |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
48 { |
7191
1eadce15446c
-afm/-vfm help implemenetd, some cosmetics of ad/vd codec names/comments
arpi
parents:
7180
diff
changeset
|
49 "AC3 decoding with liba52", |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
50 "liba52", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
51 "Nick Kurshev", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
52 "Michel LESPINASSE", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
53 "" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
54 }; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
55 |
5343 | 56 LIBAD_EXTERN(liba52) |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
57 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
58 int a52_fillbuff(sh_audio_t *sh_audio){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
59 int length=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
60 int flags=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
61 int sample_rate=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
62 int bit_rate=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
63 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
64 sh_audio->a_in_buffer_len=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
65 /* sync frame:*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
66 while(1){ |
10119 | 67 while(sh_audio->a_in_buffer_len<8){ |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
68 int c=demux_getc(sh_audio->ds); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
69 if(c<0) return -1; /* EOF*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
70 sh_audio->a_in_buffer[sh_audio->a_in_buffer_len++]=c; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
71 } |
10119 | 72 if(sh_audio->format!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
73 length = a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
74 if(length>=7 && length<=3840) break; /* we're done.*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
75 /* bad file => resync*/ |
10119 | 76 if(sh_audio->format!=0x2000) swab(sh_audio->a_in_buffer,sh_audio->a_in_buffer,8); |
15560 | 77 memmove(sh_audio->a_in_buffer,sh_audio->a_in_buffer+1,7); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
78 --sh_audio->a_in_buffer_len; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
79 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
80 mp_msg(MSGT_DECAUDIO,MSGL_DBG2,"a52: len=%d flags=0x%X %d Hz %d bit/s\n",length,flags,sample_rate,bit_rate); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
81 sh_audio->samplerate=sample_rate; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
82 sh_audio->i_bps=bit_rate/8; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
83 sh_audio->samplesize=sh_audio->sample_format==AF_FORMAT_FLOAT_NE ? 4 : 2; |
10119 | 84 demux_read_data(sh_audio->ds,sh_audio->a_in_buffer+8,length-8); |
85 if(sh_audio->format!=0x2000) | |
86 swab(sh_audio->a_in_buffer+8,sh_audio->a_in_buffer+8,length-8); | |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
87 |
27588 | 88 #ifdef CONFIG_LIBA52_INTERNAL |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
89 if(crc16_block(sh_audio->a_in_buffer+2,length-2)!=0) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
90 mp_msg(MSGT_DECAUDIO,MSGL_STATUS,"a52: CRC check failed! \n"); |
27588 | 91 #endif |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
92 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
93 return length; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
94 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
95 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
96 /* returns: number of available channels*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
97 static int a52_printinfo(sh_audio_t *sh_audio){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
98 int flags, sample_rate, bit_rate; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
99 char* mode="unknown"; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
100 int channels=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
101 a52_syncinfo (sh_audio->a_in_buffer, &flags, &sample_rate, &bit_rate); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
102 switch(flags&A52_CHANNEL_MASK){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
103 case A52_CHANNEL: mode="channel"; channels=2; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
104 case A52_MONO: mode="mono"; channels=1; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
105 case A52_STEREO: mode="stereo"; channels=2; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
106 case A52_3F: mode="3f";channels=3;break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
107 case A52_2F1R: mode="2f+1r";channels=3;break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
108 case A52_3F1R: mode="3f+1r";channels=4;break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
109 case A52_2F2R: mode="2f+2r";channels=4;break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
110 case A52_3F2R: mode="3f+2r";channels=5;break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
111 case A52_CHANNEL1: mode="channel1"; channels=2; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
112 case A52_CHANNEL2: mode="channel2"; channels=2; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
113 case A52_DOLBY: mode="dolby"; channels=2; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
114 } |
19944 | 115 mp_msg(MSGT_DECAUDIO,MSGL_V,"AC3: %d.%d (%s%s) %d Hz %3.1f kbit/s\n", |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
116 channels, (flags&A52_LFE)?1:0, |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
117 mode, (flags&A52_LFE)?"+lfe":"", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
118 sample_rate, bit_rate*0.001f); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
119 return (flags&A52_LFE) ? (channels+1) : channels; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
120 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
121 |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
122 sample_t dynrng_call (sample_t c, void *data) { |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
123 // fprintf(stderr, "(%lf, %lf): %lf\n", (double)c, (double)a52_drc_level, (double)pow((double)c, a52_drc_level)); |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
124 return pow((double)c, a52_drc_level); |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
125 } |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
126 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
127 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
128 static int preinit(sh_audio_t *sh) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
129 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
130 /* Dolby AC3 audio: */ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
131 /* however many channels, 2 bytes in a word, 256 samples in a block, 6 blocks in a frame */ |
27588 | 132 #ifdef CONFIG_LIBA52_INTERNAL |
15559
9f157ca7e3c2
Make sure that samplesize is at least 2, as some demuxers set it to 1
hzoli
parents:
15558
diff
changeset
|
133 if (sh->samplesize < 2) sh->samplesize = 2; |
27588 | 134 #else |
135 if (sh->samplesize < 4) sh->samplesize = 4; | |
136 #endif | |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
137 sh->audio_out_minsize=audio_output_channels*sh->samplesize*256*6; |
5458 | 138 sh->audio_in_minsize=3840; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
139 a52_level = 1.0; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
140 return 1; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
141 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
142 |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
143 /** |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
144 * \brief Function to convert the "planar" float format used by liba52 |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
145 * into the interleaved float format used by libaf/libao2. |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
146 * \param in the input buffer containing the planar samples. |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
147 * \param out the output buffer where the interleaved result is stored. |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
148 */ |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
149 static int a52_resample_float(float *in, int16_t *out) |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
150 { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
151 unsigned long i; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
152 float *p = (float*) out; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
153 for (i = 0; i != 256; i++) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
154 unsigned long map = channel_map; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
155 do { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
156 unsigned long ch = map & 15; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
157 if (ch == 15) |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
158 *p = 0; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
159 else |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
160 *p = in[i + ((ch-1)<<8)]; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
161 p++; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
162 } while ((map >>= 4)); |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
163 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
164 return (int16_t*) p - out; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
165 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
166 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
167 static int init(sh_audio_t *sh_audio) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
168 { |
5341 | 169 uint32_t a52_accel=0; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
170 sample_t level=a52_level, bias=384; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
171 int flags=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
172 /* Dolby AC3 audio:*/ |
27587 | 173 #ifdef MM_ACCEL_X86_SSE |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
174 if(gCpuCaps.hasSSE) a52_accel|=MM_ACCEL_X86_SSE; |
27587 | 175 #endif |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
176 if(gCpuCaps.hasMMX) a52_accel|=MM_ACCEL_X86_MMX; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
177 if(gCpuCaps.hasMMX2) a52_accel|=MM_ACCEL_X86_MMXEXT; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
178 if(gCpuCaps.has3DNow) a52_accel|=MM_ACCEL_X86_3DNOW; |
27587 | 179 #ifdef MM_ACCEL_X86_3DNOWEXT |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
180 if(gCpuCaps.has3DNowExt) a52_accel|=MM_ACCEL_X86_3DNOWEXT; |
27587 | 181 #endif |
182 #ifdef MM_ACCEL_PPC_ALTIVEC | |
9003 | 183 if(gCpuCaps.hasAltiVec) a52_accel|=MM_ACCEL_PPC_ALTIVEC; |
27587 | 184 #endif |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
185 a52_state=a52_init (a52_accel); |
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
186 if (a52_state == NULL) { |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
187 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 init failed\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
188 return 0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
189 } |
27588 | 190 #ifndef CONFIG_LIBA52_INTERNAL |
191 sh_audio->sample_format = AF_FORMAT_FLOAT_NE; | |
192 #endif | |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
193 if(a52_fillbuff(sh_audio)<0){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
194 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"A52 sync failed\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
195 return 0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
196 } |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
197 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
198 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
199 /* Init a52 dynrng */ |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
200 if (a52_drc_level < 0.001) { |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
201 /* level == 0 --> no compression, init library without callback */ |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
202 a52_drc_action = DRC_NO_COMPRESSION; |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
203 } else if (a52_drc_level > 0.999) { |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
204 /* level == 1 --> full compression, do nothing at all (library default = full compression) */ |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
205 a52_drc_action = DRC_NO_ACTION; |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
206 } else { |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
207 a52_drc_action = DRC_CALLBACK; |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
208 } |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
209 /* Library init for dynrng has to be done for each frame, see decode_audio() */ |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
210 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
211 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
212 /* 'a52 cannot upmix' hotfix:*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
213 a52_printinfo(sh_audio); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
214 sh_audio->channels=audio_output_channels; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
215 while(sh_audio->channels>0){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
216 switch(sh_audio->channels){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
217 case 1: a52_flags=A52_MONO; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
218 /* case 2: a52_flags=A52_STEREO; break;*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
219 case 2: a52_flags=A52_DOLBY; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
220 /* case 3: a52_flags=A52_3F; break;*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
221 case 3: a52_flags=A52_2F1R; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
222 case 4: a52_flags=A52_2F2R; break; /* 2+2*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
223 case 5: a52_flags=A52_3F2R; break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
224 case 6: a52_flags=A52_3F2R|A52_LFE; break; /* 5.1*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
225 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
226 /* test:*/ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
227 flags=a52_flags|A52_ADJUST_LEVEL; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
228 mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags before a52_frame: 0x%X\n",flags); |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
229 if (a52_frame (a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
230 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: error decoding frame -> nosound\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
231 return 0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
232 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
233 mp_msg(MSGT_DECAUDIO,MSGL_V,"A52 flags after a52_frame: 0x%X\n",flags); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
234 /* frame decoded, let's init resampler:*/ |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
235 channel_map = 0; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
236 if (sh_audio->sample_format == AF_FORMAT_FLOAT_NE) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
237 if (!(flags & A52_LFE)) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
238 switch ((flags<<3) | sh_audio->channels) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
239 case (A52_MONO << 3) | 1: channel_map = 0x1; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
240 case (A52_CHANNEL << 3) | 2: |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
241 case (A52_STEREO << 3) | 2: |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
242 case (A52_DOLBY << 3) | 2: channel_map = 0x21; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
243 case (A52_2F1R << 3) | 3: channel_map = 0x321; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
244 case (A52_2F2R << 3) | 4: channel_map = 0x4321; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
245 case (A52_3F << 3) | 5: channel_map = 0x2ff31; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
246 case (A52_3F2R << 3) | 5: channel_map = 0x25431; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
247 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
248 } else if (sh_audio->channels == 6) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
249 switch (flags & ~A52_LFE) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
250 case A52_MONO : channel_map = 0x12ffff; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
251 case A52_CHANNEL: |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
252 case A52_STEREO : |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
253 case A52_DOLBY : channel_map = 0x1fff32; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
254 case A52_3F : channel_map = 0x13ff42; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
255 case A52_2F1R : channel_map = 0x1f4432; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
256 case A52_2F2R : channel_map = 0x1f5432; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
257 case A52_3F2R : channel_map = 0x136542; break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
258 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
259 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
260 if (channel_map) { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
261 a52_resample = a52_resample_float; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
262 break; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
263 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
264 } else |
27588 | 265 #ifdef CONFIG_LIBA52_INTERNAL |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
266 if(a52_resample_init(a52_accel,flags,sh_audio->channels)) break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
267 --sh_audio->channels; /* try to decrease no. of channels*/ |
27588 | 268 #else |
269 break; | |
270 #endif | |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
271 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
272 if(sh_audio->channels<=0){ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
273 mp_msg(MSGT_DECAUDIO,MSGL_ERR,"a52: no resampler. try different channel setup!\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
274 return 0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
275 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
276 return 1; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
277 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
278 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
279 static void uninit(sh_audio_t *sh) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
280 { |
26923 | 281 a52_free(a52_state); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
282 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
283 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
284 static int control(sh_audio_t *sh,int cmd,void* arg, ...) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
285 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
286 switch(cmd) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
287 { |
15558 | 288 case ADCTRL_RESYNC_STREAM: |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
289 case ADCTRL_SKIP_FRAME: |
15558 | 290 a52_fillbuff(sh); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
291 return CONTROL_TRUE; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
292 case ADCTRL_SET_VOLUME: { |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
293 float vol = *(float*)arg; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
294 if (vol > 60.0) vol = 60.0; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
295 a52_level = vol <= -200.0 ? 0 : pow(10.0,vol/20.0); |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
296 return CONTROL_TRUE; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
297 } |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
298 case ADCTRL_QUERY_FORMAT: |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
299 if (*(int*)arg == AF_FORMAT_S16_NE || |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
300 *(int*)arg == AF_FORMAT_FLOAT_NE) |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
301 return CONTROL_TRUE; |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
302 return CONTROL_FALSE; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
303 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
304 return CONTROL_UNKNOWN; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
305 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
306 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
307 static int decode_audio(sh_audio_t *sh_audio,unsigned char *buf,int minlen,int maxlen) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
308 { |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
309 sample_t level=a52_level, bias=384; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
310 int flags=a52_flags|A52_ADJUST_LEVEL; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
311 int i,len=-1; |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
312 if (sh_audio->sample_format == AF_FORMAT_FLOAT_NE) |
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
313 bias = 0; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
314 if(!sh_audio->a_in_buffer_len) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
315 if(a52_fillbuff(sh_audio)<0) return len; /* EOF */ |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
316 sh_audio->a_in_buffer_len=0; |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
317 if (a52_frame (a52_state, sh_audio->a_in_buffer, &flags, &level, bias)){ |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
318 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error decoding frame\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
319 return len; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
320 } |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
321 |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
322 /* handle dynrng */ |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
323 if (a52_drc_action != DRC_NO_ACTION) { |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
324 if (a52_drc_action == DRC_NO_COMPRESSION) |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
325 a52_dynrng(a52_state, NULL, NULL); |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
326 else |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
327 a52_dynrng(a52_state, dynrng_call, NULL); |
12285
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
328 } |
67b8d64af8c7
a52 dynamic range compression support by Peter Gansterer
alex
parents:
10978
diff
changeset
|
329 |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
330 len=0; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
331 for (i = 0; i < 6; i++) { |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
332 if (a52_block (a52_state)){ |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
333 mp_msg(MSGT_DECAUDIO,MSGL_WARN,"a52: error at resampling\n"); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
334 break; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
335 } |
18720
4bad7f00556e
sync with liba52 0.7.4, patch by Emanuele Giaquinta >emanuele.giaquinta ! gmail * com<
rathann
parents:
17581
diff
changeset
|
336 len+=2*a52_resample(a52_samples(a52_state),(int16_t *)&buf[len]); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
337 } |
14817
878745349274
Add float output support. Add ADCTRL_QUERY_FORMAT control to report the
hzoli
parents:
13427
diff
changeset
|
338 assert(len <= maxlen); |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
339 return len; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
340 } |