Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

thd_mpegread.c File Reference

#include "mrilib.h"
#include "thd.h"

Go to the source code of this file.


Functions

THD_3dim_datasetTHD_open_mpeg (char *hname)
void THD_load_mpeg (THD_datablock *dblk)

Function Documentation

void THD_load_mpeg THD_datablock   dblk
 

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 }

THD_3dim_dataset* THD_open_mpeg char *    hname
 

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 }
 

Powered by Plone

This site conforms to the following standards: