Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
mri_read_mpeg.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002
00003 #undef TDIR
00004 #define TDIR "m2pAFNI/"
00005
00006 static int first=1 ;
00007 static char *tmpdir = NULL ;
00008 static char *mpeg_filter = NULL ;
00009
00010 #undef TSIZ
00011 #define TSIZ 6666666
00012
00013
00014
00015
00016 static void mpeg_setup(void)
00017 {
00018 char *pg ;
00019 if( !first ) return ;
00020
00021 first = 0 ;
00022
00023
00024
00025 pg = getenv( "TMPDIR" ) ;
00026 if( pg == NULL || *pg == '\0' ) pg = getenv( "TEMPDIR" ) ;
00027 if( pg == NULL || *pg == '\0' ) pg = "/tmp" ;
00028 if( !THD_is_directory(pg) ) pg = "." ;
00029 tmpdir = AFMALL( char, strlen(pg)+16) ;
00030 sprintf( tmpdir , "%s/%s" , pg , TDIR ) ;
00031
00032
00033
00034 pg = THD_find_executable( "mpegtoppm" ) ;
00035 if( pg != NULL ){
00036 mpeg_filter = AFMALL( char, strlen(pg)+strlen(tmpdir)+64 ) ;
00037 sprintf( mpeg_filter , "%s -prefix %s %%s" , pg , tmpdir ) ;
00038 }
00039 }
00040
00041
00042
00043
00044
00045 MRI_IMARR * mri_read_mpeg( char *fname )
00046 {
00047 char *pg ;
00048 int ii , allgray=1 ;
00049 FILE *fp ;
00050 MRI_IMAGE *im ;
00051 MRI_IMARR *imar ;
00052
00053 ENTRY("mri_read_mpeg") ;
00054
00055
00056
00057 if( fname == NULL || *fname == '\0' ) RETURN( NULL );
00058 ii = mri_filesize(fname) ;
00059 if( ii <= 0 ) RETURN( NULL );
00060
00061 mpeg_setup() ;
00062
00063 if( mpeg_filter == NULL ) RETURN( NULL );
00064
00065
00066
00067 pg = AFMALL(char, strlen(fname)+strlen(mpeg_filter)+32) ;
00068 sprintf( pg , mpeg_filter , fname ) ;
00069 THD_mkdir( tmpdir ) ;
00070 if( !THD_is_directory(tmpdir) ){ free(pg); RETURN(NULL); }
00071
00072 if( ii > TSIZ ) fprintf(stderr,"++ Decoding file %s",fname) ;
00073 system( pg ) ;
00074 if( ii > TSIZ ) fprintf(stderr,".\n") ;
00075
00076
00077
00078 INIT_IMARR(imar) ;
00079 for( ii=0 ; ; ii++ ){
00080 sprintf( pg , "%s%06d.ppm" , tmpdir,ii ) ;
00081 im = mri_read_ppm( pg ) ;
00082 if( im == NULL ) break ;
00083 allgray = allgray && mri_isgray(im) ;
00084 remove( pg ) ;
00085 ADDTO_IMARR(imar,im) ;
00086 }
00087 remove( tmpdir ) ; free(pg) ;
00088
00089
00090
00091 if( IMARR_COUNT(imar) == 0 ){
00092 DESTROY_IMARR(imar);
00093 imar = NULL;
00094 } else if( AFNI_yesenv("AFNI_MPEG_GRAYIZE") ){
00095 MRI_IMARR *qmar ;
00096 INIT_IMARR(qmar) ;
00097 for( ii=0 ; ii < IMARR_COUNT(imar) ; ii++ ){
00098 im = mri_to_byte( IMARR_SUBIM(imar,ii) ) ;
00099 ADDTO_IMARR(qmar,im) ;
00100 mri_free( IMARR_SUBIM(imar,ii) ) ;
00101 }
00102 FREE_IMARR(imar) ; imar = qmar ;
00103 }
00104
00105 RETURN( imar );
00106 }
00107
00108
00109
00110
00111
00112 int mri_imcount_mpeg( char *fname )
00113 {
00114 char *pg , **ff , *fn ;
00115 int ii , nf=0 ;
00116 FILE *fp ;
00117
00118 ENTRY("mri_imcount_mpeg") ;
00119
00120
00121
00122 if( fname == NULL || *fname == '\0' ) RETURN( 0 );
00123 ii = mri_filesize(fname) ;
00124 if( ii <= 0 ) RETURN( 0 );
00125
00126 mpeg_setup() ;
00127
00128 if( mpeg_filter == NULL ) RETURN( 0 );
00129
00130
00131
00132 pg = AFMALL( char, strlen(fname)+strlen(mpeg_filter)+64) ;
00133 fn = AFMALL( char, strlen(fname)+32) ;
00134 sprintf(fn,"-count %s",fname) ;
00135 sprintf( pg , mpeg_filter , fn ) ;
00136 free(fn) ;
00137 THD_mkdir( tmpdir ) ;
00138 if( !THD_is_directory(tmpdir) ){ free(pg); RETURN(0); }
00139
00140 system( pg ) ;
00141
00142
00143
00144 sprintf( pg , "%sCOUNT" , tmpdir ) ;
00145 fp = fopen(pg,"rb") ;
00146 if( fp != NULL ){ fscanf(fp,"%d",&nf); fclose(fp); remove(pg); }
00147 remove( tmpdir ) ; free(pg) ;
00148 RETURN( nf );
00149 }