Opening an Image Object

To play back or decompress an image object, you must first open the movie file to find the four-character code (FOURCC) of the compression type and initiate the track information (as shown in the following example). The open routine allows for multiple compression types per stream.

LONG IOProcOpen (PMMIOINFO pmmioinfo, PSZ pszFileName) {
   LONG            rc = MMIO_SUCCESS;        /* Return code.           */
   LONG            lFilePosition;            /* Logical file position. */
   MMIOINFO        Localmmioinfo;            /* For locally used.      */
   PINSTANCE       pinstance;                /* Local work structure.  */

   if (pmmioinfo == NULL) return MMIO_ERROR;

   if (CheckMem((PVOID)pmmioinfo, sizeof(MMIOINFO), PAG_WRITE))
      return MMIO_ERROR;

   /********************************************************************/
   /* Validate the open flags for this File Format IOProc              */
   /* (INVALID_OPEN_FLAGS should be defined in the ff.h - file format  */
   /*  specific header file.)                                          */
   /********************************************************************/

   if (pmmioinfo->ulFlags  & INVALID_OPEN_FLAGS) {
       pmmioinfo->ulErrorRet = MMIOERR_INVALID_ACCESS_FLAG;
       return(MMIO_ERROR);
   }

   ENTERCRITX;
   if ((pinstance = (PINSTANCE)HhpAllocMem(hheap,sizeof(INSTANCE)))
         == NULL) {
       EXITCRIT;
       pmmioinfo->ulErrorRet = MMIOERR_OUTOFMEMORY;
       return(MMIO_ERROR);                  /* Allocate work struct. */
   }
   EXITCRIT;

   pmmioinfo->pExtraInfoStruct = (PVOID) pinstance;
   pmmioinfo->fccIOProc = HEX_FOURCC_FFIO; /* Set for CODEC loading. */
   ioInstanceInit(pinstance);

   /* Validate read flags before doing read initialization */

   if (( pmmioinfo->ulFlags & MMIO_READ ) &&
                !( pmmioinfo->ulFlags & INVALID_READ_FLAGS )) {

      /* IOProc identifies Storage System */

      memcpy (&Localmmioinfo, pmmioinfo, sizeof(MMIOINFO));
      Localmmioinfo.pIOProc = NULL;
      Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;
      Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
      Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open */

      rc = ioIdentifyStorageSystem(&Localmmioinfo,pszFileName);

      if (rc != MMIO_SUCCESS) {        /* if error,                  */
         ioCleanUp(pmmioinfo);
         return(rc);
      }

      /******************************************************/
      /* Allocate memory for pTempBuffer which is used when */
      /* IOProcReadInterLeaved is called.                   */
      /******************************************************/

      if (ENTERCRIT(rc)) {
         ioCleanUp(pmmioinfo);
         return(rc);
      }

      if ((pinstance->pTempBuffer = HhpAllocMem(hheap, DEFAULTBUFFERSIZE))
         == NULL) {
         EXITCRIT;
         ioCleanUp(pmmioinfo);
         return(MMIOERR_OUTOFMEMORY);
      }
      EXITCRIT;
      pinstance->ulTempBufferSize = DEFAULTBUFFERSIZE;

      /*****************************************************/
      /* Open Movie file                                   */
      /*****************************************************/

      if ( pmmioinfo->fccChildIOProc != FOURCC_MEM ) {
         Localmmioinfo.cchBuffer = 0;
         Localmmioinfo.pchBuffer = NULL;
      }
      pinstance->hmmioFileHandle = mmioOpen(pszFileName,
         &Localmmioinfo,MMIO_NOIDENTIFY);
           /* Test file open error.*/
      if (pinstance->hmmioFileHandle <= (HMMIO)0L) {
         rc = Localmmioinfo.ulErrorRet;
      }

      /*****************************************************/
      /* Call file format specific open routine            */
      /*****************************************************/

      else if (!(rc = ffOpenRead(pmmioinfo, pinstance))) {
         if(!(rc = ioAddTracksToMovieHeader(pinstance))) {

            /*********************************************************/
            /* Set lLogicalFilePos to a position pass the header     */
            /* block to allow read occurring at the first byte of    */
            /* non-header data.                                      */
            /*********************************************************/
            lFilePosition = ffSeekToDataBegin(pmmioinfo,pinstance);
            if (lFilePosition < MMIO_SUCCESS)
               rc = MMIO_ERROR;
            else
               pinstance->lFileCurrentPosition = lFilePosition;
         }
      }

      if (rc) {
         ioCleanUp(pmmioinfo);
         return(rc);
      }
   }

   /* Validate Write flags before doing initialization */

#ifndef WORKSHOP

   if ((pmmioinfo->ulFlags & (MMIO_READWRITE | MMIO_WRITE)) &&
                !(pmmioinfo->ulFlags & INVALID_WRITE_FLAGS)) {

      /* Open the movie file */

      memset (&Localmmioinfo, '\0', sizeof(MMIOINFO));
      Localmmioinfo.pIOProc   = NULL;
      Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;

      if (pmmioinfo->fccChildIOProc != FOURCC_MEM) {
         Localmmioinfo.cchBuffer = 0;
         Localmmioinfo.pchBuffer = NULL;
      }

      Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
      Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open. */
                                                /* MMIO may do buffering. */

      pinstance->hmmioFileHandle = mmioOpen(pszFileName, &Localmmioinfo,
                                         MMIO_READWRITE | MMIO_NOIDENTIFY);

      if (pinstance->hmmioFileHandle <= (HMMIO)0L) /* Test file open error. */
         rc = Localmmioinfo.ulErrorRet;
      else
         /* Call file format specific open routine */
         rc = ffOpenWrite(pmmioinfo, pinstance);

      if (rc != 0) {
         ioCleanUp(pmmioinfo);
         return(rc);
      }
   }

#else    /* WORKSHOP next */

   if ((pmmioinfo->ulFlags & (MMIO_READWRITE | MMIO_WRITE)) &&
                !(pmmioinfo->ulFlags & INVALID_WRITE_FLAGS)) {

      /* Open the movie file */

      memset (&Localmmioinfo, '\0', sizeof(MMIOINFO));
      Localmmioinfo.pIOProc   = NULL;
      Localmmioinfo.fccIOProc = pmmioinfo->fccChildIOProc;
      Localmmioinfo.ulFlags  = pmmioinfo->ulFlags;
      Localmmioinfo.ulFlags |= MMIO_NOIDENTIFY; /* Eliminate callbacks */
      Localmmioinfo.ulFlags &= ~MMIO_ALLOCBUF;  /* Force non-buffered open. */
                                                /* MMIO may do buffering. */

      if (!(pmmioinfo->ulFlags & MMIO_CREATE)) {
         rc = ioIdentifyStorageSystem(&Localmmioinfo, pszFileName);

         if (rc != MMIO_SUCCESS) {        /* if error */
            pmmioinfo->ulErrorRet = rc;   /* see IdentifyStorageSystem */
            ioCleanUp(pmmioinfo);
            return(MMIO_ERROR);
         }

         /* Allocate memory for pTempBuffer which is used when */
         /* IOProcReadInterLeaved is called. */

         if (ENTERCRIT(rc)) {
            ioCleanUp(pmmioinfo);
            return MMIO_ERROR;
         }

         pinstance->pTempBuffer = HhpAllocMem(hheap, DEFAULTBUFFERSIZE);
         if (pinstance->pTempBuffer == NULL) {
            EXITCRIT;
            pmmioinfo->ulErrorRet = MMIOERR_OUTOFMEMORY;
            ioCleanUp(pmmioinfo);
            return MMIO_ERROR;
         }
         EXITCRIT;

         pinstance->ulTempBufferSize = DEFAULTBUFFERSIZE;
      }

      pinstance->lFileCurrentPosition = 0;

      pinstance->hmmioFileHandle = mmioOpen(pszFileName, &Localmmioinfo,
          Localmmioinfo.ulFlags);

      if (pinstance->hmmioFileHandle <= (HMMIO)0L) /* Test file open error. */
         rc = Localmmioinfo.ulErrorRet;
      else {
              /* Call file format specific open routine */
         rc = ffOpenWrite(pmmioinfo, pinstance);

         if (rc == 0) {
            if (!(pmmioinfo->ulFlags & MMIO_CREATE)) {
               rc = ioAddTracksToMovieHeader(pinstance);

               if (rc == 0) {

                  /* Set lLogicalFilePos to a position pass the header */
                  /* block to allow read occurring at the first byte */
                  /* of non-header data. */

                  lFilePosition = ffSeekToDataBegin(pmmioinfo, pinstance);
                  if (lFilePosition < MMIO_SUCCESS) rc = MMIO_ERROR;
                  else pinstance->lFileCurrentPosition = lFilePosition;
               }
            }
         }
      }

      if (rc != 0) {
         pmmioinfo->ulErrorRet = rc;
         ioCleanUp(pmmioinfo);
         return MMIO_ERROR;
      }
   }

   /* Set up the pathname in the instance structure */

   if (strlen(pszFileName) < CCHMAXPATH) {
      strcpy((PSZ)&(pinstance->szFileName), pszFileName);
      if ((pinstance->szFileName)[1] == ':')
         pinstance->ulEditFlags |= FULLY_QUALIFIED_PATH;
   }

#endif

   return MMIO_SUCCESS;
}


[Back: Decompression]
[Next: Determining the CODEC Procedure]