Mercurial > mplayer.hg
annotate libmpdemux/demux_rawaudio.c @ 26883:a365271c97a5
Revert commit r26897.
XviD is the correct spelling of the codec.
You can see it written in the codec own
documentation and header files.
Prefered name capitalization confirmed
in conversation with XviD developer (prunedtree).
author | iive |
---|---|
date | Wed, 28 May 2008 23:04:41 +0000 |
parents | 2dc23fc4724a |
children | d643e4643313 |
rev | line source |
---|---|
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
1 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
2 #include "config.h" |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
3 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
4 #include <stdlib.h> |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
5 #include <stdio.h> |
8165 | 6 #include <unistd.h> |
8451 | 7 #include <string.h> |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
8 |
17012 | 9 #include "m_option.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
10 |
22605
4d81dbdf46b9
Add explicit location for headers from the stream/ directory.
diego
parents:
19062
diff
changeset
|
11 #include "stream/stream.h" |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
12 #include "demuxer.h" |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
13 #include "stheader.h" |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
14 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
15 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
16 static int channels = 2; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
17 static int samplerate = 44100; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
18 static int samplesize = 2; |
12281
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
19 static int bitrate = 0; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
20 static int format = 0x1; // Raw PCM |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
21 |
25241
bb7c65f2a289
Make m_option_t arrays referenced by cfg-common.h const
reimar
parents:
22605
diff
changeset
|
22 const m_option_t demux_rawaudio_opts[] = { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
23 { "channels", &channels, CONF_TYPE_INT,CONF_RANGE,1,8, NULL }, |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
24 { "rate", &samplerate, CONF_TYPE_INT,CONF_RANGE,1000,8*48000, NULL }, |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
25 { "samplesize", &samplesize, CONF_TYPE_INT,CONF_RANGE,1,8, NULL }, |
12281
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
26 { "bitrate", &bitrate, CONF_TYPE_INT,CONF_MIN,0,0, NULL }, |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
27 { "format", &format, CONF_TYPE_INT, CONF_MIN, 0 , 0, NULL }, |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
28 {NULL, NULL, 0, 0, 0, 0, NULL} |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
29 }; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
30 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
31 |
16175 | 32 static demuxer_t* demux_rawaudio_open(demuxer_t* demuxer) { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
33 sh_audio_t* sh_audio; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
34 WAVEFORMATEX* w; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
35 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
36 sh_audio = new_sh_audio(demuxer,0); |
19062
83c3afeab35d
drops casts from void * on malloc/calloc from libmpdemux code
reynaldo
parents:
18710
diff
changeset
|
37 sh_audio->wf = w = malloc(sizeof(WAVEFORMATEX)); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
38 w->wFormatTag = sh_audio->format = format; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
39 w->nChannels = sh_audio->channels = channels; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
40 w->nSamplesPerSec = sh_audio->samplerate = samplerate; |
12281
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
41 if (bitrate > 999) |
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
42 w->nAvgBytesPerSec = bitrate/8; |
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
43 else if (bitrate > 0) |
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
44 w->nAvgBytesPerSec = bitrate*125; |
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
45 else |
e6f6dac5d77b
needed for a/v sync with compressed audio (e.g. raw .mp2 or .ac3 file)
rfelker
parents:
10891
diff
changeset
|
46 w->nAvgBytesPerSec = samplerate*samplesize*channels; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
47 w->nBlockAlign = channels*samplesize; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
48 sh_audio->samplesize = samplesize; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
49 w->wBitsPerSample = 8*samplesize; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
50 w->cbSize = 0; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
51 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
52 demuxer->movi_start = demuxer->stream->start_pos; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
53 demuxer->movi_end = demuxer->stream->end_pos; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
54 |
26299
4d56038ec730
Fix lots and lots of other demuxers broken by r26301
reimar
parents:
25883
diff
changeset
|
55 demuxer->audio->id = 0; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
56 demuxer->audio->sh = sh_audio; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
57 sh_audio->ds = demuxer->audio; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
58 |
16175 | 59 return demuxer; |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
60 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
61 |
16175 | 62 static int demux_rawaudio_fill_buffer(demuxer_t* demuxer, demux_stream_t *ds) { |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
63 sh_audio_t* sh_audio = demuxer->audio->sh; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
64 int l = sh_audio->wf->nAvgBytesPerSec; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
65 off_t spos = stream_tell(demuxer->stream); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
66 demux_packet_t* dp; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
67 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
68 if(demuxer->stream->eof) |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
69 return 0; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
70 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
71 dp = new_demux_packet(l); |
9707
53e738a54064
Fix a 100L bug wich killed mencoder timing and switch to the new
albeu
parents:
8524
diff
changeset
|
72 dp->pts = (spos - demuxer->movi_start) / (float)(sh_audio->wf->nAvgBytesPerSec); |
53e738a54064
Fix a 100L bug wich killed mencoder timing and switch to the new
albeu
parents:
8524
diff
changeset
|
73 dp->pos = (spos - demuxer->movi_start); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
74 |
10891
65ed62e138fa
Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents:
10594
diff
changeset
|
75 l = stream_read(demuxer->stream,dp->buffer,l); |
65ed62e138fa
Fixed 'reading after EOF'. demuxers didn't check, how many they've read!
lumag
parents:
10594
diff
changeset
|
76 resize_demux_packet(dp, l); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
77 ds_add_packet(ds,dp); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
78 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
79 return 1; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
80 } |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
81 |
17636 | 82 static void demux_rawaudio_seek(demuxer_t *demuxer,float rel_seek_secs,float audio_delay,int flags){ |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
83 stream_t* s = demuxer->stream; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
84 sh_audio_t* sh_audio = demuxer->audio->sh; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
85 off_t base,pos; |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
86 |
25883
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
87 base = (flags & SEEK_ABSOLUTE) ? demuxer->movi_start : stream_tell(s); |
baf32110d3fc
Use defines to give names to the different seek flags.
reimar
parents:
25707
diff
changeset
|
88 if(flags & SEEK_FACTOR) |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
89 pos = base + ((demuxer->movi_end - demuxer->movi_start)*rel_seek_secs); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
90 else |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
91 pos = base + (rel_seek_secs*sh_audio->i_bps); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
92 |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
93 pos -= (pos % (sh_audio->channels * sh_audio->samplesize) ); |
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
94 stream_seek(s,pos); |
8524 | 95 // printf("demux_rawaudio: streamtell=%d\n",(int)stream_tell(demuxer->stream)); |
6384
f0b933918a22
Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff
changeset
|
96 } |
16175 | 97 |
98 | |
25707
d4fe6e23283e
Make all demuxer_desc_t const, thus moving them to .rodata
reimar
parents:
25241
diff
changeset
|
99 const demuxer_desc_t demuxer_desc_rawaudio = { |
16175 | 100 "Raw audio demuxer", |
101 "rawaudio", | |
102 "rawaudio", | |
103 "?", | |
104 "", | |
105 DEMUXER_TYPE_RAWAUDIO, | |
106 0, // no autodetect | |
107 NULL, | |
108 demux_rawaudio_fill_buffer, | |
109 demux_rawaudio_open, | |
110 NULL, | |
111 demux_rawaudio_seek, | |
112 NULL | |
113 }; |