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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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
388263fa5a11 FreeBSD fix
nexus
parents: 7867
diff changeset
6 #include <unistd.h>
8451
fb88ccbc5ccc compiler warning fixes
arpi
parents: 8165
diff changeset
7 #include <string.h>
6384
f0b933918a22 Support for playing audio cds using cdparanoia. Include a raw audio
albeu
parents:
diff changeset
8
17012
6ff3379a0862 Unify include path handling, -I.. is in CFLAGS.
diego
parents: 16877
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
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
b849a99cdc3c Second-try commit of this patch.
corey
parents: 17012
diff changeset
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
fe542f0201ea CDDA seeking fixed
arpi
parents: 8451
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
97
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
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
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
100 "Raw audio demuxer",
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
101 "rawaudio",
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
102 "rawaudio",
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
103 "?",
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
104 "",
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
105 DEMUXER_TYPE_RAWAUDIO,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
106 0, // no autodetect
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
107 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
108 demux_rawaudio_fill_buffer,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
109 demux_rawaudio_open,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
110 NULL,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
111 demux_rawaudio_seek,
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
112 NULL
6b86089c2edd Demuxer modularization
rtognimp
parents: 12281
diff changeset
113 };