annotate libmpcodecs/ad_pcm.c @ 16307:03cd6abe5664

avoid reading more than maxlen bytes. Has the sideeffect that the amount read will be close to maxlen instead of minlen as before.
author reimar
date Thu, 25 Aug 2005 19:46:20 +0000
parents a1fd1a7eeb35
children 6ff3379a0862
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
7f8eb5f6814a support for 24 bit pcm/wav files
reimar
parents: 12447
diff changeset
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
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
4edbef7dd28d More support for audio format 0x0
rtognimp
parents: 12498
diff changeset
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
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
33 case 1: sh_audio->sample_format=AF_FORMAT_U8; break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
34 case 2: sh_audio->sample_format=AF_FORMAT_S16_LE; break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
35 case 3: sh_audio->sample_format=AF_FORMAT_S24_LE; break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
42 case 0x6: sh_audio->sample_format=AF_FORMAT_A_LAW;break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
43 case 0x7: sh_audio->sample_format=AF_FORMAT_MU_LAW;break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
44 case 0x11: sh_audio->sample_format=AF_FORMAT_IMA_ADPCM;break;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
827d908c7705 Fix "raw " audio in mov files.
rtognimp
parents: 12478
diff changeset
47 case 0x20776172: // 'raw '
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
48 sh_audio->sample_format=AF_FORMAT_S16_BE;
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
49 if(sh_audio->samplesize==1) sh_audio->sample_format=AF_FORMAT_U8;
12498
827d908c7705 Fix "raw " audio in mov files.
rtognimp
parents: 12478
diff changeset
50 break;
8102
2759150cc687 qt swot support
alex
parents: 7180
diff changeset
51 case 0x736F7774: // 'twos'
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
2759150cc687 qt swot support
alex
parents: 7180
diff changeset
54 case 0x74776F73: // 'swot'
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
1548a38cab3f twos 16bit 2 channels fixed.
rtognimp
parents: 8102
diff changeset
60 sh_audio->ds->ss_div= sh_audio->samplesize;
1548a38cab3f twos 16bit 2 channels fixed.
rtognimp
parents: 8102
diff changeset
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
e2f1b1b8f8b4 8bit 'twos' S8 pcm audio support - fixes MOTI1E.MOV
arpi
parents: 5827
diff changeset
63 break;
14055
efe58d68689e fl32: BE float32 PCM audio in mov files
rtognimp
parents: 13553
diff changeset
64 case 0x32336c66: // 'fl32', bigendian float32
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
65 sh_audio->sample_format=AF_FORMAT_FLOAT_BE;
14055
efe58d68689e fl32: BE float32 PCM audio in mov files
rtognimp
parents: 13553
diff changeset
66 sh_audio->samplesize=4;
efe58d68689e fl32: BE float32 PCM audio in mov files
rtognimp
parents: 13553
diff changeset
67 break;
14245
815f03b7cee5 removing AFMT_ dependancy
alex
parents: 14055
diff changeset
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
03cd6abe5664 avoid reading more than maxlen bytes.
reimar
parents: 16134
diff changeset
101 unsigned len = sh_audio->channels*sh_audio->samplesize;
03cd6abe5664 avoid reading more than maxlen bytes.
reimar
parents: 16134
diff changeset
102 len = maxlen - maxlen % len; // sample align
5455
5546543ae874 cleanup
arpi
parents: 5453
diff changeset
103 len=demux_read_data(sh_audio->ds,buf,len);
5546543ae874 cleanup
arpi
parents: 5453
diff changeset
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 }