diff options
author | rtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-08-05 19:57:47 +0000 |
---|---|---|
committer | rtognimp <rtognimp@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2005-08-05 19:57:47 +0000 |
commit | cd68e1618b17b525bd49757b2f5e245a6cb1a495 (patch) | |
tree | c67656ff189654b818ade76a8f5bd0b7d1bf7f91 /libmpdemux | |
parent | adfe956dc385d6588eb2ab74828f9a905821adf4 (diff) | |
download | mpv-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
Diffstat (limited to 'libmpdemux')
38 files changed, 1392 insertions, 1317 deletions
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){ return 1; } -demuxer_t* demux_open_fli(demuxer_t* demuxer){ +static demuxer_t* demux_open_fli(demuxer_t* demuxer){ sh_video_t *sh_video = NULL; fli_frames_t *frames = (fli_frames_t *)malloc(sizeof(fli_frames_t)); int frame_number; @@ -164,7 +164,7 @@ demuxer_t* demux_open_fli(demuxer_t* demuxer){ return demuxer; } -void demux_close_fli(demuxer_t* demuxer) { +static void demux_close_fli(demuxer_t* demuxer) { fli_frames_t *frames = demuxer->priv; if(!frames) @@ -178,3 +178,34 @@ void demux_close_fli(demuxer_t* demuxer) { free(frames); } + + +static int fli_check_file(demuxer_t* demuxer) +{ + int id; + + stream_seek(demuxer->stream, 4); + id=stream_read_word_le(demuxer->stream); + // check for the FLI file magic number + if((id==0xAF11) || (id==0xAF12)) + return DEMUXER_TYPE_FLI; + + return 0; +} + + +demuxer_desc_t demuxer_desc_fli = { + "Autodesk FLIC demuxer", + "fli", + "FLI", + "Mike Melanson", + "Supports also some extensions", + DEMUXER_TYPE_FLI, + 0, // unsafe autodetect (short signature) + fli_check_file, + demux_fli_fill_buffer, + demux_open_fli, + demux_close_fli, + demux_seek_fli, + NULL +}; diff --git a/libmpdemux/demux_gif.c b/libmpdemux/demux_gif.c index e5dcb47b9b..5c4d8fdadc 100644 --- a/libmpdemux/demux_gif.c +++ b/libmpdemux/demux_gif.c @@ -31,14 +31,14 @@ int my_read_gif(GifFileType *gif, uint8_t *buf, int len) { } #endif -int gif_check_file(demuxer_t *demuxer) +static int gif_check_file(demuxer_t *demuxer) { if (stream_read_int24(demuxer->stream) == GIF_SIGNATURE) - return 1; + return DEMUXER_TYPE_GIF; return 0; } -int demux_gif_fill_buffer(demuxer_t *demuxer) +static int demux_gif_fill_buffer(demuxer_t *demuxer, demux_stream_t *ds) { GifFileType *gif = (GifFileType *)demuxer->priv; sh_video_t *sh_video = (sh_video_t *)demuxer->video->sh; @@ -148,7 +148,7 @@ int demux_gif_fill_buffer(demuxer_t *demuxer) return 1; } -demuxer_t* demux_open_gif(demuxer_t* demuxer) +static demuxe |