annotate libmpdemux/mf.c @ 36528:0dca7cd2b32b

rawdv: Fix memory leak in error case.
author reimar
date Sun, 19 Jan 2014 11:13:01 +0000
parents 9b4ba0fb999b
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
29238
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
1 /*
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
2 * This file is part of MPlayer.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
3 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
4 * MPlayer is free software; you can redistribute it and/or modify
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
5 * it under the terms of the GNU General Public License as published by
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
6 * the Free Software Foundation; either version 2 of the License, or
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
7 * (at your option) any later version.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
8 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
9 * MPlayer is distributed in the hope that it will be useful,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
12 * GNU General Public License for more details.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
13 *
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
14 * You should have received a copy of the GNU General Public License along
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
15 * with MPlayer; if not, write to the Free Software Foundation, Inc.,
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
16 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
d643e4643313 Add standard license header to all files in libmpdemux.
diego
parents: 25964
diff changeset
17 */
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
18
35951
9b4ba0fb999b build: Add _BSD_SOURCE definition for strsep().
diego
parents: 33841
diff changeset
19 #define _BSD_SOURCE
9b4ba0fb999b build: Add _BSD_SOURCE definition for strsep().
diego
parents: 33841
diff changeset
20
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
21 #include <ctype.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
22 #include <stdio.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
23 #include <stdlib.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
24 #include <string.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
25 #include <unistd.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
26 #include <fcntl.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
27 #include <errno.h>
32679
fcd252bdedd0 Don't hardcode filename length.
ranma
parents: 30633
diff changeset
28 #include <limits.h>
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
29 #include <sys/types.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
30 #include <sys/stat.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
31
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
32 #include "config.h"
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
33
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
34 #ifdef HAVE_GLOB
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
35 #include <glob.h>
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
36 #else
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
37 #include "osdep/glob.h"
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
38 #endif
30313
7f7591482564 Add a proper header for our strsep implementation so strsep will
reimar
parents: 29263
diff changeset
39 #include "osdep/strsep.h"
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
40
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
41 #include "mp_msg.h"
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
42 #include "help_mp.h"
22605
4d81dbdf46b9 Add explicit location for headers from the stream/ directory.
diego
parents: 19300
diff changeset
43 #include "stream/stream.h"
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
44
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
45 #include "mf.h"
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
46
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
47 int mf_w = 0; //352; // let codecs to detect it
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
48 int mf_h = 0; //288;
25964
cb07fc632de1 Change mf_fps to double
reimar
parents: 22605
diff changeset
49 double mf_fps = 25.0;
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
50 char * mf_type = NULL; //"jpg";
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
51
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
52 mf_t* open_mf(char * filename){
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
53 #if defined(HAVE_GLOB) || defined(__MINGW32__)
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
54 glob_t gg;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
55 struct stat fs;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
56 int i;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
57 char * fname;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
58 mf_t * mf;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
59 int error_count = 0;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
60 int count = 0;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
61
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
62 mf=calloc( 1,sizeof( mf_t ) );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
63
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
64 if( filename[0] == '@' )
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
65 {
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
66 FILE *lst_f=fopen(filename + 1,"r");
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
67 if ( lst_f )
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
68 {
32679
fcd252bdedd0 Don't hardcode filename length.
ranma
parents: 30633
diff changeset
69 fname=malloc(PATH_MAX);
fcd252bdedd0 Don't hardcode filename length.
ranma
parents: 30633
diff changeset
70 while ( fgets( fname,PATH_MAX,lst_f ) )
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
71 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
72 /* remove spaces from end of fname */
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
73 char *t=fname + strlen( fname ) - 1;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
74 while ( t > fname && isspace( *t ) ) *(t--)=0;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
75 if ( stat( fname,&fs ) )
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
76 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
77 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
78 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
79 else
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
80 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
81 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
82 mf->names[mf->nr_of_files]=strdup( fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
83 mf->nr_of_files++;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
84 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
85 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
86 fclose( lst_f );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
87
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
88 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
89 goto exit_mf;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
90 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
91 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] %s is not indirect filelist\n",filename+1 );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
92 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
93
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
94 if( strchr( filename,',') )
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
95 {
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
96 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] filelist: %s\n",filename );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
97
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
98 while ( ( fname=strsep( &filename,"," ) ) )
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
99 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
100 if ( stat( fname,&fs ) )
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
101 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
102 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
103 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
104 else
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
105 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
106 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
107 mf->names[mf->nr_of_files]=strdup( fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
108 // mp_msg( MSGT_STREAM,MSGL_V,"[mf] added file %d.: %s\n",mf->nr_of_files,mf->names[mf->nr_of_files] );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
109 mf->nr_of_files++;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
110 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
111 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
112 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
113
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
114 goto exit_mf;
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
115 }
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
116
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
117 fname=malloc( strlen( filename ) + 32 );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
118
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
119 if ( !strchr( filename,'%' ) )
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
120 {
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
121 strcpy( fname,filename );
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
122 if ( !strchr( filename,'*' ) ) strcat( fname,"*" );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
123
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
124 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] search expr: %s\n",fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
125
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
126 if ( glob( fname,0,NULL,&gg ) )
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
127 { free( mf ); free( fname ); return NULL; }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
128
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
129 mf->nr_of_files=gg.gl_pathc;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
130 mf->names=calloc( gg.gl_pathc, sizeof( char* ) );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
131
33841
25667edae85c cleanup: adjust printf format strings to match parameter types
diego
parents: 32679
diff changeset
132 mp_msg( MSGT_STREAM, MSGL_INFO, "[mf] number of files: %d (%zu)\n", mf->nr_of_files, gg.gl_pathc * sizeof( char* ) );
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
133
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
134 for( i=0;i < gg.gl_pathc;i++ )
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
135 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
136 stat( gg.gl_pathv[i],&fs );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
137 if( S_ISDIR( fs.st_mode ) ) continue;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
138 mf->names[i]=strdup( gg.gl_pathv[i] );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
139 // mp_msg( MSGT_STREAM,MSGL_DBG2,"[mf] added file %d.: %s\n",i,mf->names[i] );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
140 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
141 globfree( &gg );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
142 goto exit_mf;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
143 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
144
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
145 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] search expr: %s\n",filename );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
146
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
147 while ( error_count < 5 )
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
148 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
149 sprintf( fname,filename,count++ );
29263
0f1b5b68af32 whitespace cosmetics: Remove all trailing whitespace.
diego
parents: 29238
diff changeset
150 if ( stat( fname,&fs ) )
19300
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
151 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
152 error_count++;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
153 mp_msg( MSGT_STREAM,MSGL_V,"[mf] file not found: '%s'\n",fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
154 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
155 else
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
156 {
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
157 mf->names=realloc( mf->names,( mf->nr_of_files + 1 ) * sizeof( char* ) );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
158 mf->names[mf->nr_of_files]=strdup( fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
159 // mp_msg( MSGT_STREAM,MSGL_V,"[mf] added file %d.: %s\n",mf->nr_of_files,mf->names[mf->nr_of_files] );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
160 mf->nr_of_files++;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
161 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
162 }
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
163
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
164 mp_msg( MSGT_STREAM,MSGL_INFO,"[mf] number of files: %d\n",mf->nr_of_files );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
165
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
166 exit_mf:
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
167 free( fname );
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
168 return mf;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
169 #else
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
170 mp_msg(MSGT_STREAM,MSGL_FATAL,"[mf] mf support is disabled on your os\n");
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
171 return 0;
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
172 #endif
0c7ad1c632cc mf.[hc] belong to libmpdemux
ben
parents:
diff changeset
173 }