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

Go to the documentation of this file.
00001 #include "mrilib.h"
00002 #include "thd.h"
00003 
00004 /*******************************************************************/
00005 /******** 03 Dec 2003: Read an MPEG file as an AFNI dataset ********/
00006 /*******************************************************************/
00007 
00008 /*-----------------------------------------------------------------*/
00009 /*! Open an MPEG file as an unpopulated AFNI dataset.
00010     It will be populated in THD_load_mpeg().
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    /*-- 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 }
00152 
00153 /*---------------------------------------------------------------------*/
00154 /*! Load an MPEG dataset from disk.
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    /*-- 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 }
 

Powered by Plone

This site conforms to the following standards: