stream/tv: move new_handle() function from header to tv.c
[mplayer.git] / libmpdemux / mf.c
blobc8d64313b015f0189bc24f45aa7500efbe486e82
1 /*
2 * This file is part of MPlayer.
4 * MPlayer is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
9 * MPlayer is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
14 * You should have received a copy of the GNU General Public License along
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
19 #include <ctype.h>
20 #include <stdio.h>
21 #include <stdlib.h>
22 #include <string.h>
23 #include <unistd.h>
24 #include <fcntl.h>
25 #include <errno.h>
26 #include <sys/types.h>
27 #include <sys/stat.h>
29 #include "config.h"
31 #ifdef HAVE_GLOB
32 #include <glob.h>
33 #else
34 #include "osdep/glob.h"
35 #endif
36 #include "osdep/strsep.h"
38 #include "mp_msg.h"
39 #include "stream/stream.h"
41 #include "mf.h"
43 int mf_w = 0; //352; // let codecs to detect it
44 int mf_h = 0; //288;
45 double mf_fps = 25.0;
46 char * mf_type = NULL; //"jpg";
48 mf_t* open_mf(char * filename){
49 #if defined(HAVE_GLOB) || defined(__MINGW32__)
50 glob_t gg;
51 struct stat fs;
52 int i;
53 char * fname;
54 mf_t * mf;
55 int error_count = 0;
56 int count = 0;
58 mf=calloc( 1,sizeof( mf_t ) );
60 if( filename[0] == '@' )
62 FILE *lst_f=fopen(filename + 1,"r");
63 if ( lst_f )
65 fname=malloc( 255 );
66 while ( fgets( fname,255,lst_f ) )
68 /* remove spaces from end of fname */
69 char *t=fname + strlen( fname ) - 1;
70 while ( t > fname && isspace( *t ) ) *(t--)=0;
71 if ( stat( fname,&fs ) )
73 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
75 else
77 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
78 mf->names[mf->nr_of_files]=strdup( fname );
79 mf->nr_of_files++;
82 fclose( lst_f );
84 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
85 goto exit_mf;
87 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] %s is not indirect filelist\n",filename+1 );
90 if( strchr( filename,',') )
92 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] filelist: %s\n",filename );
94 while ( ( fname=strsep( &filename,"," ) ) )
96 if ( stat( fname,&fs ) )
98 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
100 else
102 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
103 mf->names[mf->nr_of_files]=strdup( fname );
104 // mp_msg( MSGT_STREAM,MSGL_V,"[mf] added file %d.: %s\n",mf->nr_of_files,mf->names[mf->nr_of_files] );
105 mf->nr_of_files++;
108 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
110 goto exit_mf;
113 fname=malloc( strlen( filename ) + 32 );
115 if ( !strchr( filename,'%' ) )
117 strcpy( fname,filename );
118 if ( !strchr( filename,'*' ) ) strcat( fname,"*" );
120 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] search expr: %s\n",fname );
122 if ( glob( fname,0,NULL,&gg ) )
123 { free( mf ); free( fname ); return NULL; }
125 mf->nr_of_files=gg.gl_pathc;
126 mf->names=calloc( gg.gl_pathc, sizeof( char* ) );
128 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d (%d)\n",mf->nr_of_files, gg.gl_pathc * sizeof( char* ) );
130 for( i=0;i < gg.gl_pathc;i++ )
132 stat( gg.gl_pathv[i],&fs );
133 if( S_ISDIR( fs.st_mode ) ) continue;
134 mf->names[i]=strdup( gg.gl_pathv[i] );
135 // mp_msg( MSGT_STREAM,MSGL_DBG2,"[mf] added file %d.: %s\n",i,mf->names[i] );
137 globfree( &gg );
138 goto exit_mf;
141 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] search expr: %s\n",filename );
143 while ( error_count < 5 )
145 sprintf( fname,filename,count++ );
146 if ( stat( fname,&fs ) )
148 error_count++;
149 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
151 else
153 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
154 mf->names[mf->nr_of_files]=strdup( fname );
155 // mp_msg( MSGT_STREAM,MSGL_V,"[mf] added file %d.: %s\n",mf->nr_of_files,mf->names[mf->nr_of_files] );
156 mf->nr_of_files++;
160 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
162 exit_mf:
163 free( fname );
164 return mf;
165 #else
166 mp_msg(MSGT_STREAM,MSGL_FATAL,"[mf] mf support is disabled on your os\n");
167 return 0;
168 #endif