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 } |