1 #include "mrilib.h"
2
3 #undef TDIR
4 #define TDIR "m2pAFNI/"
5
6 static int first=1 ;
7 static char *tmpdir = NULL ;
8 static char *mpeg_filter = NULL ;
9
10 #undef TSIZ
11 #define TSIZ 6666666
12
13 /*----------------------------*/
14 /*! Setup mpeg reading stuff. */
15
mpeg_setup(void)16 static void mpeg_setup(void)
17 {
18 char *pg ;
19 if( !first ) return ;
20
21 first = 0 ;
22
23 /* get a temporary directory name */
24
25 pg = getenv( "TMPDIR" ) ;
26 if( pg == NULL || *pg == '\0' ) pg = getenv( "TEMPDIR" ) ;
27 if( pg == NULL || *pg == '\0' ) pg = "/tmp" ;
28 if( !THD_is_directory(pg) ) pg = "." ;
29 tmpdir = AFMALL( char, strlen(pg)+16) ;
30 sprintf( tmpdir , "%s/%s" , pg , TDIR ) ;
31
32 /* find the mpegtoppm executable */
33
34 pg = THD_find_executable( "mpegtoppm" ) ;
35 if( pg != NULL ){
36 mpeg_filter = AFMALL( char, strlen(pg)+strlen(tmpdir)+64 ) ;
37 sprintf( mpeg_filter , "%s -prefix %s %%s" , pg , tmpdir ) ;
38 }
39 }
40
41 /*----------------------------------------------------------*/
42 /*! Convert an MPEG file into a set of images.
43 Must have program mpegtoppm in the path. [03 Dec 2003] */
44
mri_read_mpeg(char * fname)45 MRI_IMARR * mri_read_mpeg( char *fname )
46 {
47 char *pg ;
48 int ii , allgray=1 ;
49 FILE *fp ;
50 MRI_IMAGE *im ;
51 MRI_IMARR *imar ;
52
53 ENTRY("mri_read_mpeg") ;
54
55 /*--- check input for OK-ness ---*/
56
57 if( fname == NULL || *fname == '\0' ) RETURN( NULL );
58 ii = THD_filesize(fname) ;
59 if( ii <= 0 ) RETURN( NULL );
60
61 mpeg_setup() ;
62
63 if( mpeg_filter == NULL ) RETURN( NULL ); /* can't filter? */
64
65 /*--- create the filter for this file and run it to create .ppm files ---*/
66
67 pg = AFMALL(char, strlen(fname)+strlen(mpeg_filter)+32) ; /* string to hold filter */
68 sprintf( pg , mpeg_filter , fname ) ;
69 THD_mkdir( tmpdir ) ; /* create the temp directory */
70 if( !THD_is_directory(tmpdir) ){ free(pg); RETURN(NULL); } /* can't? */
71
72 if( ii > TSIZ ) fprintf(stderr,"++ Decoding file %s",fname) ;
73 system( pg ) ; /* run the command */
74 if( ii > TSIZ ) fprintf(stderr,".\n") ;
75
76 /*--- read files from the temp directory ---*/
77
78 INIT_IMARR(imar) ;
79 for( ii=0 ; ; ii++ ){ /* loop until we fail to read */
80 sprintf( pg , "%s%06d.ppm" , tmpdir,ii ) ;
81 im = mri_read_ppm( pg ) ;
82 if( im == NULL ) break ;
83 allgray = allgray && mri_isgray(im) ;
84 remove( pg ) ;
85 ADDTO_IMARR(imar,im) ;
86 }
87 remove( tmpdir ) ; free(pg) ;
88
89 /* if all images are grayscale, convert to byte-valued images */
90
91 if( IMARR_COUNT(imar) == 0 ){
92 DESTROY_IMARR(imar);
93 imar = NULL;
94 } else if( AFNI_yesenv("AFNI_MPEG_GRAYIZE") ){
95 MRI_IMARR *qmar ;
96 INIT_IMARR(qmar) ;
97 for( ii=0 ; ii < IMARR_COUNT(imar) ; ii++ ){
98 im = mri_to_byte( IMARR_SUBIM(imar,ii) ) ;
99 ADDTO_IMARR(qmar,im) ;
100 mri_free( IMARR_SUBIM(imar,ii) ) ;
101 }
102 FREE_IMARR(imar) ; imar = qmar ;
103 }
104
105 RETURN( imar );
106 }
107
108 /*----------------------------------------------------------*/
109 /*! Count number of images in an MPEG file.
110 Must have program mpegtoppm in the path. [03 Dec 2003] */
111
mri_imcount_mpeg(char * fname)112 int mri_imcount_mpeg( char *fname )
113 {
114 char *pg , **ff , *fn ;
115 int ii , nf=0 ;
116 FILE *fp ;
117
118 ENTRY("mri_imcount_mpeg") ;
119
120 /*--- check input for OK-ness ---*/
121
122 if( fname == NULL || *fname == '\0' ) RETURN( 0 );
123 ii = THD_filesize(fname) ;
124 if( ii <= 0 ) RETURN( 0 );
125
126 mpeg_setup() ;
127
128 if( mpeg_filter == NULL ) RETURN( 0 ); /* can't filter? */
129
130 /*--- create the filter for this file and run it to create .ppm files ---*/
131
132 pg = AFMALL( char, strlen(fname)+strlen(mpeg_filter)+64) ; /* string to hold filter */
133 fn = AFMALL( char, strlen(fname)+32) ;
134 sprintf(fn,"-count %s",fname) ;
135 sprintf( pg , mpeg_filter , fn ) ;
136 free(fn) ;
137 THD_mkdir( tmpdir ) ; /* create the temp directory */
138 if( !THD_is_directory(tmpdir) ){ free(pg); RETURN(0); } /* can't? */
139
140 system( pg ) ; /* run the command */
141
142 /*-- open the COUNT file in the temp directory --*/
143
144 sprintf( pg , "%sCOUNT" , tmpdir ) ;
145 fp = fopen(pg,"rb") ;
146 if( fp != NULL ){ fscanf(fp,"%d",&nf); fclose(fp); remove(pg); }
147 remove( tmpdir ) ; free(pg) ;
148 RETURN( nf );
149 }
150