Doxygen Source Code Documentation
Main Page Alphabetical List Data Structures File List Data Fields Globals Search
thd_mpegread.c
Go to the documentation of this file.00001 #include "mrilib.h"
00002 #include "thd.h"
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 THD_3dim_dataset * THD_open_mpeg( char *hname )
00014 {
00015 int nim , ii , datum_type ;
00016 MRI_IMARR *imar ;
00017 MRI_IMAGE *im ;
00018 char *eee ;
00019 THD_3dim_dataset *dset=NULL ;
00020 char prefix[THD_MAX_PREFIX] , *ppp ;
00021 THD_ivec3 nxyz , orixyz ;
00022 THD_fvec3 dxyz , orgxyz ;
00023 int iview ;
00024 int nx,ny,nz,nt ;
00025 float dx,dy,dz,dt ;
00026
00027
00028 ENTRY("THD_open_mpeg") ;
00029
00030
00031
00032 imar = mri_read_mpeg( hname ) ;
00033 if( imar == NULL ) RETURN(NULL) ;
00034 nim = IMARR_COUNT(imar) ;
00035
00036
00037
00038 im = IMARR_SUBIM(imar,0) ;
00039 datum_type = im->kind ;
00040
00041
00042
00043 nx = im->nx ;
00044 ny = im->ny ;
00045 DESTROY_IMARR(imar) ;
00046 if( nx < 2 || ny < 2 ) RETURN(NULL) ;
00047
00048 eee = getenv("AFNI_MPEG_DATASETS") ;
00049 if( eee == NULL ) eee = "SPACE" ;
00050 switch( toupper(*eee) ){
00051 default:
00052 case 'T': nz = 1 ; nt = nim ; break ;
00053 case 'S': nz = nim ; nt = 1 ; break ;
00054 }
00055
00056
00057
00058 dx = dy = dz = dt = 1.0 ;
00059
00060
00061
00062 dset = EDIT_empty_copy(NULL) ;
00063
00064 dset->idcode.str[0] = 'M' ;
00065 dset->idcode.str[1] = 'P' ;
00066 dset->idcode.str[2] = 'G' ;
00067
00068 MCW_hash_idcode( hname , dset ) ;
00069
00070 ppp = THD_trailname(hname,0) ;
00071 MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ;
00072
00073 nxyz.ijk[0] = nx ; dxyz.xyz[0] = dx ;
00074 nxyz.ijk[1] = ny ; dxyz.xyz[1] = dy ;
00075 nxyz.ijk[2] = nz ; dxyz.xyz[2] = dz ;
00076
00077
00078
00079 { char *ori = "LAI" ;
00080 int oxx,oyy,ozz ;
00081 if( ori == NULL || strlen(ori) < 3 ) ori = "LAI";
00082
00083 oxx = ORCODE(ori[0]); oyy = ORCODE(ori[1]); ozz = ORCODE(ori[2]);
00084 if( !OR3OK(oxx,oyy,ozz) ){
00085 oxx = ORI_L2R_TYPE; oyy = ORI_A2P_TYPE; ozz = ORI_I2S_TYPE;
00086 }
00087
00088 orixyz.ijk[0] = oxx ;
00089 orixyz.ijk[1] = oyy ;
00090 orixyz.ijk[2] = ozz ;
00091 }
00092
00093
00094
00095 orgxyz.xyz[0] = -0.5 * (nx-1) * dx ;
00096 orgxyz.xyz[1] = -0.5 * (ny-1) * dy ;
00097 orgxyz.xyz[2] = -0.5 * (nz-1) * dz ;
00098
00099 iview = VIEW_ORIGINAL_TYPE ;
00100
00101
00102
00103
00104 if( ORIENT_sign[orixyz.ijk[0]] == '-' ){
00105 dxyz.xyz[0] = -dxyz.xyz[0] ;
00106 orgxyz.xyz[0] = -orgxyz.xyz[0] ;
00107 }
00108
00109 if( ORIENT_sign[orixyz.ijk[1]] == '-' ){
00110 dxyz.xyz[1] = -dxyz.xyz[1] ;
00111 orgxyz.xyz[1] = -orgxyz.xyz[1] ;
00112 }
00113
00114 if( ORIENT_sign[orixyz.ijk[2]] == '-' ){
00115 dxyz.xyz[2] = -dxyz.xyz[2] ;
00116 orgxyz.xyz[2] = -orgxyz.xyz[2] ;
00117 }
00118
00119
00120
00121 EDIT_dset_items( dset ,
00122 ADN_prefix , prefix ,
00123 ADN_datum_all , datum_type ,
00124 ADN_nxyz , nxyz ,
00125 ADN_xyzdel , dxyz ,
00126 ADN_xyzorg , orgxyz ,
00127 ADN_xyzorient , orixyz ,
00128 ADN_malloc_type , DATABLOCK_MEM_MALLOC ,
00129 ADN_nvals , nt ,
00130 ADN_type , HEAD_ANAT_TYPE ,
00131 ADN_view_type , iview ,
00132 ADN_func_type , ANAT_MRAN_TYPE ,
00133 ADN_none ) ;
00134
00135 if( nt > 1 )
00136 EDIT_dset_items( dset ,
00137 ADN_func_type, ANAT_EPI_TYPE ,
00138 ADN_ntt , nt ,
00139 ADN_ttorg , 0.0 ,
00140 ADN_ttdel , dt ,
00141 ADN_ttdur , 0.0 ,
00142 ADN_tunits , UNITS_SEC_TYPE ,
00143 ADN_none ) ;
00144
00145
00146
00147 dset->dblk->diskptr->storage_mode = STORAGE_BY_MPEG ;
00148 strcpy( dset->dblk->diskptr->brick_name , hname ) ;
00149
00150 RETURN(dset) ;
00151 }
00152
00153
00154
00155
00156
00157 void THD_load_mpeg( THD_datablock *dblk )
00158 {
00159 THD_diskptr *dkptr ;
00160 int nx,ny,nz,nv , nxy,nxyz,nxyzv , ibr,nbad , nbar ;
00161 FILE *fp ;
00162 void *ptr ;
00163 MRI_IMARR *imar ;
00164 MRI_IMAGE *im ;
00165 byte *bim , *bar ;
00166
00167 ENTRY("THD_load_mpeg") ;
00168
00169
00170
00171 if( !ISVALID_DATABLOCK(dblk) ||
00172 dblk->diskptr->storage_mode != STORAGE_BY_MPEG ||
00173 dblk->brick == NULL ) EXRETURN ;
00174
00175 dkptr = dblk->diskptr ;
00176
00177 imar = mri_read_mpeg( dkptr->brick_name ) ;
00178 if( imar == NULL ) EXRETURN ;
00179
00180
00181
00182 nx = dkptr->dimsizes[0] ;
00183 ny = dkptr->dimsizes[1] ; nxy = nx * ny ;
00184 nz = dkptr->dimsizes[2] ; nxyz = nxy * nz ;
00185 nv = dkptr->nvals ; nxyzv = nxyz * nv ;
00186
00187 dblk->malloc_type = DATABLOCK_MEM_MALLOC ;
00188
00189
00190
00191 for( nbad=ibr=0 ; ibr < nv ; ibr++ ){
00192 if( DBLK_ARRAY(dblk,ibr) == NULL ){
00193 ptr = AFMALL(void, DBLK_BRICK_BYTES(dblk,ibr) ) ;
00194 mri_fix_data_pointer( ptr , DBLK_BRICK(dblk,ibr) ) ;
00195 if( ptr == NULL ) nbad++ ;
00196 }
00197 }
00198
00199
00200
00201 if( nbad > 0 ){
00202 fprintf(stderr,
00203 "\n** failed to malloc %d MPEG bricks out of %d\n\a",nbad,nv);
00204 for( ibr=0 ; ibr < nv ; ibr++ ){
00205 if( DBLK_ARRAY(dblk,ibr) != NULL ){
00206 free(DBLK_ARRAY(dblk,ibr)) ;
00207 mri_fix_data_pointer( NULL , DBLK_BRICK(dblk,ibr) ) ;
00208 }
00209 }
00210 fclose(fp) ; DESTROY_IMARR(imar) ; EXRETURN ;
00211 }
00212
00213
00214
00215 nbar = mri_datum_size( DBLK_BRICK_TYPE(dblk,0) ) * nx*ny ;
00216 if( nv == 1 ){
00217 bar = DBLK_ARRAY(dblk,0) ;
00218 for( ibr=0 ; ibr < nz ; ibr++ ){
00219 im = IMARR_SUBIM(imar,ibr) ; bim = mri_data_pointer(im) ;
00220 memcpy( bar , bim , nbar ) ;
00221 bar += nbar ;
00222 }
00223 } else {
00224 for( ibr=0 ; ibr < nv ; ibr++ ){
00225 bar = DBLK_ARRAY(dblk,ibr) ;
00226 im = IMARR_SUBIM(imar,ibr) ; bim = mri_data_pointer(im) ;
00227 memcpy( bar , bim , nbar ) ;
00228 }
00229 }
00230
00231 DESTROY_IMARR(imar) ;
00232 EXRETURN ;
00233 }