summaryrefslogtreecommitdiffstats
path: root/libmpdemux/demuxer.c
diff options
context:
space:
mode:
authorarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-01-19 00:21:54 +0000
committerarpi <arpi@b3059339-0415-0410-9bf9-f77b7e298cf2>2003-01-19 00:21:54 +0000
commit970435ce12de15022db3f920b293799462dd7518 (patch)
tree61d49faf24e71afdf7b097ba2431cbe7bb4974b8 /libmpdemux/demuxer.c
parent721a0b6362bd129bfccc9541030df14abe86405a (diff)
downloadmpv-970435ce12de15022db3f920b293799462dd7518.tar.bz2
mpv-970435ce12de15022db3f920b293799462dd7518.tar.xz
extension-based filetype detection for headerless files (mp3 vs mpeg, etc)
inspired by patch by Fabian Franz <FabianFranz@gmx.de> git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@9007 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux/demuxer.c')
-rw-r--r--libmpdemux/demuxer.c70
1 files changed, 43 insertions, 27 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index e8926414dd..5068760200 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -549,8 +549,9 @@ extern demuxer_t* init_avi_with_ogg(demuxer_t* demuxer);
extern int use_rawaudio;
+int extension_parsing=1; // 0=off 1=mixed (used only for unstable formats)
-static demuxer_t* demux_open_stream(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id){
+static demuxer_t* demux_open_stream(stream_t *stream,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){
//int file_format=(*file_format_ptr);
@@ -645,6 +646,43 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_NUV){
demuxer = NULL;
}
}
+//=============== Try to open as REAL file: =================
+if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_REAL){
+ demuxer=new_demuxer(stream,DEMUXER_TYPE_REAL,audio_id,video_id,dvdsub_id);
+ if(real_check_file(demuxer)){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"REAL");
+ file_format=DEMUXER_TYPE_REAL;
+ } else {
+ free_demuxer(demuxer);
+ demuxer = NULL;
+ }
+}
+//=============== Try to open as SMJPEG file: =================
+if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_SMJPEG){
+ demuxer=new_demuxer(stream,DEMUXER_TYPE_SMJPEG,audio_id,video_id,dvdsub_id);
+ if(smjpeg_check_file(demuxer)){
+ mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"SMJPEG");
+ file_format=DEMUXER_TYPE_SMJPEG;
+ } else {
+ free_demuxer(demuxer);
+ demuxer = NULL;
+ }
+}
+
+//=============== Try based on filename EXTENSION: =================
+// Ok. We're over the stable detectable fileformats, the next ones are a bit
+// fuzzy. So by default (extension_parsing==1) try extension-based detection
+// first:
+if(file_format==DEMUXER_TYPE_UNKNOWN && filename && extension_parsing==1){
+ file_format=demuxer_type_by_filename(filename);
+ if(file_format!=DEMUXER_TYPE_UNKNOWN){
+ // we like recursion :)
+ demuxer=demux_open_stream(stream,file_format,audio_id,video_id,dvdsub_id,NULL);
+ if(demuxer) return demuxer; // done!
+ file_format=DEMUXER_TYPE_UNKNOWN; // continue fuzzy guessing...
+ }
+}
+
//=============== Try to open as MOV file: =================
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_MOV){
demuxer=new_demuxer(stream,DEMUXER_TYPE_MOV,audio_id,video_id,dvdsub_id);
@@ -667,17 +705,6 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_VIVO){
demuxer = NULL;
}
}
-//=============== Try to open as REAL file: =================
-if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_REAL){
- demuxer=new_demuxer(stream,DEMUXER_TYPE_REAL,audio_id,video_id,dvdsub_id);
- if(real_check_file(demuxer)){
- mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"REAL");
- file_format=DEMUXER_TYPE_REAL;
- } else {
- free_demuxer(demuxer);
- demuxer = NULL;
- }
-}
//=============== Try to open as FLI file: =================
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_FLI){
demuxer=new_demuxer(stream,DEMUXER_TYPE_FLI,audio_id,video_id,dvdsub_id);
@@ -732,17 +759,6 @@ if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_BMP){
demuxer = NULL;
}
}
-//=============== Try to open as SMJPEG file: =================
-if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_SMJPEG){
- demuxer=new_demuxer(stream,DEMUXER_TYPE_SMJPEG,audio_id,video_id,dvdsub_id);
- if(smjpeg_check_file(demuxer)){
- mp_msg(MSGT_DEMUXER,MSGL_INFO,MSGTR_Detected_XXX_FileFormat,"SMJPEG");
- file_format=DEMUXER_TYPE_SMJPEG;
- } else {
- free_demuxer(demuxer);
- demuxer = NULL;
- }
-}
#ifdef HAVE_OGGVORBIS
//=============== Try to open as Ogg file: =================
if(file_format==DEMUXER_TYPE_UNKNOWN || file_format==DEMUXER_TYPE_OGG){
@@ -1065,7 +1081,7 @@ int demuxer_type = 0, audio_demuxer_type = 0, sub_demuxer_type = 0;
extern int hr_mp3_seek;
-demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id){
+demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int dvdsub_id,char* filename){
stream_t *as = NULL,*ss = NULL;
demuxer_t *vd,*ad = NULL,*sd = NULL;
int afmt = 0,sfmt = 0;
@@ -1085,18 +1101,18 @@ demuxer_t* demux_open(stream_t *vs,int file_format,int audio_id,int video_id,int
}
}
- vd = demux_open_stream(vs,demuxer_type ? demuxer_type : file_format,audio_stream ? -2 : audio_id,video_id, sub_stream ? -2 : dvdsub_id);
+ vd = demux_open_stream(vs,demuxer_type ? demuxer_type : file_format,audio_stream ? -2 : audio_id,video_id, sub_stream ? -2 : dvdsub_id, filename);
if(!vd)
return NULL;
if(as) {
- ad = demux_open_stream(as,audio_demuxer_type ? audio_demuxer_type : afmt,audio_id,-2,-2);
+ ad = demux_open_stream(as,audio_demuxer_type ? audio_demuxer_type : afmt,audio_id,-2,-2, audio_stream);
if(!ad)
mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningAudioDemuxerFailed,audio_stream);
else if(ad->audio->sh && ((sh_audio_t*)ad->audio->sh)->format == 0x55) // MP3
hr_mp3_seek=1; // Enable high res seeking
}
if(ss) {
- sd = demux_open_stream(ss,sub_demuxer_type ? sub_demuxer_type : sfmt,-2,-2,dvdsub_id);
+ sd = demux_open_stream(ss,sub_demuxer_type ? sub_demuxer_type : sfmt,-2,-2,dvdsub_id, sub_stream);
if(!sd)
mp_msg(MSGT_DEMUXER,MSGL_WARN,MSGTR_OpeningSubtitlesDemuxerFailed,sub_stream);
}