AAFRESULT STDMETHODCALLTYPE ImplAAFEssenceData::GetFileMob (ImplAAFSourceMob ** ppFileMob) { AAFRESULT result = AAFRESULT_SUCCESS; ImplAAFMob *pMob = NULL; ImplAAFSourceMob *pSourceMob = NULL; ImplAAFEssenceDescriptor *pEssenceDescriptor = NULL; ImplAAFHeader *pHeader = NULL; aafMobID_t mobID; if(NULL == ppFileMob) return(AAFRESULT_NULL_PARAM); XPROTECT() { CHECK(GetFileMobID(&mobID)); // Does a mob with the ID already exist? If not, return error. // NOTE: Will return AAFRESULT_OBJECT_NOT_PERSISTENT if this object has // not been appended to to the file. CHECK(MyHeadObject(&pHeader)); CHECK(pHeader->LookupMob(mobID, &pMob)); // This should be a valid file mob which is a file mob. pSourceMob = dynamic_cast<ImplAAFSourceMob *>(pMob); if (NULL == pSourceMob) RAISE(AAFRESULT_NOT_FILEMOB); // Does the source mob contain a file descriptor? CHECK(pSourceMob->GetEssenceDescriptor(&pEssenceDescriptor)); if (dynamic_cast<ImplAAFFileDescriptor *>(pEssenceDescriptor)) { (*ppFileMob) = pSourceMob; pSourceMob->AcquireReference(); } } /* XPROTECT */ XEXCEPT { // save the error code. result = (XCODE()); NO_PROPAGATE(); } XEND; // cleanup // Note: pMob and pSourceMob are temp and should not be released. if (pEssenceDescriptor) { pEssenceDescriptor->ReleaseReference(); pEssenceDescriptor = NULL; } if (pMob) { pMob->ReleaseReference(); pMob = NULL; } if (pHeader) { pHeader->ReleaseReference(); pHeader = NULL; } return(result); }
//************************ // Function: FindTimecodeClip (INTERNAL) // Finds the primary timecode track. This will have a physical slot # of 0 (missing) or 1. // AAFRESULT ImplAAFSourceMob::FindTimecodeClip( aafFrameOffset_t position, ImplAAFTimecode **result, aafFrameOffset_t *tcStartPos, aafLength_t *tcSlotLen) { ImplAAFSegment * seg = NULL; aafPosition_t offset; aafPosition_t sequPos; ImplAAFMobSlot *slot = NULL; ImplEnumAAFMobSlots *slotIter = NULL; aafBool found = kAAFFalse; aafUInt32 phys; XPROTECT() { offset = position; *tcStartPos = 0; *result = NULL; CHECK(GetSlots (&slotIter)); while((found != kAAFTrue) && slotIter->NextOne(&slot) == AAFRESULT_SUCCESS) { ImplAAFDataDefSP pDataDef; CHECK(slot->GetDataDef (&pDataDef)); aafBool isTimecode = kAAFFalse; CHECK(pDataDef->IsTimecodeKind(&isTimecode)); if(isTimecode) { CHECK(slot->GetPhysicalNum (&phys)); if((phys == 0) || (phys == 1)) found = kAAFTrue; } } if(found != kAAFTrue) RAISE(AAFRESULT_MISSING_TRACKID); CHECK(slot->GetSegment(&seg)); CHECK(seg->GetLength(tcSlotLen)); CHECK(seg->OffsetToTimecodeClip(offset, result, &sequPos)); *tcStartPos = sequPos; slot->ReleaseReference(); slot = NULL; seg->ReleaseReference(); seg = NULL; slotIter->ReleaseReference(); slotIter = NULL; } /* XPROTECT */ XEXCEPT { if(XCODE() == AAFRESULT_NO_MORE_OBJECTS) RERAISE(AAFRESULT_NO_TIMECODE); if(slotIter!= NULL) slotIter->ReleaseReference(); slotIter = 0; if(slot != NULL) slot->ReleaseReference(); slot = 0; if(seg != NULL) seg->ReleaseReference(); seg = 0; *result = NULL; } XEND; return(AAFRESULT_SUCCESS); }
AAFRESULT STDMETHODCALLTYPE ImplAAFEssenceData::SetFileMob (ImplAAFSourceMob * pFileMob) { AAFRESULT result = AAFRESULT_SUCCESS; ImplAAFMob *pMob = NULL; ImplAAFSourceMob *pSourceMob = NULL; ImplAAFEssenceDescriptor *pEssenceDescriptor = NULL; ImplAAFFileDescriptor *pFileDescriptor = NULL; ImplAAFHeader *pHeader = NULL; aafMobID_t mobID; if(NULL == pFileMob) return(AAFRESULT_NULL_PARAM); XPROTECT() { CHECK(pFileMob->GetMobID(&mobID)); // move to ImplAAFContentStorage::AppendEssenceData(). // Does a mob with the ID already exist? If not, return error CHECK(pFileMob->MyHeadObject(&pHeader)); CHECK(pHeader->LookupMob(mobID, &pMob)); // Make sure the mob is a valid File source mob??? pSourceMob = dynamic_cast<ImplAAFSourceMob *>(pMob); if (NULL == pSourceMob) RAISE(AAFRESULT_INVALID_FILE_MOB); // Must result = pSourceMob->GetEssenceDescriptor(&pEssenceDescriptor); if (AAFRESULT_SUCCESS != result) RAISE(AAFRESULT_INVALID_FILE_MOB); pFileDescriptor = dynamic_cast<ImplAAFFileDescriptor *>(pEssenceDescriptor); if (NULL == pFileDescriptor) RAISE(AAFRESULT_INVALID_FILE_MOB); // The mob id refers to a valid file source mob so we can save // the id. _fileMobID = mobID; } /* XPROTECT */ XEXCEPT { // save the error code. result = (XCODE()); NO_PROPAGATE(); } XEND; // cleanup if (pEssenceDescriptor) { pEssenceDescriptor->ReleaseReference(); pEssenceDescriptor = NULL; } if (pMob) { pMob->ReleaseReference(); pMob = NULL; } if (pHeader) { pHeader->ReleaseReference(); pHeader = NULL; } return(result); }