summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-05 19:57:47 +0000
committerrtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2>2005-08-05 19:57:47 +0000
commitcd68e1618b17b525bd49757b2f5e245a6cb1a495 (patch)
treec67656ff189654b818ade76a8f5bd0b7d1bf7f91
parentadfe956dc385d6588eb2ab74828f9a905821adf4 (diff)
downloadmpv-cd68e1618b17b525bd49757b2f5e245a6cb1a495.tar.bz2
mpv-cd68e1618b17b525bd49757b2f5e245a6cb1a495.tar.xz
Demuxer modularization
Demuxer selection by name with -demuxer command (bakward compatible) git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@16176 b3059339-0415-0410-9bf9-f77b7e298cf2
-rw-r--r--DOCS/man/en/mplayer.122
-rw-r--r--cfg-common.h6
-rw-r--r--libmpdemux/asfheader.c2
-rw-r--r--libmpdemux/demux_aac.c32
-rw-r--r--libmpdemux/demux_asf.c63
-rw-r--r--libmpdemux/demux_audio.c29
-rw-r--r--libmpdemux/demux_avi.c74
-rw-r--r--libmpdemux/demux_avs.c52
-rw-r--r--libmpdemux/demux_demuxers.c27
-rw-r--r--libmpdemux/demux_film.c36
-rw-r--r--libmpdemux/demux_fli.c39
-rw-r--r--libmpdemux/demux_gif.c28
-rw-r--r--libmpdemux/demux_lavf.c39
-rw-r--r--libmpdemux/demux_lmlm4.c46
-rw-r--r--libmpdemux/demux_mf.c25
-rw-r--r--libmpdemux/demux_mkv.c37
-rw-r--r--libmpdemux/demux_mov.c36
-rw-r--r--libmpdemux/demux_mpc.c29
-rw-r--r--libmpdemux/demux_mpg.c135
-rw-r--r--libmpdemux/demux_nsv.c29
-rw-r--r--libmpdemux/demux_nuv.c29
-rw-r--r--libmpdemux/demux_ogg.c33
-rw-r--r--libmpdemux/demux_pva.c28
-rw-r--r--libmpdemux/demux_rawaudio.c25
-rw-r--r--libmpdemux/demux_rawdv.c34
-rw-r--r--libmpdemux/demux_rawvideo.c25
-rw-r--r--libmpdemux/demux_real.c34
-rw-r--r--libmpdemux/demux_realaud.c29
-rw-r--r--libmpdemux/demux_roq.c26
-rw-r--r--libmpdemux/demux_rtp.cpp17
-rw-r--r--libmpdemux/demux_smjpeg.c29
-rw-r--r--libmpdemux/demux_ts.c34
-rw-r--r--libmpdemux/demux_ty.c47
-rw-r--r--libmpdemux/demux_viv.c33
-rw-r--r--libmpdemux/demux_vqf.c29
-rw-r--r--libmpdemux/demux_xmms.c30
-rw-r--r--libmpdemux/demux_y4m.c32
-rw-r--r--libmpdemux/demuxer.c1366
-rw-r--r--libmpdemux/demuxer.h39
-rw-r--r--libmpdemux/tv.c32
-rw-r--r--mencoder.c3
-rw-r--r--mplayer.c12
42 files changed, 1424 insertions, 1328 deletions
diff --git a/DOCS/man/en/mplayer.1 b/DOCS/man/en/mplayer.1
index b9f2db92f9..0454c6da11 100644
--- a/DOCS/man/en/mplayer.1
+++ b/DOCS/man/en/mplayer.1
@@ -785,10 +785,12 @@ Plays a Matroska file in Japanese.
.PD 1
.
.TP
-.B \-audio-demuxer <number> (\-audiofile only)
+.B \-audio-demuxer <name> (\-audiofile only)
Force audio demuxer type for \-audiofile.
-Give the demuxer ID as defined in libmpdemux/\:demuxer.h.
-\-audio-demuxer 17 forces MP3.
+Give the demuxer name as printed by \-audio-demuxer help.
+For backward compatibility it also accepts the demuxer ID as defined in
+libmpdemux/\:demuxer.h.
+\-audio-demuxer audio or \-audio-demuxer 17 forces MP3.
.
.TP
.B \-audiofile <filename>
@@ -921,10 +923,12 @@ When used with MEncoder, this is not guaranteed to work correctly
with \-ovc copy.
.
.TP
-.B \-demuxer <number>
+.B \-demuxer <name>
Force demuxer type.
-Give the demuxer ID as defined in libmpdemux/\:demuxer.h.
-\-demuxer 17 forces MP3.
+Give the demuxer name as printed by \-demuxer help.
+For backward compatibility it also accepts the demuxer ID as defined in
+libmpdemux/\:demuxer.h.
+\-demuxer audio or \-demuxer 17 forces MP3.
.
.TP
.B \-dumpaudio (MPlayer only)
@@ -1579,9 +1583,11 @@ intensity of the color.
255 means white and 0 black.
.
.TP
-.B \-sub-demuxer <number> (\-subfile only) (BETA CODE)
+.B \-sub-demuxer <name> (\-subfile only) (BETA CODE)
Force subtitle demuxer type for \-subfile.
-Give the demuxer ID as defined in subreader.h.
+Give the demuxer name as printed by \-sub-demuxer help.
+For backward compatibility it also accepts the demuxer ID as defined in
+libmpdemux/\:demuxer.h.
.
.TP
.B \-sub-fuzziness <mode>
diff --git a/cfg-common.h b/cfg-common.h
index f4b278d8bd..a15b866419 100644
--- a/cfg-common.h
+++ b/cfg-common.h
@@ -113,9 +113,9 @@
{ "audiofile", &audio_stream, CONF_TYPE_STRING, 0, 0, 0, NULL },
{ "audiofile-cache", &audio_stream_cache, CONF_TYPE_INT, CONF_RANGE, 50, 65536, NULL},
{ "subfile", &sub_stream, CONF_TYPE_STRING, 0, 0, 0, NULL },
- { "demuxer", &demuxer_type, CONF_TYPE_INT, CONF_RANGE, 1, DEMUXER_TYPE_MAX, NULL },
- { "audio-demuxer", &audio_demuxer_type, CONF_TYPE_INT, CONF_RANGE, 1, DEMUXER_TYPE_MAX, NULL },
- { "sub-demuxer", &sub_demuxer_type, CONF_TYPE_INT, CONF_RANGE, 1, DEMUXER_TYPE_MAX, NULL },
+ { "demuxer", &demuxer_name, CONF_TYPE_STRING, 0, 0, 0, NULL },
+ { "audio-demuxer", &audio_demuxer_name, CONF_TYPE_STRING, 0, 0, 0, NULL },
+ { "sub-demuxer", &sub_demuxer_name, CONF_TYPE_STRING, 0, 0, 0, NULL },
{ "extbased", &extension_parsing, CONF_TYPE_FLAG, 0, 0, 1, NULL },
{ "noextbased", &extension_parsing, CONF_TYPE_FLAG, 0, 1, 0, NULL },
diff --git a/libmpdemux/asfheader.c b/libmpdemux/asfheader.c
index 63829ee7e1..ef2be8a62d 100644
--- a/libmpdemux/asfheader.c
+++ b/libmpdemux/asfheader.c
@@ -135,7 +135,7 @@ int asf_check_header(demuxer_t *demuxer){
mp_msg(MSGT_HEADER,MSGL_V,"ASF_check: invalid subchunks_no %d\n",(int) asfh.cno);
return 0; // invalid header???
}
- return 1;
+ return DEMUXER_TYPE_ASF;
}
extern void print_wave_header(WAVEFORMATEX *h);
diff --git a/libmpdemux/demux_aac.c b/libmpdemux/demux_aac.c
index fd97142155..d1215450b3 100644
--- a/libmpdemux/demux_aac.c
+++ b/libmpdemux/demux_aac.c
@@ -64,7 +64,7 @@ static int demux_aac_init(demuxer_t *demuxer)
return 1;
}
-void demux_close_aac(demuxer_t *demuxer)
+static void demux_close_aac(demuxer_t *demuxer)
{
aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
@@ -79,8 +79,8 @@ void demux_close_aac(demuxer_t *demuxer)
return;
}
-/// returns 1 if it finds 8 ADTS frames in 32768 bytes, 0 otherwise
-int demux_aac_probe(demuxer_t *demuxer)
+/// returns DEMUXER_TYPE_AAC if it finds 8 ADTS frames in 32768 bytes, 0 otherwise
+static int demux_aac_probe(demuxer_t *demuxer)
{
int cnt = 0, c, len, srate, num;
off_t init, probed;
@@ -122,14 +122,14 @@ int demux_aac_probe(demuxer_t *demuxer)
goto fail;
mp_msg(MSGT_DEMUX, MSGL_V, "demux_aac_probe, INIT: %llu, PROBED: %llu, cnt: %d\n", init, probed, cnt);
- return 1;
+ return DEMUXER_TYPE_AAC;
fail:
mp_msg(MSGT_DEMUX, MSGL_V, "demux_aac_probe, failed to detect an AAC stream\n");
return 0;
}
-int demux_aac_open(demuxer_t *demuxer)
+static demuxer_t* demux_aac_open(demuxer_t *demuxer)
{
sh_audio_t *sh;
@@ -140,10 +140,10 @@ int demux_aac_open(demuxer_t *demuxer)
demuxer->filepos = stream_tell(demuxer->stream);
- return 1;
+ return demuxer;
}
-int demux_aac_fill_buffer(demuxer_t *demuxer)
+static int demux_aac_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
{
aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
demux_packet_t *dp;
@@ -209,7 +209,7 @@ int demux_aac_fill_buffer(demuxer_t *demuxer)
//This is an almost verbatim copy of high_res_mp3_seek(), from demux_audio.c
-void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
+static void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
{
aac_priv_t *priv = (aac_priv_t *) demuxer->priv;
demux_stream_t *d_audio=demuxer->audio;
@@ -251,3 +251,19 @@ void demux_aac_seek(demuxer_t *demuxer, float rel_seek_secs, int flags)
resync_audio_stream(sh_audio);
}
+
+demuxer_desc_t demuxer_desc_aac = {
+ "AAC demuxer",
+ "aac",
+ "AAC",
+ "Nico Sabbi",
+ "Raw AAC files ",
+ DEMUXER_TYPE_AAC,
+ 0, // unsafe autodetect
+ demux_aac_probe,
+ demux_aac_fill_buffer,
+ demux_aac_open,
+ demux_close_aac,
+ demux_aac_seek,
+ NULL
+};
diff --git a/libmpdemux/demux_asf.c b/libmpdemux/demux_asf.c
index 40066fa718..48408dd2d4 100644
--- a/libmpdemux/demux_asf.c
+++ b/libmpdemux/demux_asf.c
@@ -38,6 +38,8 @@ extern int asf_scrambling_b;
extern int asf_packetsize;
extern double asf_packetrate;
extern int asf_movielength;
+extern int asf_check_header(demuxer_t *demuxer);
+extern int read_asf_header(demuxer_t *demuxer);
// based on asf file-format doc by Eugene [http://divx.euro.ru]
@@ -140,7 +142,7 @@ static int demux_asf_read_packet(demuxer_t *demux,unsigned char *data,int len,in
// return value:
// 0 = EOF or no stream found
// 1 = successfully read a packet
-int demux_asf_fill_buffer(demuxer_t *demux){
+static int demux_asf_fill_buffer(demuxer_t *demux, demux_stream_t *ds){
demux->filepos=stream_tell(demux->stream);
// Brodcast stream have movi_start==movi_end
@@ -360,7 +362,7 @@ int demux_asf_fill_buffer(demuxer_t *demux){
extern void resync_audio_stream(sh_audio_t *sh_audio);
extern void skip_audio_frame(sh_audio_t *sh_audio);
-void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
+static void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
demux_stream_t *d_audio=demuxer->audio;
demux_stream_t *d_video=demuxer->video;
sh_audio_t *sh_audio=d_audio->sh;
@@ -412,7 +414,7 @@ void demux_seek_asf(demuxer_t *demuxer,float rel_seek_secs,int flags){
}
-int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
+static int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
/* demux_stream_t *d_audio=demuxer->audio;
demux_stream_t *d_video=demuxer->video;
sh_audio_t *sh_audio=d_audio->sh;
@@ -430,3 +432,58 @@ int demux_asf_control(demuxer_t *demuxer,int cmd, void *arg){
return DEMUXER_CTRL_NOTIMPL;
}
}
+
+
+static demuxer_t* demux_open_asf(demuxer_t* demuxer)
+{
+ sh_audio_t *sh_audio=NULL;
+ sh_video_t *sh_video=NULL;
+
+ //---- ASF header:
+ read_asf_header(demuxer);
+ stream_reset(demuxer->stream);
+ stream_seek(demuxer->stream,demuxer->movi_start);
+// demuxer->idx_pos=0;
+// demuxer->endpos=avi_header.movi_end;
+ if(demuxer->video->id != -2) {
+ if(!ds_fill_buffer(demuxer->video)){
+ mp_msg(MSGT_DEMUXER,MSGL_WARN,"ASF: " MSGTR_MissingVideoStream);
+ demuxer->video->sh=NULL;
+ //printf("ASF: missing video stream!? contact the author, it may be a bug :(\n");
+ } else {
+ sh_video=demuxer->video->sh;sh_video->ds=demuxer->video;
+ sh_video->fps=1000.0f; sh_video->frametime=0.001f; // 1ms
+ //sh_video->i_bps=10*asf_packetsize; // FIXME!
+ }
+ }
+
+ if(demuxer->audio->id!=-2){
+ mp_msg(MSGT_DEMUXER,MSGL_V,MSGTR_ASFSearchingForAudioStream,demuxer->audio->id);
+ if(!ds_fill_buffer(demuxer->audio)){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,"ASF: " MSGTR_MissingAudioStream);
+ demuxer->audio->sh=NULL;
+ } else {
+ sh_audio=demuxer->audio->sh;sh_audio->ds=demuxer->audio;
+ sh_audio->format=sh_audio->wf->wFormatTag;
+ }
+ }
+
+ return demuxer;
+}
+
+
+demuxer_desc_t demuxer_desc_asf = {
+ "ASF demuxer",
+ "asv",
+ "ASF",
+ "A'rpi",
+ "ASF, WMV, WMA",
+ DEMUXER_TYPE_ASF,
+ 1, // safe autodetect
+ asf_check_header,
+ demux_asf_fill_buffer,
+ demux_open_asf,
+ NULL, //demux_close_asf,
+ demux_seek_asf,
+ demux_asf_control
+};
diff --git a/libmpdemux/demux_audio.c b/libmpdemux/demux_audio.c
index 309c064272..3b0ec6c5ad 100644
--- a/libmpdemux/demux_audio.c
+++ b/libmpdemux/demux_audio.c
@@ -131,7 +131,7 @@ static mp3_hdr_t *add_mp3_hdr(mp3_hdr_t **list, off_t st_pos,
return NULL;
}
-int demux_audio_open(demuxer_t* demuxer) {
+static int demux_audio_open(demuxer_t* demuxer) {
stream_t *s;
sh_audio_t* sh_audio;
uint8_t hdr[HDR_SIZE];
@@ -383,11 +383,11 @@ int demux_audio_open(demuxer_t* demuxer) {
mp_msg(MSGT_DEMUX,MSGL_V,"demux_audio: audio data 0x%X - 0x%X \n",(int)demuxer->movi_start,(int)demuxer->movi_end);
- return 1;
+ return DEMUXER_TYPE_AUDIO;
}
-int demux_audio_fill_buffer(demux_stream_t *ds) {
+static int demux_audio_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) {
int l;
demux_packet_t* dp;
sh_audio_t* sh_audio;
@@ -471,7 +471,7 @@ static void high_res_mp3_seek(demuxer_t *demuxer,float time) {
}
}
-void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){
+static void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){
sh_audio_t* sh_audio;
stream_t* s;
int base,pos;
@@ -527,7 +527,7 @@ void demux_audio_seek(demuxer_t *demuxer,float rel_seek_secs,int flags){
}
-void demux_close_audio(demuxer_t* demuxer) {
+static void demux_close_audio(demuxer_t* demuxer) {
da_priv_t* priv = demuxer->priv;
if(!priv)
@@ -535,7 +535,7 @@ void demux_close_audio(demuxer_t* demuxer) {
free(priv);
}
-int demux_audio_control(demuxer_t *demuxer,int cmd, void *arg){
+static int demux_audio_control(demuxer_t *demuxer,int cmd, void *arg){
sh_audio_t *sh_audio=demuxer->audio->sh;
int audio_length = demuxer->movi_end / sh_audio->i_bps;
da_priv_t* priv = demuxer->priv;
@@ -556,3 +556,20 @@ int demux_audio_control(demuxer_t *demuxer,int cmd, void *arg){
return DEMUXER_CTRL_NOTIMPL;
}
}
+
+
+demuxer_desc_t demuxer_desc_audio = {
+ "Audio demuxer",
+ "audio",
+ "Audio file",
+ "?",
+ "Audio only files",
+ DEMUXER_TYPE_AUDIO,
+ 0, // unsafe autodetect
+ demux_audio_open,
+ demux_audio_fill_buffer,
+ NULL,
+ demux_close_audio,
+ demux_audio_seek,
+ demux_audio_control
+};
diff --git a/libmpdemux/demux_avi.c b/libmpdemux/demux_avi.c
index 4edf4e5c5e..8846079e57 100644
--- a/libmpdemux/demux_avi.c
+++ b/libmpdemux/demux_avi.c
@@ -14,6 +14,9 @@
#include "aviheader.h"
+extern demuxer_t* init_avi_with_ogg(demuxer_t* demuxer);
+extern int demux_ogg_open(demuxer_t* demuxer);
+
// PTS: 0=interleaved 1=BPS-based
int pts_from_bps=1;
@@ -173,7 +176,7 @@ static int demux_avi_read_packet(demuxer_t *demux,demux_stream_t *ds,unsigned in
// return value:
// 0 = EOF or no stream found
// 1 = successfully read a packet
-int demux_avi_fill_buffer(demuxer_t *demux){
+static int demux_avi_fill_buffer(demuxer_t *demux, demux_stream_t *dsds){
avi_priv_t *priv=demux->priv;
unsigned int id=0;
unsigned int len;
@@ -430,7 +433,7 @@ int force_ni=0; // force non-interleaved AVI parsing
void read_avi_header(demuxer_t *demuxer,int index_mode);
-demuxer_t* demux_open_avi(demuxer_t* demuxer){
+static demuxer_t* demux_open_avi(demuxer_t* demuxer){
demux_stream_t *d_audio=demuxer->audio;
demux_stream_t *d_video=demuxer->video;
sh_audio_t *sh_audio=NULL;
@@ -856,3 +859,70 @@ int demux_avi_control(demuxer_t *demuxer,int cmd, void *arg){
return DEMUXER_CTRL_NOTIMPL;
}
}
+
+
+static int avi_check_file(demuxer_t *demuxer)
+{
+ int id=stream_read_dword_le(demuxer->stream); // "RIFF"
+
+ if((id==mmioFOURCC('R','I','F','F')) || (id==mmioFOURCC('O','N','2',' '))) {
+ stream_read_dword_le(demuxer->stream); //filesize
+ id=stream_read_dword_le(demuxer->stream); // "AVI "
+ if(id==formtypeAVI)
+ return DEMUXER_TYPE_AVI;
+ if(id==mmioFOURCC('O','N','2','f')){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,"ON2 AVI format");
+ return DEMUXER_TYPE_AVI;
+ }
+ }
+
+ return 0;
+}
+
+
+static demuxer_t* demux_open_hack_avi(demuxer_t *demuxer)
+{
+ sh_audio_t* sh_a;
+
+ demuxer = (demuxer_t*) demux_open_avi(demuxer);
+ if(!demuxer) return NULL; // failed to open
+ sh_a = (sh_audio_t*)demuxer->audio->sh;
+ if(demuxer->audio->id != -2 && sh_a) {
+#ifdef HAVE_OGGVORBIS
+ // support for Ogg-in-AVI:
+ if(sh_a->format == 0xFFFE)
+ demuxer = init_avi_with_ogg(demuxer);
+ else if(sh_a->format == 0x674F) {
+ stream_t* s;
+ demuxer_t *od;
+ s = new_ds_stream(demuxer->audio);
+ od = new_demuxer(s,DEMUXER_TYPE_OGG,-1,-2,-2,NULL);
+ if(!demux_ogg_open(od)) {
+ mp_msg( MSGT_DEMUXER,MSGL_ERR,MSGTR_ErrorOpeningOGGDemuxer);
+ free_stream(s);
+ demuxer->audio->id = -2;
+ } else
+ demuxer = new_demuxers_demuxer(demuxer,od,demuxer);
+ }
+#endif
+ }
+
+ return demuxer;
+}
+
+
+demuxer_desc_t demuxer_desc_avi = {
+ "AVI demuxer",
+ "avi",
+ "AVI",
+ "Arpi?",
+ "AVI files, including non interleaved files",
+ DEMUXER_TYPE_AVI,
+ 1, // safe autodetect
+ avi_check_file,
+ demux_avi_fill_buffer,
+ demux_open_hack_avi,
+ demux_close_avi,
+ demux_seek_avi,
+ NULL
+};
diff --git a/libmpdemux/demux_avs.c b/libmpdemux/demux_avs.c
index f701499a16..97d8766287 100644
--- a/libmpdemux/demux_avs.c
+++ b/libmpdemux/demux_avs.c
@@ -162,7 +162,7 @@ static __inline int get_mmioFOURCC(const AVS_VideoInfo *v)
}
#endif
-int demux_avs_fill_buffer(demuxer_t *demuxer)
+static int demux_avs_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
{
AVS_VideoFrame *curr_frame;
demux_packet_t *dp = NULL;
@@ -219,7 +219,7 @@ int demux_avs_fill_buffer(demuxer_t *demuxer)
return 1;
}
-int demux_open_avs(demuxer_t* demuxer)
+static demuxer_t* demux_open_avs(demuxer_t* demuxer)
{
sh_video_t *sh_video = NULL;
#ifdef ENABLE_AUDIO
@@ -236,14 +236,14 @@ int demux_open_avs(demuxer_t* demuxer)
if(!AVS->clip)
{
mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_take_clip() failed\n");
- return 0;
+ return NULL;
}
AVS->video_info = AVS->avs_get_video_info(AVS->clip);
if (!AVS->video_info)
{
mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_get_video_info() call failed\n");
- return 0;
+ return NULL;
}
if (!avs_is_yv12(AVS->video_info))
@@ -252,7 +252,7 @@ int demux_open_avs(demuxer_t* demuxer)
if (avs_is_error(AVS->handler))
{
mp_msg(MSGT_DEMUX, MSGL_V, "AVS: Cannot convert input video to YV12: %s\n", avs_as_string(AVS->handler));
- return 0;
+ return NULL;
}
AVS->clip = AVS->avs_take_clip(AVS->handler, AVS->avs_env);
@@ -260,14 +260,14 @@ int demux_open_avs(demuxer_t* demuxer)
if(!AVS->clip)
{
mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_take_clip() failed\n");
- return 0;
+ return NULL;
}
AVS->video_info = AVS->avs_get_video_info(AVS->clip);
if (!AVS->video_info)
{
mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_get_video_info() call failed\n");
- return 0;
+ return NULL;
}
}
@@ -326,10 +326,13 @@ int demux_open_avs(demuxer_t* demuxer)
#endif
AVS->init = 1;
- return found;
+ if (found)
+ return demuxer;
+ else
+ return NULL;
}
-int demux_avs_control(demuxer_t *demuxer, int cmd, void *arg)
+static int demux_avs_control(demuxer_t *demuxer, int cmd, void *arg)
{
demux_stream_t *d_video=demuxer->video;
sh_video_t *sh_video=d_video->sh;
@@ -354,7 +357,7 @@ int demux_avs_control(demuxer_t *demuxer, int cmd, void *arg)
}
}
-void demux_close_avs(demuxer_t* demuxer)
+static void demux_close_avs(demuxer_t* demuxer)
{
AVS_T *AVS = (AVS_T *) demuxer->priv;
// TODO release_clip?
@@ -372,7 +375,7 @@ void demux_close_avs(demuxer_t* demuxer)
}
}
-void demux_seek_avs(demuxer_t *demuxer, float rel_seek_secs,int flags)
+static void demux_seek_avs(demuxer_t *demuxer, float rel_seek_secs,int flags)
{
demux_stream_t *d_video=demuxer->video;
sh_video_t *sh_video=d_video->sh;
@@ -394,11 +397,11 @@ void demux_seek_avs(demuxer_t *demuxer, float rel_seek_secs,int flags)
d_video->pts=AVS->frameno / sh_video->fps; // OSD
}
-int avs_check_file(demuxer_t *demuxer, const char *filename)
+static int avs_check_file(demuxer_t *demuxer)
{
- mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_check_file - attempting to open file %s\n", filename);
+ mp_msg(MSGT_DEMUX, MSGL_V, "AVS: avs_check_file - attempting to open file %s\n", demuxer->filename);
- if (!filename) return 0;
+ if (!demuxer->filename) return 0;
/* Avoid crazy memory eating when passing an mpg stream */
if (demuxer->movi_end > MAX_AVS_SIZE)
@@ -407,13 +410,30 @@ int avs_check_file(demuxer_t *demuxer, const char *filename)
return 0;
}
- demuxer->priv = initAVS(filename);
+ demuxer->priv = initAVS(demuxer->filename);
if (demuxer->priv)
{
mp_msg(MSGT_DEMUX,MSGL_V, "AVS: Init Ok\n");
- return 1;
+ return DEMUXER_TYPE_AVS;
}
mp_msg(MSGT_DEMUX,MSGL_V, "AVS: Init failed\n");
return 0;
}
+
+
+demuxer_desc_t demuxer_desc_avs = {
+ "Avisynth demuxer",
+ "avs",
+ "AVS",
+ "Gianluigi Tiesi",
+ "Requires binary dll",
+ DEMUXER_TYPE_AVS,
+ 0, // unsafe autodetect
+ avs_check_file,
+ demux_avs_fill_buffer,
+ demux_open_avs,
+ demux_close_avs,
+ demux_seek_avs,
+ demux_avs_control
+};
diff --git a/libmpdemux/demux_demuxers.c b/libmpdemux/demux_demuxers.c
index e0e7680348..6edfddb3c2 100644
--- a/libmpdemux/demux_demuxers.c
+++ b/libmpdemux/demux_demuxers.c
@@ -13,6 +13,7 @@ typedef struct dd_priv {
demuxer_t* sd;
} dd_priv_t;
+extern demuxer_desc_t demuxer_desc_demuxers;
demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
demuxer_t* ret;
@@ -34,11 +35,13 @@ demuxer_t* new_demuxers_demuxer(demuxer_t* vd, demuxer_t* ad, demuxer_t* sd) {
ret->video = vd->video;
ret->audio = ad->audio;
ret->sub = sd->sub;
-
+
+ ret->desc = &demuxer_desc_demuxers;
+
return ret;
}
-int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
+static int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
dd_priv_t* priv;
priv=demux->priv;
@@ -54,7 +57,7 @@ int demux_demuxers_fill_buffer(demuxer_t *demux,demux_stream_t *ds) {
return 0;
}
-void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
+static void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
dd_priv_t* priv;
float pos;
priv=demuxer->priv;
@@ -81,7 +84,7 @@ void demux_demuxers_seek(demuxer_t *demuxer,float rel_seek_secs,int flags) {
}
-void demux_close_demuxers(demuxer_t* demuxer) {
+static void demux_close_demuxers(demuxer_t* demuxer) {
int i;
dd_priv_t* priv = demuxer->priv;
stream_t *s;
@@ -109,3 +112,19 @@ void demux_close_demuxers(demuxer_t* demuxer) {
free(demuxer);
}
+
+demuxer_desc_t demuxer_desc_demuxers = {
+ "Demuxers demuxer",
+ "", // Not selectable
+ "",
+ "?",
+ "internal use only",
+ DEMUXER_TYPE_DEMUXERS,
+ 0, // no autodetect
+ NULL,
+ demux_demuxers_fill_buffer,
+ NULL,
+ demux_close_demuxers,
+ demux_demuxers_seek,
+ NULL
+};
diff --git a/libmpdemux/demux_film.c b/libmpdemux/demux_film.c
index 4c19448785..7d42055d37 100644
--- a/libmpdemux/demux_film.c
+++ b/libmpdemux/demux_film.c
@@ -46,7 +46,7 @@ typedef struct _film_data_t
unsigned int film_version;
} film_data_t;
-void demux_seek_film(demuxer_t *demuxer, float rel_seek_secs, int flags)
+static void demux_seek_film(demuxer_t *demuxer, float rel_seek_secs, int flags)
{
film_data_t *film_data = (film_data_t *)demuxer->priv;
int new_current_chunk=(flags&1)?0:film_data->current_chunk;
@@ -83,7 +83,7 @@ printf (" (flags = %X) actual new chunk = %d (syncinfo1 = %08X)\n",
// return value:
// 0 = EOF or no stream found
// 1 = successfully read a packet
-int demux_film_fill_buffer(demuxer_t *demuxer)
+static int demux_film_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds)
{
int i;
unsigned char byte_swap;
@@ -206,7 +206,7 @@ int demux_film_fill_buffer(demuxer_t *demuxer)
return 1;
}
-demuxer_t* demux_open_film(demuxer_t* demuxer)
+static demuxer_t* demux_open_film(demuxer_t* demuxer)
{
sh_video_t *sh_video = NULL;
sh_audio_t *sh_audio = NULL;
@@ -436,7 +436,7 @@ demuxer_t* demux_open_film(demuxer_t* demuxer)
return demuxer;
}
-void demux_close_film(demuxer_t* demuxer) {
+static void demux_close_film(demuxer_t* demuxer) {
film_data_t *film_data = demuxer->priv;
if(!film_data)
@@ -446,3 +446,31 @@ void demux_close_film(demuxer_t* demuxer) {
free(film_data);
}
+
+static int film_check_file(demuxer_t* demuxer)
+{
+ int signature=stream_read_fourcc(demuxer->stream);
+
+ // check for the FILM file magic number
+ if(signature==mmioFOURCC('F', 'I', 'L', 'M'))
+ return DEMUXER_TYPE_FILM;
+
+ return 0;
+}
+
+
+demuxer_desc_t demuxer_desc_film = {
+ "FILM/CPK demuxer for Sega Saturn CD-ROM games",
+ "film",
+ "FILM",
+ "Mike Melanson",
+ "",
+ DEMUXER_TYPE_FILM,
+ 0, // unsafe autodetect (short signature)
+ film_check_file,
+ demux_film_fill_buffer,
+ demux_open_film,
+ demux_close_film,
+ demux_seek_film,
+ NULL
+};
diff --git a/libmpdemux/demux_fli.c b/libmpdemux/demux_fli.c
index 0b7f0a428e..2b23835c52 100644
--- a/libmpdemux/demux_fli.c
+++ b/libmpdemux/demux_fli.c
@@ -22,7 +22,7 @@ typedef struct _fli_frames_t {
unsigned int *frame_size;
} fli_frames_t;
-void demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,int flags){
+static void demux_seek_fli(demuxer_t *demuxer,float rel_seek_secs,int flags){
fli_frames_t *frames = (fli_frames_t *)demuxer->priv;
sh_video_t *sh_video = demuxer->video->sh;
int newpos=(flags&1)?0:frames->current_frame;
@@ -41,7 +41,7 @@ void demux_seek_fli(demuxer_t *demuxer,float re