Mercurial > mplayer.hg
annotate libmpcodecs/ad_pcm.c @ 27272:6d5c1d9bf273
And a 1000l for r27263, swapped a condition, thus setting size to
0 when malloc succeeded instead of when it failed.
author | reimar |
---|---|
date | Wed, 16 Jul 2008 17:48:34 +0000 |
parents | dfa8a510c81c |
children | 0f1b5b68af32 |
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> |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
4 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
5 #include "config.h" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
6 #include "ad_internal.h" |
17012 | 7 #include "libaf/af_format.h" |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
8 #include "libaf/reorder_ch.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
|
9 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
10 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
|
11 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
12 "Uncompressed PCM audio decoder", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
13 "pcm", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
14 "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
|
15 "A'rpi", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
16 "" |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
17 }; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
18 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
19 LIBAD_EXTERN(pcm) |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
20 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
21 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
|
22 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
23 WAVEFORMATEX *h=sh_audio->wf; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
24 sh_audio->i_bps=h->nAvgBytesPerSec; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
25 sh_audio->channels=h->nChannels; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
26 sh_audio->samplerate=h->nSamplesPerSec; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
27 sh_audio->samplesize=(h->wBitsPerSample+7)/8; |
14245 | 28 sh_audio->sample_format=AF_FORMAT_S16_LE; // default |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
29 switch(sh_audio->format){ /* hardware formats: */ |
12539 | 30 case 0x0: |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
31 case 0x1: // Microsoft PCM |
14833
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
32 case 0xfffe: // Extended |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
33 switch (sh_audio->samplesize) { |
14245 | 34 case 1: sh_audio->sample_format=AF_FORMAT_U8; break; |
35 case 2: sh_audio->sample_format=AF_FORMAT_S16_LE; break; | |
36 case 3: sh_audio->sample_format=AF_FORMAT_S24_LE; break; | |
37 case 4: sh_audio->sample_format=AF_FORMAT_S32_LE; break; | |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
38 } |
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
39 break; |
14833
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
40 case 0x3: // IEEE float |
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
41 sh_audio->sample_format=AF_FORMAT_FLOAT_LE; |
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
42 break; |
14245 | 43 case 0x6: sh_audio->sample_format=AF_FORMAT_A_LAW;break; |
44 case 0x7: sh_audio->sample_format=AF_FORMAT_MU_LAW;break; | |
45 case 0x11: sh_audio->sample_format=AF_FORMAT_IMA_ADPCM;break; | |
46 case 0x50: sh_audio->sample_format=AF_FORMAT_MPEG2;break; | |
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 /* case 0x2000: sh_audio->sample_format=AFMT_AC3; */ |
12498 | 48 case 0x20776172: // 'raw ' |
14245 | 49 sh_audio->sample_format=AF_FORMAT_S16_BE; |
50 if(sh_audio->samplesize==1) sh_audio->sample_format=AF_FORMAT_U8; | |
12498 | 51 break; |
8102 | 52 case 0x736F7774: // 'twos' |
14245 | 53 sh_audio->sample_format=AF_FORMAT_S16_BE; |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
54 // intended fall-through |
20704
666efb20e7d5
Fix comment, it's 'sowt', not 'swot' ('twos' reversed)
reimar
parents:
19383
diff
changeset
|
55 case 0x74776F73: // 'sowt' |
14245 | 56 if(sh_audio->samplesize==1) sh_audio->sample_format=AF_FORMAT_S8; |
6233 | 57 break; |
14055 | 58 case 0x32336c66: // 'fl32', bigendian float32 |
14245 | 59 sh_audio->sample_format=AF_FORMAT_FLOAT_BE; |
14055 | 60 sh_audio->samplesize=4; |
61 break; | |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
62 case 0x666c3332: // '23lf', little endian float32, MPlayer internal fourCC |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
63 sh_audio->sample_format=AF_FORMAT_FLOAT_LE; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
64 sh_audio->samplesize=4; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
65 break; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
66 /* case 0x34366c66: // 'fl64', bigendian float64 |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
67 sh_audio->sample_format=AF_FORMAT_FLOAT_BE; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
68 sh_audio->samplesize=8; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
69 break; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
70 case 0x666c3634: // '46lf', little endian float64, MPlayer internal fourCC |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
71 sh_audio->sample_format=AF_FORMAT_FLOAT_LE; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
72 sh_audio->samplesize=8; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
73 break;*/ |
17813 | 74 case 0x34326e69: // 'in24', bigendian int24 |
75 sh_audio->sample_format=AF_FORMAT_S24_BE; | |
76 sh_audio->samplesize=3; | |
77 break; | |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
78 case 0x696e3234: // '42ni', little endian int24, MPlayer internal fourCC |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
79 sh_audio->sample_format=AF_FORMAT_S24_LE; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
80 sh_audio->samplesize=3; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
81 break; |
17813 | 82 case 0x32336e69: // 'in32', bigendian int32 |
83 sh_audio->sample_format=AF_FORMAT_S32_BE; | |
84 sh_audio->samplesize=4; | |
85 break; | |
17858
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
86 case 0x696e3332: // '23ni', little endian int32, MPlayer internal fourCC |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
87 sh_audio->sample_format=AF_FORMAT_S32_LE; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
88 sh_audio->samplesize=4; |
996e419c1671
in24/in32/fl32 little/big-endian QuickTime PCM audio support
rathann
parents:
17813
diff
changeset
|
89 break; |
14245 | 90 default: if(sh_audio->samplesize!=2) sh_audio->sample_format=AF_FORMAT_U8; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
91 } |
16134
a1fd1a7eeb35
lavf demuxer with raw PCM fix (and a related hang)
reimar
parents:
14833
diff
changeset
|
92 if (!sh_audio->samplesize) // this would cause MPlayer to hang later |
a1fd1a7eeb35
lavf demuxer with raw PCM fix (and a related hang)
reimar
parents:
14833
diff
changeset
|
93 sh_audio->samplesize = 2; |
5340
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
94 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
|
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 |
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 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
|
98 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
99 sh->audio_out_minsize=2048; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
100 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
|
101 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
102 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
103 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
|
104 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
105 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
106 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
107 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
|
108 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
109 int skip; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
110 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
|
111 { |
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 ADCTRL_SKIP_FRAME: |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
113 skip=sh->i_bps/16; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
114 skip=skip&(~3); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
115 demux_read_data(sh->ds,NULL,skip); |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
116 return CONTROL_TRUE; |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
117 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
118 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
|
119 } |
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 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
|
122 { |
16307 | 123 unsigned len = sh_audio->channels*sh_audio->samplesize; |
19383
0a6382b5b6ee
Change pcm decode_audio to return data based on minlen instead of maxlen
uau
parents:
17868
diff
changeset
|
124 len = (minlen + len - 1) / len * len; |
0a6382b5b6ee
Change pcm decode_audio to return data based on minlen instead of maxlen
uau
parents:
17868
diff
changeset
|
125 if (len > maxlen) |
0a6382b5b6ee
Change pcm decode_audio to return data based on minlen instead of maxlen
uau
parents:
17868
diff
changeset
|
126 // if someone needs hundreds of channels adjust audio_out_minsize |
0a6382b5b6ee
Change pcm decode_audio to return data based on minlen instead of maxlen
uau
parents:
17868
diff
changeset
|
127 // based on channels in preinit() |
0a6382b5b6ee
Change pcm decode_audio to return data based on minlen instead of maxlen
uau
parents:
17868
diff
changeset
|
128 return -1; |
5455 | 129 len=demux_read_data(sh_audio->ds,buf,len); |
25315
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
130 if (len > 0 && sh_audio->channels >= 5) { |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
131 reorder_channel_nch(buf, AF_CHANNEL_LAYOUT_WAVEEX_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
132 AF_CHANNEL_LAYOUT_MPLAYER_DEFAULT, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
133 sh_audio->channels, |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
134 len / sh_audio->samplesize, sh_audio->samplesize); |
dfa8a510c81c
Fix all current known multi-channel wrong order problems by adding
ulion
parents:
20704
diff
changeset
|
135 } |
5455 | 136 return 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
|
137 } |