Doxygen Source Code Documentation
thd_mpegread.c File Reference
#include "mrilib.h"#include "thd.h"Go to the source code of this file.
Functions | |
| THD_3dim_dataset * | THD_open_mpeg (char *hname) |
| void | THD_load_mpeg (THD_datablock *dblk) |
Function Documentation
|
|
Load an MPEG dataset from disk. ----------------------------------------------------------------------- Definition at line 157 of file thd_mpegread.c. References AFMALL, THD_datablock::brick, THD_diskptr::brick_name, DATABLOCK_MEM_MALLOC, DBLK_ARRAY, DBLK_BRICK, DBLK_BRICK_BYTES, DBLK_BRICK_TYPE, DESTROY_IMARR, THD_diskptr::dimsizes, THD_datablock::diskptr, ENTRY, free, IMARR_SUBIM, ISVALID_DATABLOCK, THD_datablock::malloc_type, mri_data_pointer(), mri_datum_size(), mri_fix_data_pointer(), mri_read_mpeg(), THD_diskptr::nvals, nz, STORAGE_BY_MPEG, and THD_diskptr::storage_mode. Referenced by THD_load_datablock().
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 /*-- check inputs --*/
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 /*-- allocate space for data --*/
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 /*-- malloc space for each brick separately --*/
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 /*-- if couldn't get them all, take our ball and go home in a snit --*/
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 /*-- load data from image array into sub-brick arrays! --*/
00214
00215 nbar = mri_datum_size( DBLK_BRICK_TYPE(dblk,0) ) * nx*ny ;
00216 if( nv == 1 ){ /* all data goes into 1 sub-brick */
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 { /* each slice is a separate sub-brick */
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 }
|
|
|
Open an MPEG file as an unpopulated AFNI dataset. It will be populated in THD_load_mpeg(). ------------------------------------------------------------------- Definition at line 13 of file thd_mpegread.c. References ADN_datum_all, ADN_func_type, ADN_malloc_type, ADN_none, ADN_ntt, ADN_nvals, ADN_nxyz, ADN_prefix, ADN_ttdel, ADN_ttdur, ADN_ttorg, ADN_tunits, ADN_type, ADN_view_type, ADN_xyzdel, ADN_xyzorg, ADN_xyzorient, ANAT_EPI_TYPE, ANAT_MRAN_TYPE, THD_diskptr::brick_name, DATABLOCK_MEM_MALLOC, THD_3dim_dataset::dblk, DESTROY_IMARR, THD_datablock::diskptr, dt, EDIT_dset_items(), EDIT_empty_copy(), ENTRY, getenv(), HEAD_ANAT_TYPE, THD_3dim_dataset::idcode, THD_ivec3::ijk, IMARR_COUNT, IMARR_SUBIM, MRI_IMAGE::kind, MCW_hash_idcode(), MCW_strncpy, mri_read_mpeg(), MRI_IMAGE::nx, MRI_IMAGE::ny, nz, OR3OK, ORCODE, ORI_A2P_TYPE, ORI_I2S_TYPE, ORI_L2R_TYPE, RETURN, STORAGE_BY_MPEG, THD_diskptr::storage_mode, MCW_idcode::str, THD_MAX_PREFIX, THD_trailname(), UNITS_SEC_TYPE, VIEW_ORIGINAL_TYPE, and THD_fvec3::xyz. Referenced by THD_init_session(), and THD_open_one_dataset().
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 /*-- count slices in the file --*/
00031
00032 imar = mri_read_mpeg( hname ) ;
00033 if( imar == NULL ) RETURN(NULL) ;
00034 nim = IMARR_COUNT(imar) ;
00035
00036 /*-- get data type for each voxel --*/
00037
00038 im = IMARR_SUBIM(imar,0) ;
00039 datum_type = im->kind ;
00040
00041 /*-- compute dimensions of images, and number of images --*/
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 /*-- voxel sizes --*/
00057
00058 dx = dy = dz = dt = 1.0 ;
00059
00060 /*-- make a dataset --*/
00061
00062 dset = EDIT_empty_copy(NULL) ;
00063
00064 dset->idcode.str[0] = 'M' ; /* overwrite 1st 3 bytes */
00065 dset->idcode.str[1] = 'P' ;
00066 dset->idcode.str[2] = 'G' ;
00067
00068 MCW_hash_idcode( hname , dset ) ; /* 06 May 2005 */
00069
00070 ppp = THD_trailname(hname,0) ; /* strip directory */
00071 MCW_strncpy( prefix , ppp , THD_MAX_PREFIX ) ; /* to make prefix */
00072
00073 nxyz.ijk[0] = nx ; dxyz.xyz[0] = dx ; /* setup axes lengths and voxel sizes */
00074 nxyz.ijk[1] = ny ; dxyz.xyz[1] = dy ;
00075 nxyz.ijk[2] = nz ; dxyz.xyz[2] = dz ;
00076
00077 /*-- set orientation --*/
00078
00079 { char *ori = "LAI" ;
00080 int oxx,oyy,ozz ;
00081 if( ori == NULL || strlen(ori) < 3 ) ori = "LAI"; /* set default LPI */
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; /* LAI? */
00086 }
00087
00088 orixyz.ijk[0] = oxx ;
00089 orixyz.ijk[1] = oyy ;
00090 orixyz.ijk[2] = ozz ;
00091 }
00092
00093 /*-- origin of coordinates --*/
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 /* 10 Oct 2002: change voxel size signs, if axis orientation is negative */
00102 /* [above, we assumed that axes were oriented in - to + way] */
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 /*-- actually send the values above into the dataset header --*/
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 ) /** pretend it is 3D+time **/
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 /*-- flag to read data from disk using MPEG mode --*/
00146
00147 dset->dblk->diskptr->storage_mode = STORAGE_BY_MPEG ;
00148 strcpy( dset->dblk->diskptr->brick_name , hname ) ;
00149
00150 RETURN(dset) ;
00151 }
|