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