diff options
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 rel_seek_secs,int flags){ // return value: // 0 = EOF or no stream found // 1 = successfully read a packet -int demux_fli_fill_buffer(demuxer_t *demuxer){ +static int demux_fli_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds){ fli_frames_t *frames = (fli_frames_t *)demuxer->priv; sh_video_t *sh_video = demuxer->video->sh; @@ -67,7 +67,7 @@ int demux_fli_fill_buffer(demuxer_t *demuxer){ |