Mercurial > mplayer.hg
annotate libmpcodecs/ad_pcm.c @ 16473:d9697b778be2
Nits suggested by Diego
author | gpoirier |
---|---|
date | Tue, 13 Sep 2005 11:38:39 +0000 |
parents | 03cd6abe5664 |
children | 6ff3379a0862 |
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" |
12478 | 7 #include "../libaf/af_format.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
|
8 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
9 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
|
10 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
11 "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
|
12 "pcm", |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
13 "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
|
14 "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
|
15 "" |
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 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
|
19 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
20 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
|
21 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
22 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
|
23 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
|
24 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
|
25 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
|
26 sh_audio->samplesize=(h->wBitsPerSample+7)/8; |
14245 | 27 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
|
28 switch(sh_audio->format){ /* hardware formats: */ |
12539 | 29 case 0x0: |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
30 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
|
31 case 0xfffe: // Extended |
12447
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
32 switch (sh_audio->samplesize) { |
14245 | 33 case 1: sh_audio->sample_format=AF_FORMAT_U8; break; |
34 case 2: sh_audio->sample_format=AF_FORMAT_S16_LE; break; | |
35 case 3: sh_audio->sample_format=AF_FORMAT_S24_LE; break; | |
36 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
|
37 } |
fde132f084ce
fix bigendian problems (left-right swapped 8bit pcms), add 32bit support
reimar
parents:
12080
diff
changeset
|
38 break; |
14833
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
39 case 0x3: // IEEE float |
78385a72a8bb
Add support for 32-bit float WAV files and support for extended WAV files
ivo
parents:
14245
diff
changeset
|
40 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
|
41 break; |
14245 | 42 case 0x6: sh_audio->sample_format=AF_FORMAT_A_LAW;break; |
43 case 0x7: sh_audio->sample_format=AF_FORMAT_MU_LAW;break; | |
44 case 0x11: sh_audio->sample_format=AF_FORMAT_IMA_ADPCM;break; | |
45 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
|
46 /* case 0x2000: sh_audio->sample_format=AFMT_AC3; */ |
12498 | 47 case 0x20776172: // 'raw ' |
14245 | 48 sh_audio->sample_format=AF_FORMAT_S16_BE; |
49 if(sh_audio->samplesize==1) sh_audio->sample_format=AF_FORMAT_U8; | |
12498 | 50 break; |
8102 | 51 case 0x736F7774: // 'twos' |
14245 | 52 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
|
53 // intended fall-through |
8102 | 54 case 0x74776F73: // 'swot' |
14245 | 55 if(sh_audio->samplesize==1) sh_audio->sample_format=AF_FORMAT_S8; |
12080
1abbfe730adc
Revert my old twos fix, it seems to break more files than it fixed.
rtognimp
parents:
11548
diff
changeset
|
56 // Uncomment this if twos audio is broken for you |
1abbfe730adc
Revert my old twos fix, it seems to break more files than it fixed.
rtognimp
parents:
11548
diff
changeset
|
57 // (typically with movies made on sgi machines) |
1abbfe730adc
Revert my old twos fix, it seems to break more files than it fixed.
rtognimp
parents:
11548
diff
changeset
|
58 // This is just a workaround, the real bug is elsewhere |
1abbfe730adc
Revert my old twos fix, it seems to break more files than it fixed.
rtognimp
parents:
11548
diff
changeset
|
59 #if 0 |
11548 | 60 sh_audio->ds->ss_div= sh_audio->samplesize; |
61 sh_audio->ds->ss_mul= sh_audio->samplesize * sh_audio->channels; | |
12080
1abbfe730adc
Revert my old twos fix, it seems to break more files than it fixed.
rtognimp
parents:
11548
diff
changeset
|
62 #endif |
6233 | 63 break; |
14055 | 64 case 0x32336c66: // 'fl32', bigendian float32 |
14245 | 65 sh_audio->sample_format=AF_FORMAT_FLOAT_BE; |
14055 | 66 sh_audio->samplesize=4; |
67 break; | |
14245 | 68 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
|
69 } |
16134
a1fd1a7eeb35
lavf demuxer with raw PCM fix (and a related hang)
reimar
parents:
14833
diff
changeset
|
70 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
|
71 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
|
72 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
|
73 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
74 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
75 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
|
76 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
77 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
|
78 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
|
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 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
81 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
|
82 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
83 } |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
84 |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
85 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
|
86 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
87 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
|
88 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
|
89 { |
0f12fb7c1c5d
imported from MPlayerXP, dlopen() hack removed, some bugs fixed, interface functions changed to static, info->author field added
arpi
parents:
diff
changeset
|
90 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
|
91 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
|
92 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
|
93 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
|
94 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
|
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 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
|
97 } |
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 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
|
100 { |
16307 | 101 unsigned len = sh_audio->channels*sh_audio->samplesize; |
102 len = maxlen - maxlen % len; // sample align | |
5455 | 103 len=demux_read_data(sh_audio->ds,buf,len); |
104 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
|
105 } |