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