static HRESULT ReadAAFFile(aafWChar * pFileName) { // IAAFSession * pSession = NULL; IAAFFile * pFile = NULL; bool bFileOpen = false; IAAFHeader * pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFContainerDef* pContainer = NULL; IAAFDefObject * pDef = NULL; IAAFEssenceDescriptor *pEdesc = NULL; IAAFSourceMob *pSourceMob = NULL; IAAFMob *aMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IAAFMobSlot *slot = NULL; IAAFFileDescriptor *pFileDesc = NULL; IAAFFileDescriptor2 *pFileDesc2 = NULL; aafNumSlots_t numMobs, n, s; HRESULT hr = S_OK; aafRational_t testSampleRate; aafUID_t testContainer; aafLength_t testLength; aafUInt32 testLinkedSlotID; // aafBool testBool; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); // Get the number of mobs in the file (should be one) checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->GetMobs (NULL, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500]; aafNumSlots_t numSlots; aafMobID_t mobID; aafSlotID_t trackID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->CountSlots (&numSlots)); if (2 != numSlots) return AAFRESULT_TEST_FAILED; if(numSlots != 0) { checkResult(aMob->GetSlots(&slotIter)); for(s = 0; s < numSlots; s++) { checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetSlotID(&trackID)); slot->Release(); slot = NULL; } } checkResult(aMob->QueryInterface (IID_IAAFSourceMob, (void **)&pSourceMob)); checkResult(pSourceMob->GetEssenceDescriptor (&pEdesc)); checkResult(pEdesc->QueryInterface(IID_IAAFFileDescriptor, (void **) &pFileDesc)); checkResult(pFileDesc->GetSampleRate (&testSampleRate)); checkExpression(testSampleRate.numerator == checkSampleRate.numerator, AAFRESULT_TEST_FAILED); checkExpression(testSampleRate.denominator == checkSampleRate.denominator, AAFRESULT_TEST_FAILED); checkResult(pFileDesc->GetContainerFormat (&pContainer)); checkResult(pContainer->QueryInterface(IID_IAAFDefObject, (void **) &pDef)); checkResult(pDef->GetAUID(&testContainer)); pContainer->Release(); pContainer = NULL; pDef->Release(); pDef = NULL; checkExpression(memcmp(&testContainer, &checkContainer, sizeof(testContainer)) == 0, AAFRESULT_TEST_FAILED); checkResult(pFileDesc->GetLength (&testLength)); checkExpression(checkLength == testLength, AAFRESULT_TEST_FAILED); checkResult(pFileDesc->QueryInterface(IID_IAAFFileDescriptor2, (void **)&pFileDesc2)); checkResult(pFileDesc2->GetLinkedSlotID (&testLinkedSlotID)); checkExpression(checkLinkedSlotID == testLinkedSlotID, AAFRESULT_TEST_FAILED); // checkResult(pFileDesc->GetIsInContainer (&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); pEdesc->Release(); pEdesc = NULL; pFileDesc->Release(); pFileDesc = NULL; pFileDesc2->Release(); pFileDesc2 = NULL; pSourceMob->Release(); pSourceMob = NULL; aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return if (slot) slot->Release(); if (pFileDesc) pFileDesc->Release(); if (pFileDesc2) pFileDesc2->Release(); if (slotIter) slotIter->Release(); if (pEdesc) pEdesc->Release(); if (pSourceMob) pSourceMob->Release(); if (aMob) aMob->Release(); if(mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile* pFile = NULL; IAAFHeader* pHeader = NULL; IEnumAAFMobs* pMobIter = NULL; IAAFMob* pMob = NULL; IAAFSourceMob* pSourceMob = NULL; IAAFEssenceDescriptor* pEssDesc = NULL; IAAFTIFFDescriptor* pTIFFDesc = NULL; aafNumSlots_t numMobs = 0; HRESULT hr = AAFRESULT_SUCCESS; aafBool isContiguous, isUniform; aafInt32 leadingLines, trailingLines; aafUInt32 size; aafUInt8 summary[512]; try { // Open the AAF file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); // Get the AAF file header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->GetMobs(NULL, &pMobIter)); checkResult(pMobIter->NextOne(&pMob)); checkResult(pMob->QueryInterface(IID_IAAFSourceMob, (void **)&pSourceMob)); // Back into testing mode checkResult(pSourceMob->GetEssenceDescriptor(&pEssDesc)); checkResult(pEssDesc->QueryInterface(IID_IAAFTIFFDescriptor, (void **)&pTIFFDesc)); checkResult(pTIFFDesc->GetIsContiguous(&isContiguous)); checkResult(pTIFFDesc->GetIsUniform(&isUniform)); checkResult(pTIFFDesc->GetLeadingLines(&leadingLines)); checkResult(pTIFFDesc->GetTrailingLines(&trailingLines)); checkResult(pTIFFDesc->GetSummaryBufferSize(&size)); checkExpression(size == 34, AAFRESULT_TEST_FAILED); checkResult(pTIFFDesc->GetSummary(size, summary)); checkExpression(isContiguous == kAAFTrue, AAFRESULT_TEST_FAILED); checkExpression(isUniform == kAAFFalse, AAFRESULT_TEST_FAILED); checkExpression(leadingLines == 10, AAFRESULT_TEST_FAILED); checkExpression(trailingLines == 20, AAFRESULT_TEST_FAILED); // The next statement is not true when doing cross-platform tests //#if defined( OS_WINDOWS ) // checkExpression(memcmp(summary, "II", 2) == 0, AAFRESULT_TEST_FAILED); //#else // checkExpression(memcmp(summary, "MM", 2) == 0, AAFRESULT_TEST_FAILED); //#endif // NOTE: The elements in the summary structure need to be byte swapped // on Big Endian system (i.e. the MAC). } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return if (pEssDesc) pEssDesc->Release(); if (pTIFFDesc) pTIFFDesc->Release(); if (pMob) pMob->Release(); if (pSourceMob) pSourceMob->Release(); if (pHeader) pHeader->Release(); if (pMobIter) pMobIter->Release(); if (pFile) { pFile->Close(); pFile->Release(); } return hr; }
static HRESULT OpenAAFFile(aafWChar * pFileName, bool comp_enable) { IAAFFile* pFile = NULL; IAAFHeader* pHeader = NULL; IAAFDictionary* pDictionary = NULL; IAAFMob* pMob = NULL; IAAFEssenceAccess* pEssenceAccess = NULL; IEnumAAFMobs* pMobIter = NULL; aafNumSlots_t numMobs, numSlots; aafSearchCrit_t criteria; aafMobID_t mobID; IAAFDataDef *pPictureDef = NULL; IAAFMobSlot* pMobSlot = NULL; // Open an AAF file check(AAFFileOpenExistingRead (pFileName, 0, &pFile)); check(pFile->GetHeader(&pHeader)); // Open raw video output file FILE *output; const char *output_file = comp_enable ? "raw.uyvy" : "raw.mjpeg"; if ((output = fopen(output_file, "wb")) == NULL) { perror(output_file); exit(1); } // Get the AAF Dictionary from the file check(pHeader->GetDictionary(&pDictionary)); /* Lookup any necessary data definitions. */ check(pDictionary->LookupDataDef(kAAFDataDef_Picture, &pPictureDef)); /* Check number of Mobs in file */ check(pHeader->CountMobs(kAAFMasterMob, &numMobs)); if (numMobs == 0) return 0; printf("Found %d Master Mobs\n", numMobs); criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFMasterMob; check(pHeader->GetMobs(&criteria, &pMobIter)); while (AAFRESULT_SUCCESS == pMobIter->NextOne(&pMob)) { char mobIDstr[256]; char mobName[256]; aafWChar namebuf[1204]; IAAFTimelineMobSlot* pTimelineMobSlot = NULL; IAAFDataDef *pDataDef = NULL; IEnumAAFMobSlots* pMobSlotIter = NULL; check(pMob->GetMobID (&mobID)); check(pMob->GetName (namebuf, sizeof(namebuf))); convert(mobName, sizeof(mobName), namebuf); MobIDtoString(mobID, mobIDstr); printf(" MasterMob Name = '%s'\n", mobName); printf(" (mobID %s)\n", mobIDstr); // Get the number of slots check(pMob->CountSlots(&numSlots)); // Iterating through all Mob Slots check(pMob->GetSlots(&pMobSlotIter)); while(AAFRESULT_SUCCESS == pMobSlotIter->NextOne(&pMobSlot)) { // Check to see if it is a Video Timeline Mob Slot HRESULT hr; hr = pMobSlot->QueryInterface(IID_IAAFTimelineMobSlot,(void **) &pTimelineMobSlot); if (FAILED(hr)) { pMobSlot->Release(); pMobSlot = NULL; continue; } check(pMobSlot->GetDataDef(&pDataDef)); // Check that we have a picture data def aafBool bIsPictureKind = kAAFFalse; check(pDataDef->IsPictureKind(&bIsPictureKind)); if (kAAFTrue != bIsPictureKind) { pTimelineMobSlot->Release(); pTimelineMobSlot = NULL; pDataDef->Release(); pDataDef = NULL; continue; // skip non-picture data defs } aafUInt32 MobSlotID; IAAFMasterMob* pMasterMob = NULL; // Prepare to get video data: first get MobSlotID check(pMobSlot->GetSlotID(&MobSlotID)); // Then get a Master Mob interface check(pMob->QueryInterface(IID_IAAFMasterMob, (void **)&pMasterMob)); printf(" Opening slot %d with %s\n", MobSlotID, comp_enable ? "CompressionEnable" : "CompressionDisable"); // Open the Essence Data check(pMasterMob->OpenEssence(MobSlotID, NULL, kAAFMediaOpenReadOnly, comp_enable ? kAAFCompressionEnable : kAAFCompressionDisable, &pEssenceAccess)); // First put the codec into YUV pixel format IAAFEssenceFormat* pSetFormat = NULL; aafInt32 YUV_pixel = kAAFColorSpaceYUV; check(pEssenceAccess->GetEmptyFileFormat(&pSetFormat)); check(pSetFormat->AddFormatSpecifier(kAAFPixelFormat, 4, (unsigned char *) &YUV_pixel)); check(pEssenceAccess->PutFileFormat(pSetFormat)); pSetFormat->Release(); // Get the information about the format of the video data. // The pFormat object must be setup with each specifier you // wish to access, otherwise you get AAFRESULT_FORMAT_NOT_FOUND. aafRational_t sampleRate; aafUInt32 maxSampleSize; aafRect_t storedRect; aafFrameLayout_t frameLayout; IAAFEssenceFormat *fmtTemplate = NULL; IAAFEssenceFormat* pFormat = NULL; check(pEssenceAccess->GetEmptyFileFormat (&fmtTemplate)); check(fmtTemplate->AddFormatSpecifier(kAAFSampleRate, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFMaxSampleBytes, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFStoredRect, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFFrameLayout, 0, NULL)); check(pEssenceAccess->GetFileFormat(fmtTemplate, &pFormat)); fmtTemplate->Release(); fmtTemplate = NULL; aafInt32 fmtBytesRead; check(pFormat->GetFormatSpecifier(kAAFSampleRate, sizeof(sampleRate), (aafDataBuffer_t)&sampleRate, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFMaxSampleBytes, sizeof(maxSampleSize), (aafDataBuffer_t)&maxSampleSize, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFStoredRect, sizeof(storedRect), (aafDataBuffer_t)&storedRect, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFFrameLayout, sizeof(frameLayout), (aafDataBuffer_t)&frameLayout, &fmtBytesRead)); pFormat->Release(); pFormat = NULL; // Get the sample count which is in terms of EditRate aafLength_t sampleCount; check(pEssenceAccess->CountSamples(pPictureDef, &sampleCount)); const char *frameLayoutStr = ""; switch (frameLayout) { case kAAFFullFrame: frameLayoutStr = "FullFrame"; break; case kAAFOneField: frameLayoutStr = "OneField"; break; case kAAFSeparateFields: frameLayoutStr = "SeparateFields"; break; case kAAFMixedFields: frameLayoutStr = "MixedFields"; break; default: break; } printf("\tSlotID %u: SampleRate=%d/%d MaxSampleBytes=%u StoredRect=%dx%d\n", MobSlotID, sampleRate.numerator, sampleRate.denominator, maxSampleSize, storedRect.xSize, storedRect.ySize); printf("\t\tFrameLayout=%s CountSamples=%"AAFFMT64"d\n", frameLayoutStr, sampleCount); // Buffer to receive samples from ReadSamples aafUInt8 *dataBuf = new aafUInt8[maxSampleSize]; // Buffer to recombine separated fields into interleaved fields aafUInt8 *recombined_buf = new aafUInt8[maxSampleSize]; // Read samples until no more are available aafUInt32 samplesRead, actualBytesRead, total_samples = 0; while (true) { hr = (pEssenceAccess->ReadSamples( 1, // number of samples to read maxSampleSize, // maximum buffer size dataBuf, // output buffer for audio data &samplesRead, // number of samples read &actualBytesRead)); // number of bytes read if (hr == AAFRESULT_EOF) break; else check(hr); aaf_assert(actualBytesRead != 0, "actualBytesRead != 0"); total_samples += samplesRead; aafUInt8* saveBuf = dataBuf; if (comp_enable && frameLayout == kAAFSeparateFields) { // recombine fields into uncompressed frame when decompressing recombine_fields(dataBuf, recombined_buf, storedRect.xSize, storedRect.ySize); saveBuf = recombined_buf; } // Write out video if ( fwrite(saveBuf, maxSampleSize, 1, output) != 1 ) { perror(output_file); return 1; } } printf("\tTotal samples=%u - written to %s\n", total_samples, output_file); delete [] dataBuf; delete [] recombined_buf; pEssenceAccess->Release(); pEssenceAccess = NULL; pMasterMob->Release(); pMasterMob = NULL; } pMobSlotIter->Release(); pMobSlotIter = NULL; pMob->Release(); pMob = NULL; } pMobIter->Release(); pMobIter = NULL; return moduleErrorTmp; }
static HRESULT ReadAAFFile(aafWChar* pFileName) { IAAFFile* pFile = NULL; bool bFileOpen = false; IAAFHeader* pHeader = NULL; IEnumAAFMobs* pMobIter = NULL; IAAFMob* pMob = NULL; IAAFMasterMob* pMasterMob = NULL; IEnumAAFMobSlots* pSlotIter = NULL; IAAFMobSlot* pSlot; aafNumSlots_t numMobs; aafSearchCrit_t criteria; IAAFSearchSource* pSearchSource = NULL; IAAFFindSourceInfo* pSourceInfo = NULL; IAAFMob* si_mob = NULL; //mob used by SourceInfo intf. HRESULT hr = S_OK; try { // Open the AAF file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // Get the AAF file header. checkResult(pFile->GetHeader(&pHeader)); // Validate that there is on one master mob in the test file. checkResult(pHeader->CountMobs(kAAFMasterMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); // Enumerate over Master MOBs criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFMasterMob; checkResult(pHeader->GetMobs(&criteria, &pMobIter)); while (pMobIter && pMobIter->NextOne(&pMob) == AAFRESULT_SUCCESS) { aafWChar name[500]; aafNumSlots_t numSlots = 0; aafMobID_t mobID; // TODO: Test Master MOB specific methods here checkResult(pMob->QueryInterface(IID_IAAFMasterMob, (void **) &pMasterMob)); checkResult(pMob->GetName(name, sizeof(name))); checkExpression(wcscmp(name, MobName) == 0, AAFRESULT_TEST_FAILED); checkResult(pMob->GetMobID(&mobID)); checkExpression(0 == memcmp(&mobID, &TEST_Master_MobID, sizeof(mobID)), AAFRESULT_TEST_FAILED); checkResult(pMob->CountSlots(&numSlots)); checkExpression(NumMobSlots == numSlots, AAFRESULT_TEST_FAILED); //AAFRESULT STDMETHODCALLTYPE // ImplAAFMasterMob::GetTapeNameBufLen (0, // aafInt32* pLen) unsigned long s = 0; // Enumerate over all MOB slots for this MOB checkResult(pMob->GetSlots(&pSlotIter)); while (pSlotIter && pSlotIter->NextOne(&pSlot) == AAFRESULT_SUCCESS) { aafWChar slotName[500]; aafSlotID_t slotID; //aafUInt32 bufSize = 0; // Validate the slot name checkResult(pSlot->GetName(slotName, sizeof(slotName))); checkExpression(wcscmp(slotName, slotNames[s]) == 0, AAFRESULT_TEST_FAILED); // Validate the slot id. checkResult(pSlot->GetSlotID(&slotID)); checkExpression(slotID == s+1, AAFRESULT_TEST_FAILED); //Now, do a search source ............... //Get a search source intf. checkResult( pMasterMob->QueryInterface(IID_IAAFSearchSource, (void**)&pSearchSource) ); //From the searchsource inft, get a FindSourceINfo intf. checkResult ( pSearchSource->SearchSource( slotID, 0, kAAFTapeMob, NULL, //don't care about Media Criteria NULL, //don't care about operation choice &pSourceInfo)); //This is an important milestone! At this point, we were successful - about getting a pSourceInfo intf. // so, release the search source intf. if (pSearchSource) { pSearchSource->Release(); pSearchSource=NULL; } //NOw, simply test the methods on the (final) SourceInfo intf. aafRational_t si_editRate = {-1}; aafLength_t si_length = {-1}; aafSourceRef_t si_sourceRef = {{{0,0,0,0,0,0,0,0,0,0,0,0},0,0,0,0,{0,0,0,{0,0,0,0,0,0,0,0}}},0,0}; aafMobID_t si_MobID = {{0,0,0,0,0,0,0,0,0,0,0,0},0,0,0,0, {0,0,0,{0,0,0,0,0,0,0,0}}}; //Call the methods pSourceInfo->GetEditRate( &si_editRate); pSourceInfo->GetLength(&si_length); pSourceInfo->GetMob(&si_mob); pSourceInfo->GetSourceReference(&si_sourceRef); //Check the values returned by the methods //edit rate checkExpression(si_editRate.numerator == slotRates[s].numerator, AAFRESULT_TEST_FAILED); checkExpression(si_editRate.denominator == slotRates[s].denominator, AAFRESULT_TEST_FAILED); //Length checkExpression(si_length == TAPE_MOB_LENGTH_ARR[s], AAFRESULT_TEST_FAILED); //Mob checkExpression(si_mob!=NULL, AAFRESULT_TEST_FAILED); si_mob->GetMobID(&si_MobID); checkExpression(memcmp(&si_MobID, &tapeMobID, sizeof(aafMobID_t))==0, AAFRESULT_TEST_FAILED); //Source Reference checkExpression(si_sourceRef.sourceSlotID == s, AAFRESULT_TEST_FAILED); checkExpression(si_sourceRef.startTime == TAPE_MOB_OFFSET_ARR[s], AAFRESULT_TEST_FAILED); //Done with tests .. release the FindSourceInfo intf .. if (pSourceInfo) { pSourceInfo->Release(); pSourceInfo=NULL; } //Also don't forget to release the si_mob intf. if (si_mob) { si_mob->Release(); si_mob=NULL; } pSlot->Release(); pSlot = NULL; s++; } pSlotIter->Release(); pSlotIter = NULL; pMob->Release(); pMob = NULL; pMasterMob->Release(); pMasterMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return if (pSearchSource) pSearchSource->Release(); if (pSourceInfo) pSourceInfo->Release(); if (si_mob) si_mob->Release(); if (pSlot) pSlot->Release(); if (pMasterMob) pMasterMob->Release(); if (pMob) pMob->Release(); if (pMobIter) pMobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { // IAAFSession * pSession = NULL; IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IAAFEssenceDescriptor *pEdesc = NULL; IAAFSourceMob *pSourceMob = NULL; IEnumAAFLocators * pEnum = NULL; IEnumAAFLocators * pCloneEnum = NULL; IAAFLocator * pLocator = NULL; aafUInt32 numLocators; aafNumSlots_t numMobs, n; HRESULT hr = AAFRESULT_SUCCESS; bool bFileOpen = false; wchar_t testname[256]; IAAFLocator * pArray[2] = { NULL, NULL }; IAAFLocator ** pArrayPoint = pArray; aafUInt32 resultCount; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression (1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->GetMobs (NULL, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500]; aafMobID_t mobID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->QueryInterface (IID_IAAFSourceMob, (void **)&pSourceMob)); checkResult(pSourceMob->GetEssenceDescriptor (&pEdesc)); // Verify that there is now two locators checkResult(pEdesc->CountLocators(&numLocators)); checkExpression(2 == numLocators, AAFRESULT_TEST_FAILED); checkResult(pEdesc->GetLocators(&pEnum)); /* Read and check the first element */ checkResult(pEnum->NextOne(&pLocator)); checkResult(pLocator->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator1) == 0, AAFRESULT_TEST_FAILED); pLocator->Release(); pLocator = NULL; /**/ /* Read and check the second element */ checkResult(pEnum->NextOne(&pLocator)); checkResult(pLocator->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator2) == 0, AAFRESULT_TEST_FAILED); pLocator->Release(); pLocator = NULL; /*****/ /* Reset, and check the first element again*/ checkResult(pEnum->Reset()); checkResult(pEnum->NextOne(&pLocator)); checkResult(pLocator->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator1) == 0, AAFRESULT_TEST_FAILED); pLocator->Release(); pLocator = NULL; /* Reset, Skip, and check the second element again*/ checkResult(pEnum->Reset()); checkResult(pEnum->Skip(1)); checkResult(pEnum->NextOne(&pLocator)); checkResult(pLocator->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator2) == 0, AAFRESULT_TEST_FAILED); pLocator->Release(); pLocator = NULL; /* Reset, and read both elements */ checkResult(pEnum->Reset()); checkResult(pEnum->Next (2, (IAAFLocator **)&pArray, &resultCount)); checkExpression (resultCount == 2, AAFRESULT_TEST_FAILED); checkResult(pArrayPoint[0]->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator1) == 0, AAFRESULT_TEST_FAILED); pArrayPoint[0]->Release(); pArrayPoint[0] = NULL; checkResult(pArrayPoint[1]->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator2) == 0, AAFRESULT_TEST_FAILED); pArrayPoint[1]->Release(); pArrayPoint[1] = NULL; /* Read one past to make sure that it fails */ checkExpression(pEnum->NextOne(&pLocator) != AAFRESULT_SUCCESS, AAFRESULT_TEST_FAILED); /* Clone the enumerator, and read one element */ checkResult(pEnum->Clone(&pCloneEnum)); checkResult(pCloneEnum->Reset()); checkResult(pCloneEnum->NextOne(&pLocator)); checkResult(pLocator->GetPath (testname, sizeof(testname))); checkExpression(wcscmp(testname, locator1) == 0, AAFRESULT_TEST_FAILED); pLocator->Release(); pLocator = NULL; pEnum->Release(); pEnum = NULL; pEdesc->Release(); pEdesc = NULL; pSourceMob->Release(); pSourceMob = NULL; aMob->Release(); aMob = NULL; pCloneEnum->Release(); pCloneEnum = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (pLocator) pLocator->Release(); if (pEnum) pEnum->Release(); if (pEdesc) pEdesc->Release(); if (pSourceMob) pSourceMob->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { // Close file, clean-up and return if (bFileOpen) pFile->Close(); pFile->Release(); } /* hr = pSession->EndSession(); if (AAFRESULT_SUCCESS != hr) return hr; */ return hr; }
static HRESULT OpenAAFFile(aafWChar * pFileName) { IAAFFile* pFile = NULL; IAAFHeader* pHeader = NULL; IAAFDictionary* pDictionary = NULL; IAAFMob* pMob = NULL; IAAFEssenceAccess* pEssenceAccess = NULL; IAAFEssenceFormat* pFormat = NULL; IEnumAAFMobs* pMobIter = NULL; aafNumSlots_t numMobs, numSlots; aafSearchCrit_t criteria; aafMobID_t mobID; IAAFDataDef *pSoundDef = NULL; IAAFMobSlot* pMobSlot = NULL; // Open an AAF file check(AAFFileOpenExistingRead (pFileName, 0, &pFile)); check(pFile->GetHeader(&pHeader)); // Open raw audio output file FILE *output; const char *output_file = "raw.pcm"; if ((output = fopen(output_file, "wb")) == NULL) { perror(output_file); exit(1); } // Get the AAF Dictionary from the file check(pHeader->GetDictionary(&pDictionary)); /* Lookup any necessary data definitions. */ check(pDictionary->LookupDataDef(kAAFDataDef_Sound, &pSoundDef)); /* Check number of Mobs in file */ check(pHeader->CountMobs(kAAFMasterMob, &numMobs)); if (numMobs == 0) { printf("No Master Mobs found in AAF file\n"); return 0; } printf("Found %d Master Mobs\n", numMobs); criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFMasterMob; check(pHeader->GetMobs(&criteria, &pMobIter)); while (AAFRESULT_SUCCESS == pMobIter->NextOne(&pMob)) { char mobIDstr[256]; aafWChar namebuf[1204]; IAAFTimelineMobSlot* pTimelineMobSlot = NULL; IAAFDataDef *pDataDef = NULL; IAAFEssenceFormat *fmtTemplate = NULL; unsigned char *dataBuff = NULL; IEnumAAFMobSlots* pMobSlotIter = NULL; check(pMob->GetMobID (&mobID)); check(pMob->GetName (namebuf, sizeof(namebuf))); MobIDtoString(mobID, mobIDstr); printf(" MasterMob Name = '%ls'\n", namebuf); printf(" (mobID %s)\n", mobIDstr); // Get the number of slots check(pMob->CountSlots(&numSlots)); // Iterating through all Mob Slots check(pMob->GetSlots(&pMobSlotIter)); while(AAFRESULT_SUCCESS == pMobSlotIter->NextOne(&pMobSlot)) { // Check to see if it is an Audio Timeline Mob Slot HRESULT hr; aafUInt32 MobSlotID; hr=pMobSlot->QueryInterface(IID_IAAFTimelineMobSlot,(void **) &pTimelineMobSlot); if (SUCCEEDED(hr)) { check(pMobSlot->GetDataDef(&pDataDef)); // Check that we have a sound file by examining its data definition aafBool bIsSoundKind = kAAFFalse; check(pDataDef->IsSoundKind(&bIsSoundKind)); if (kAAFTrue == bIsSoundKind) { IAAFMasterMob* pMasterMob = NULL; // Prepare to get audio data: first get MobSlotID check(pMobSlot->GetSlotID(&MobSlotID)); // Then get a Master Mob interface check(pMob->QueryInterface(IID_IAAFMasterMob, (void **)&pMasterMob)); // Open the Essence Data check(pMasterMob->OpenEssence(MobSlotID, NULL, kAAFMediaOpenReadOnly, kAAFCompressionDisable, &pEssenceAccess)); // Get the information about the format of the audio data. // The pFormat object must be setup with each specifier you // wish to access, otherwise you get AAFRESULT_FORMAT_NOT_FOUND. aafUInt32 audioSampleBits; aafRational_t sampleRate; aafUInt32 numChannels; aafUInt32 maxSampleBytes; check(pEssenceAccess->GetEmptyFileFormat(&fmtTemplate)); check(fmtTemplate->AddFormatSpecifier(kAAFAudioSampleBits, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFSampleRate, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFNumChannels, 0, NULL)); check(fmtTemplate->AddFormatSpecifier(kAAFMaxSampleBytes, 0, NULL)); check(pEssenceAccess->GetFileFormat(fmtTemplate, &pFormat)); fmtTemplate->Release(); fmtTemplate = NULL; aafInt32 fmtBytesRead; check(pFormat->GetFormatSpecifier(kAAFAudioSampleBits, sizeof(audioSampleBits), (aafDataBuffer_t)&audioSampleBits, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFSampleRate, sizeof(sampleRate), (aafDataBuffer_t)&sampleRate, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFNumChannels, sizeof(numChannels), (aafDataBuffer_t)&numChannels, &fmtBytesRead)); check(pFormat->GetFormatSpecifier(kAAFMaxSampleBytes, sizeof(maxSampleBytes), (aafDataBuffer_t)&maxSampleBytes, &fmtBytesRead)); pFormat->Release(); pFormat = NULL; // Get the sample count which is in terms of EditRate aafLength_t sampleCount; check(pEssenceAccess->CountSamples(pSoundDef, &sampleCount)); printf("\tSlotID %u: SampleBits=%d SampleRate=%d/%d NumChannels=%d MaxSampleBytes=%u\n", MobSlotID, audioSampleBits, sampleRate.numerator, sampleRate.denominator, numChannels, maxSampleBytes); printf("\t\tCountSamples=%"AAFFMT64"d\n", sampleCount); // Set a suitable buffer size dataBuff = new unsigned char[maxSampleBytes]; // Read samples until no more are available aafUInt32 samplesRead, actualBytesRead, total_samples = 0; while (true) { hr = (pEssenceAccess->ReadSamples( 1, // number of samples to read maxSampleBytes, // maximum buffer size dataBuff, // output buffer for audio data &samplesRead, // number of samples read &actualBytesRead)); // number of bytes read if (hr == AAFRESULT_EOF) break; else check(hr); if (actualBytesRead!=0) { total_samples += samplesRead; // Write out samples if ( fwrite(dataBuff, maxSampleBytes, 1, output) != 1 ) { perror(output_file); return 1; } } } printf("\tTotal samples = %u (written to %s)\n", total_samples, output_file); delete [] dataBuff; dataBuff = NULL; pEssenceAccess->Release(); pEssenceAccess = NULL; pMasterMob->Release(); pMasterMob = NULL; } pTimelineMobSlot->Release(); pTimelineMobSlot = NULL; pDataDef->Release(); pDataDef = NULL; } pMobSlot->Release(); pMobSlot = NULL; } pMobSlotIter->Release(); pMobSlotIter = NULL; pMob->Release(); pMob = NULL; } pMobIter->Release(); pMobIter = NULL; return moduleErrorTmp; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile *pFile = NULL; bool bFileOpen = false; IAAFHeader *pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IAAFMobSlot *slot = NULL; IAAFSegment *pSeg = NULL; IAAFSourceClip *pSourceClip = NULL; IAAFDataDef * pDataDef = 0; IAAFDefObject * pDefObj = 0; aafNumSlots_t numMobs, n; aafSlotID_t s; aafUInt32 length; HRESULT hr = S_OK; aafUID_t readUID, typeUID = kAAFDataDef_Picture; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); aafSearchCrit_t criteria; criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (&criteria, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500], slotName[500]; aafNumSlots_t numSlots; aafMobID_t mobID; aafSlotID_t trackID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->CountSlots (&numSlots)); checkExpression(5 == numSlots, AAFRESULT_TEST_FAILED); checkResult(aMob->GetSlots(&slotIter)); for(s = 0; s < (aafSlotID_t)numSlots; s++) { checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetNameBufLen(&length)); checkResult(slot->GetName (slotName, length)); checkExpression (wcscmp(slotName, slotNames[s]) == 0, AAFRESULT_TEST_FAILED); checkResult(slot->GetSlotID(&trackID)); checkExpression (trackID == s+1, AAFRESULT_TEST_FAILED); checkResult(slot->GetPhysicalNum(&trackID)); checkExpression (trackID == s+2, AAFRESULT_TEST_FAILED); checkResult(slot->GetPhysicalNum(&trackID)); checkResult(slot->GetDataDef(&pDataDef)); checkResult(pDataDef->QueryInterface (IID_IAAFDefObject, (void **)&pDefObj)); checkResult(pDefObj->GetAUID(&readUID)); checkExpression (memcmp(&typeUID, &readUID, sizeof(typeUID)) == 0, AAFRESULT_TEST_FAILED); checkResult(slot->GetSegment(&pSeg)); checkResult(pSeg->QueryInterface (IID_IAAFSourceClip, (void **)&pSourceClip)); pDataDef->Release(); pDataDef = 0; pDefObj->Release (); pDefObj = 0; pSourceClip->Release(); pSourceClip = NULL; pSeg->Release(); pSeg = NULL; slot->Release(); slot = NULL; } aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (slot) { slot->Release(); slot = 0; } if (pSeg) { pSeg->Release(); pSeg = 0; } if (pSourceClip) { pSourceClip->Release(); pSourceClip = 0; } if (slotIter) { slotIter->Release(); slotIter = 0; } if (aMob) { aMob->Release(); aMob = 0; } if (mobIter) { mobIter->Release(); mobIter = 0; } if (pHeader) { pHeader->Release(); pHeader = 0; } if (pDataDef) { pDataDef->Release(); pDataDef = 0; } if (pDefObj) { pDefObj->Release (); pDefObj = 0; } if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); pFile = 0; } return hr; }
static HRESULT ReadAAFFile(aafWChar* pFileName) { IAAFFile* pFile = NULL; IAAFHeader* pHeader = NULL; IAAFDictionary* pDictionary = NULL; IEnumAAFOperationDefs *pOperationGroupEnum = NULL; IEnumAAFParameterDefs *pParmDefEnum = NULL; IAAFOperationDef *pOperationDef = NULL; IAAFParameterDef *pParmDef = NULL; IAAFParameter *pParameter = NULL; IAAFMetaDefinition* pMetaDefinition = NULL; IAAFSegment* pSeg = NULL; IAAFOperationGroup* pOperationGroup = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob* pMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IAAFMobSlot* pSlot = NULL; IAAFFiller* pFill = NULL; IAAFSourceReference *pSourceRef = NULL; IEnumAAFControlPoints *pEnumCP = NULL; IAAFControlPoint *pControlPoint = NULL; IAAFVaryingValue *pVaryingValue = NULL; IAAFInterpolationDef *pInterpDef = NULL; IAAFTypeDef *pTypeDef = NULL; bool bFileOpen = false; aafBool readIsTimeWarp; aafUInt32 testNumSources, testNumParam; HRESULT hr = S_OK; aafNumSlots_t s; aafNumSlots_t numSlots; aafUInt32 readOverride; aafBool readValidTransition; aafRational_t testTime; aafRational_t sampleValue1 = kTestLevel1, sampleValue2 = kTestLevel2, testValue; aafRational_t checkTime1 = kTestTime1; aafRational_t checkTime2 = kTestTime2; aafEditHint_t checkEditHint; aafUID_t testInterpDef, checkInterpDef = kAAFTypeID_Rational; try { // Open the AAF file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // Get the AAF file header. checkResult(pFile->GetHeader(&pHeader)); aafSearchCrit_t criteria; criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (&criteria, &mobIter)); checkResult(mobIter->NextOne (&pMob)); checkResult(pMob->GetSlots(&slotIter)); checkResult(pMob->CountSlots (&numSlots)); for(s = 0; s < numSlots; s++) { checkResult(slotIter->NextOne (&pSlot)); checkResult(pSlot->GetSegment (&pSeg)); checkResult(pSeg->QueryInterface (IID_IAAFOperationGroup, (void **)&pOperationGroup)); pSeg->Release(); pSeg = NULL; checkResult(pOperationGroup->CountSourceSegments(&testNumSources)); checkExpression(testNumSources == TEST_NUM_INPUTS, AAFRESULT_TEST_FAILED); checkResult(pOperationGroup->CountParameters(&testNumParam)); checkExpression(testNumSources == 1, AAFRESULT_TEST_FAILED); checkResult(pOperationGroup->IsATimeWarp (&readIsTimeWarp)); checkExpression(readIsTimeWarp == kAAFFalse, AAFRESULT_TEST_FAILED); checkResult(pOperationGroup->GetBypassOverride (&readOverride)); checkExpression(readOverride == 1, AAFRESULT_TEST_FAILED); checkResult(pOperationGroup->IsValidTranOperation (&readValidTransition)); checkExpression(readValidTransition == kAAFFalse, AAFRESULT_TEST_FAILED); /**/ checkResult(pOperationGroup->GetInputSegmentAt (0, &pSeg)); checkResult(pSeg->QueryInterface(IID_IAAFFiller, (void **) &pFill)); pFill->Release(); pFill = NULL; /**/ checkResult(pOperationGroup->LookupParameter (kTestParmID, &pParameter)); checkResult(pParameter->QueryInterface(IID_IAAFVaryingValue, (void **) &pVaryingValue)); /*** Check the VaryingValue methods **/ aafUInt32 testLen, bytesRead; checkResult(pVaryingValue->GetControlPoints(&pEnumCP)); checkResult(pEnumCP->NextOne(&pControlPoint)); checkResult(pControlPoint->GetValueBufLen (&testLen)); checkExpression(testLen == sizeof(sampleValue1), AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetValue (sizeof(sampleValue1), (aafDataBuffer_t)&testValue, &bytesRead)); checkExpression(testValue.numerator == sampleValue1.numerator, AAFRESULT_TEST_FAILED); checkExpression(testValue.denominator == sampleValue1.denominator, AAFRESULT_TEST_FAILED); checkExpression(bytesRead == sizeof(sampleValue1), AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetTime(&testTime)); checkExpression(testTime.numerator == checkTime1.numerator, AAFRESULT_TEST_FAILED); checkExpression(testTime.denominator == checkTime1.denominator, AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetEditHint(&checkEditHint)); checkExpression(checkEditHint == kAAFRelativeLeft, AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetTypeDefinition (&pTypeDef)); checkResult(pTypeDef->QueryInterface(IID_IAAFMetaDefinition, (void **) &pMetaDefinition)); checkResult(pMetaDefinition->GetAUID(&testInterpDef)); checkExpression(memcmp(&testInterpDef, &checkInterpDef, sizeof(aafUID_t)) == 0, AAFRESULT_TEST_FAILED); pControlPoint->Release(); pControlPoint = NULL; pTypeDef->Release(); pTypeDef = NULL; pMetaDefinition->Release(); pMetaDefinition = NULL; /**/ checkResult(pEnumCP->NextOne(&pControlPoint)); checkResult(pControlPoint->GetValueBufLen (&testLen)); checkExpression(testLen == sizeof(sampleValue2), AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetValue (sizeof(sampleValue2), (aafDataBuffer_t)&testValue, &bytesRead)); checkExpression(testValue.numerator == sampleValue2.numerator, AAFRESULT_TEST_FAILED); checkExpression(testValue.denominator == sampleValue2.denominator, AAFRESULT_TEST_FAILED); checkExpression(bytesRead == sizeof(sampleValue2), AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetTime(&testTime)); checkExpression(testTime.numerator == checkTime2.numerator, AAFRESULT_TEST_FAILED); checkExpression(testTime.denominator == checkTime2.denominator, AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetEditHint(&checkEditHint)); checkExpression(checkEditHint == kAAFProportional, AAFRESULT_TEST_FAILED); checkResult(pControlPoint->GetTypeDefinition (&pTypeDef)); checkResult(pTypeDef->QueryInterface(IID_IAAFMetaDefinition, (void **) &pMetaDefinition)); checkResult(pMetaDefinition->GetAUID(&testInterpDef)); checkExpression(memcmp(&testInterpDef, &checkInterpDef, sizeof(aafUID_t)) == 0, AAFRESULT_TEST_FAILED); pControlPoint->Release(); pControlPoint = NULL; pEnumCP->Release(); pEnumCP = NULL; pTypeDef->Release(); pTypeDef = NULL; pMetaDefinition->Release(); pMetaDefinition = NULL; /*****/ pVaryingValue->Release(); pVaryingValue = NULL; pParameter->Release(); pParameter = NULL; pSeg->Release(); pSeg = NULL; pOperationGroup->Release(); pOperationGroup = NULL; pSlot->Release(); pSlot = NULL; } slotIter->Release(); slotIter = NULL; pMob->Release(); pMob = NULL; } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return if (pFill) pFill->Release(); if(pInterpDef) pInterpDef->Release(); if(pVaryingValue) pVaryingValue->Release(); if (pSourceRef) pSourceRef->Release(); if (mobIter) mobIter->Release(); if (pSlot) pSlot->Release(); if (slotIter) slotIter->Release(); if (pMob) pMob->Release(); if (pHeader) pHeader->Release(); if (pSeg) pSeg->Release(); if (pControlPoint) pControlPoint->Release(); if(pEnumCP) pEnumCP->Release(); if (pOperationGroup) pOperationGroup->Release(); if (pDictionary) pDictionary->Release(); if (pOperationGroupEnum) pOperationGroupEnum->Release(); if (pParameter) pParameter->Release(); if (pParmDefEnum) pParmDefEnum->Release(); if (pOperationDef) pOperationDef->Release(); if (pMetaDefinition) pMetaDefinition->Release(); if (pParmDef) pParmDef->Release(); if (pTypeDef) pTypeDef->Release(); if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile *pFile = NULL; bool bFileOpen = false; IAAFHeader *pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IAAFMobSlot *slot = NULL; aafNumSlots_t numMobs, n, s; HRESULT hr = S_OK; IAAFMobSlot* pArray[2] = { NULL, NULL }; IAAFMobSlot** pArrayDef = pArray; aafUInt32 resultCount; IEnumAAFMobSlots *slotClone = NULL; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); aafSearchCrit_t criteria; criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (&criteria, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500], slotName[500]; aafNumSlots_t numSlots; aafMobID_t mobID; aafSlotID_t trackID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->CountSlots (&numSlots)); checkExpression(5 == numSlots, AAFRESULT_TEST_FAILED); checkResult(aMob->GetSlots(&slotIter)); /* Read and check all elements using NextOne */ for(s = 0; s < numSlots; s++) { checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetName (slotName, sizeof(slotName))); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[s]) == 0, AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; } /* Read one past to make sure that it fails */ checkExpression(slotIter->NextOne(&slot) != AAFRESULT_SUCCESS, AAFRESULT_TEST_FAILED); /* Reset, and check the first element again*/ checkResult(slotIter->Reset()); checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetName (slotName, sizeof(slotName))); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[0]) == 0, AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; /* Reset, Skip, and check the second element again*/ checkResult(slotIter->Reset()); checkResult(slotIter->Skip(1)); checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetName (slotName, sizeof(slotName))); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[1]) == 0, AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; /* Reset, and read both elements */ checkResult(slotIter->Reset()); checkResult(slotIter->Next (2, (IAAFMobSlot **)&pArray, &resultCount)); checkExpression (resultCount == 2, AAFRESULT_TEST_FAILED); checkResult(pArrayDef[0]->GetName (slotName, sizeof(slotName))); checkResult(pArrayDef[0]->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[0]) == 0, AAFRESULT_TEST_FAILED); checkResult(pArrayDef[1]->GetName (slotName, sizeof(slotName))); checkResult(pArrayDef[1]->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[1]) == 0, AAFRESULT_TEST_FAILED); pArrayDef[0]->Release(); pArrayDef[0] = NULL; pArrayDef[1]->Release(); pArrayDef[1] = NULL; /* Clone the enumerator, and read one element */ checkResult(slotIter->Clone(&slotClone)); checkResult(slotClone->Reset()); checkResult(slotClone->NextOne (&slot)); checkResult(slot->GetName (slotName, sizeof(slotName))); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[0]) == 0, AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; slotIter->Release(); slotIter = NULL; slotClone->Release(); slotClone = NULL; aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (slot) slot->Release(); if (slotIter) slotIter->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFDictionary *pDictionary = NULL; IAAFFile *pFile = NULL; bool bFileOpen = false; IAAFHeader *pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IAAFMobSlot *slot = NULL; aafNumSlots_t numMobs, n, s; HRESULT hr = S_OK; aafUInt32 bufLen = 0; aafUInt32 bytesRead = 0; aafUInt32 numFound = 0; aafWChar value[500]; IEnumAAFTaggedValues *enumTaggedVal = NULL; IAAFTaggedValue *taggedVal = NULL; aafUID_t testKey; IEnumAAFKLVData *klvEnum = NULL; IAAFKLVData *pKLVData = NULL; IAAFTypeDef* pBaseType = NULL; IAAFSourceClip *pSourceClip = NULL; IAAFSourceReference *pSourceRef = NULL; IAAFSegment *pSegment = NULL; aafMobID_t sourceID; int i; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->GetDictionary(&pDictionary)); CAAFBuiltinDefs defs (pDictionary); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); aafSearchCrit_t criteria; criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (&criteria, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500], slotName[500]; aafNumSlots_t numSlots; aafMobID_t mobID; aafSlotID_t trackID; aafUInt32 nameBufLen = 0; checkResult(mobIter->NextOne (&aMob)); // Check GetNameBufLen and GetName checkExpression(aMob->GetNameBufLen(NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->GetNameBufLen(&nameBufLen)); checkExpression(((wcslen(mobName) + 1) * sizeof(aafCharacter)) == nameBufLen, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetName (NULL, nameBufLen) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetName (name, 4) == AAFRESULT_SMALLBUF, AAFRESULT_TEST_FAILED); checkResult(aMob->GetName (name, nameBufLen)); checkExpression (wcscmp(mobName, name) == 0, AAFRESULT_TEST_FAILED); // Check GetMobID checkExpression(aMob->GetMobID (NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->GetMobID (&mobID)); checkExpression(memcmp(&MOBTestID, &mobID, sizeof(mobID)) == 0, AAFRESULT_TEST_FAILED); // Check the time stamps aafTimeStamp_t created = { {0,0,0}, {0,0,0,0} }; checkExpression(aMob->GetCreateTime(NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->GetCreateTime(&created)); checkTimeStampsAreEqual(creationTimeStamp, created); aafTimeStamp_t modified = { {0,0,0}, {0,0,0,0} }; checkExpression(aMob->GetModTime(NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->GetModTime(&modified)); checkTimeStampsAreEqual(modificationTimeStamp, modified); // Check the GetMobInfo data. memset(&created, 0, sizeof(created)); memset(&modified, 0, sizeof(modified)); checkExpression(aMob->GetMobInfo(NULL, &created, name, sizeof(name)) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetMobInfo(&modified, NULL, name, sizeof(name)) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetMobInfo(&modified, &created, NULL, sizeof(name)) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetMobInfo(&modified, &created, name, 1) == AAFRESULT_SMALLBUF, AAFRESULT_TEST_FAILED); checkResult(aMob->GetMobInfo(&modified, &created, name, sizeof(name))); checkTimeStampsAreEqual(creationTimeStamp, created); checkTimeStampsAreEqual(modificationTimeStamp, modified); checkExpression (wcscmp(mobName, name) == 0, AAFRESULT_TEST_FAILED); checkExpression(aMob->CountSlots (NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->CountSlots (&numSlots)); //seven slots made by IAAFMob and one static slot and event slot made throught IAAFMOb2 checkExpression((7+1+1) == numSlots, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetSlots(NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkResult(aMob->GetSlots(&slotIter)); for(s = 0; s < numSlots; s++) { checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetNameBufLen(&bufLen)); checkResult(slot->GetName (slotName, bufLen)); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[s]) == 0, AAFRESULT_TEST_FAILED); checkExpression(trackID == (s+1), AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; bufLen = 0; trackID = 0; } slotIter->Release(); slotIter = NULL; // GetSlotAt checkExpression(aMob->GetSlotAt(1, NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->GetSlotAt(9, &slot) == AAFRESULT_BADINDEX, AAFRESULT_TEST_FAILED); for (s = 0; s < numSlots; ++s) { checkResult(aMob->GetSlotAt(s, &slot)); checkResult(slot->GetNameBufLen(&bufLen)); checkResult(slot->GetName(slotName, bufLen)); checkResult(slot->GetSlotID(&trackID)); checkExpression(wcscmp(slotName, slotNames[s]) == 0, AAFRESULT_TEST_FAILED); checkExpression(trackID == (s+1), AAFRESULT_TEST_FAILED); if ( 0 < s && s < 5 ) // These are the SourceClips { checkResult(slot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface (IID_IAAFSourceClip, (void **)&pSourceClip)); checkResult(pSourceClip->QueryInterface (IID_IAAFSourceReference, (void **)&pSourceRef)); checkResult(pSourceRef->GetSourceID(&sourceID)); checkExpression(memcmp(&sourceID, &MOBTestID3, sizeof(aafMobID_t)) == 0, AAFRESULT_TEST_FAILED); pSourceRef->Release(); pSourceRef = NULL; pSourceClip->Release(); pSourceClip = NULL; pSegment->Release(); pSegment = NULL; } slot->Release(); slot = NULL; bufLen = 0; trackID = 0; } // ChangeRef checkResult(aMob->ChangeRef(MOBTestID3, MOBTestID4)); for (s = 1; s < 5; ++s) // These are the SourceClips { checkResult(aMob->GetSlotAt(s, &slot)); checkResult(slot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface (IID_IAAFSourceClip, (void **)&pSourceClip)); checkResult(pSourceClip->QueryInterface (IID_IAAFSourceReference, (void **)&pSourceRef)); checkResult(pSourceRef->GetSourceID(&sourceID)); checkExpression(memcmp(&sourceID, &MOBTestID4, sizeof(aafMobID_t)) == 0, AAFRESULT_TEST_FAILED); pSourceRef->Release(); pSourceRef = NULL; pSourceClip->Release(); pSourceClip = NULL; pSegment->Release(); pSegment = NULL; slot->Release(); slot = NULL; } // try it again with a MobID it won't find. Make sure nothing changes checkResult(aMob->ChangeRef(MOBTestID3, MOBTestID2)); for (s = 1; s < 5; ++s) // These are the SourceClips { checkResult(aMob->GetSlotAt(s, &slot)); checkResult(slot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface (IID_IAAFSourceClip, (void **)&pSourceClip)); checkResult(pSourceClip->QueryInterface (IID_IAAFSourceReference, (void **)&pSourceRef)); checkResult(pSourceRef->GetSourceID(&sourceID)); checkExpression(memcmp(&sourceID, &MOBTestID4, sizeof(aafMobID_t)) == 0, AAFRESULT_TEST_FAILED); pSourceRef->Release(); pSourceRef = NULL; pSourceClip->Release(); pSourceClip = NULL; pSegment->Release(); pSegment = NULL; slot->Release(); slot = NULL; } // LookUpSlot checkResult(aMob->LookupSlot(4, &slot)); checkResult(slot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface (IID_IAAFSourceClip, (void **)&pSourceClip)); checkResult(pSourceClip->QueryInterface (IID_IAAFSourceReference, (void **)&pSourceRef)); checkResult(pSourceRef->GetSourceID(&sourceID)); checkResult(slot->GetNameBufLen(&bufLen)); checkResult(slot->GetName(slotName, bufLen)); checkResult(slot->GetSlotID(&trackID)); checkExpression(wcscmp(slotName, slotNames[3]) == 0, AAFRESULT_TEST_FAILED); checkExpression(trackID == (4), AAFRESULT_TEST_FAILED); pSourceRef->Release(); pSourceRef = NULL; pSourceClip->Release(); pSourceClip = NULL; pSegment->Release(); pSegment = NULL; slot->Release(); slot = NULL; checkExpression(aMob->LookupSlot(10, &slot) == AAFRESULT_SLOT_NOT_FOUND, AAFRESULT_TEST_FAILED); checkExpression(aMob->LookupSlot(0, NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); // OffsetToMobTimecode // 7/5/00 - this method is broken so the tests that will // make it fail have been commented out. This module test // will still report Partial Success until implementation has been fixed aafPosition_t offset = 1; aafTimecode_t timecode; // initialize timecode values timecode.startFrame = 0; timecode.drop = kAAFTcDrop; timecode.fps = 24; checkResult(aMob->LookupSlot(6, &slot)); checkResult(slot->GetSegment(&pSegment)); checkResult(aMob->OffsetToMobTimecode(pSegment, &offset, &timecode)); checkExpression(timecode.startFrame == (TCstartFrame + offset), AAFRESULT_TEST_FAILED); checkExpression(timecode.drop == TCdrop, AAFRESULT_TEST_FAILED); checkExpression(timecode.fps == TCfps, AAFRESULT_TEST_FAILED); checkExpression(aMob->OffsetToMobTimecode(pSegment, NULL, &timecode) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); checkExpression(aMob->OffsetToMobTimecode(pSegment, &offset, NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); // reinitialize values timecode.startFrame = 0; timecode.drop = kAAFTcDrop; timecode.fps = 24; // According to IDL this should search for the slot containing the timecode segment checkResult(aMob->OffsetToMobTimecode(NULL, &offset, &timecode)); checkExpression(timecode.startFrame == (TCstartFrame + offset), AAFRESULT_TEST_FAILED); checkExpression(timecode.drop == TCdrop, AAFRESULT_TEST_FAILED); checkExpression(timecode.fps == TCfps, AAFRESULT_TEST_FAILED); pSegment->Release(); pSegment = NULL; slot->Release(); slot = NULL; // Pass in a segment that is not a timecode and make sure it returns correct hr checkResult(aMob->LookupSlot(1, &slot)); checkResult(slot->GetSegment(&pSegment)); checkExpression(aMob->OffsetToMobTimecode(pSegment, &offset, &timecode) == AAFRESULT_TIMECODE_NOT_FOUND, AAFRESULT_TEST_FAILED); pSegment->Release(); pSegment = NULL; slot->Release(); slot = NULL; // GetKLVData checkResult(pDictionary->LookupTypeDef (kAAFTypeID_UInt8Array, &pBaseType)); checkResult(pDictionary->RegisterKLVDataKey(TEST_KLV, pBaseType)); pBaseType->Release(); pBaseType = NULL; checkResult(aMob->CountKLVData(&numFound)); checkExpression(numFound == 2, AAFRESULT_TEST_FAILED); checkResult(aMob->GetKLVData(&klvEnum)); checkResult(klvEnum->NextOne(&pKLVData)); checkResult(pKLVData->GetValueBufLen(&bufLen)); checkExpression(sizeof(KLVfrowney) == bufLen, AAFRESULT_TEST_FAILED); checkResult(pKLVData->GetValue( sizeof(value), (unsigned char *)value, &bytesRead)); checkExpression(memcmp(value, KLVfrowney, sizeof(KLVfrowney)) == 0, AAFRESULT_TEST_FAILED); checkResult(pKLVData->GetKey(&testKey)); checkExpression(memcmp(&testKey, &TEST_KLV, sizeof(aafUID_t)) == 0, AAFRESULT_TEST_FAILED); pKLVData->Release(); pKLVData = NULL; checkResult(klvEnum->NextOne(&pKLVData)); checkResult(pKLVData->GetValueBufLen(&bufLen)); checkExpression(sizeof(KLVsmiley) == bufLen, AAFRESULT_TEST_FAILED); checkResult(pKLVData->GetValue( sizeof(value), (unsigned char *)value, &bytesRead)); checkExpression(memcmp(value, KLVsmiley, sizeof(KLVsmiley)) == 0, AAFRESULT_TEST_FAILED); checkResult(pKLVData->GetKey(&testKey)); checkExpression(memcmp(&testKey, &TEST_KLV, sizeof(aafUID_t)) == 0, AAFRESULT_TEST_FAILED); pKLVData->Release(); pKLVData = NULL; klvEnum->Release(); klvEnum = NULL; checkExpression(aMob->GetKLVData(NULL) == AAFRESULT_NULL_PARAM, AAFRESULT_TEST_FAILED); // Check the comments checkResult(aMob->GetComments(&enumTaggedVal)); for (i = 0; i < 5; ++i) { if (i==2) continue; checkResult(enumTaggedVal->NextOne(&taggedVal)); checkResult(taggedVal->GetNameBufLen(&bufLen)); checkResult(taggedVal->GetName(name, bufLen)); checkExpression(wcscmp(name, pCategory[i]) == 0, AAFRESULT_TEST_FAILED); checkResult(taggedVal->GetValueBufLen(&bufLen)); checkResult(taggedVal->GetValue(bufLen, (aafDataBuffer_t)value, &bytesRead)); checkExpression(wcscmp(value, pComment[i]) == 0, AAFRESULT_TEST_FAILED); taggedVal->Release(); taggedVal = NULL; } // Check attributes and usage code. // Need IAAFMob2 for that; IAAFMob2* aMobInterface2 = 0; checkResult( aMob->QueryInterface( IID_IAAFMob2, reinterpret_cast<void**>(&aMobInterface2) ) ); IEnumAAFTaggedValues* pAttributesEnum = 0; checkResult( aMobInterface2->GetAttributes( &pAttributesEnum ) ); int attributeCount = 0; HRESULT atthr = AAFRESULT_SUCCESS; IAAFTaggedValue* pAttribute = 0; for( atthr = pAttributesEnum->NextOne( &pAttribute ); atthr == AAFRESULT_SUCCESS; atthr = pAttributesEnum->NextOne( &pAttribute ) ) { aafUInt32 bufLen = 0; checkResult( pAttribute->GetNameBufLen(&bufLen) ); // "name" is 500 chars long... sized more than // large enough for a simple test. checkExpression( attributeCount < 2, AAFRESULT_TEST_FAILED ); checkResult( pAttribute->GetName( name, bufLen ) ); checkExpression( wcscmp(name, AttributeNames[attributeCount] ) == 0, AAFRESULT_TEST_FAILED ); // check the value IAAFTypeDef* pAttributeTypeDef = NULL; checkResult( pAttribute->GetTypeDefinition( &pAttributeTypeDef ) ); // It should be a string. IAAFTypeDefString* pTDString = NULL; checkResult( pAttributeTypeDef->QueryInterface( IID_IAAFTypeDefString, reinterpret_cast<void**>(&pTDString) ) ); checkResult( pAttribute->GetValue( sizeof(name), reinterpret_cast<aafDataBuffer_t>(name), &bufLen ) ); checkExpression( wcscmp( AttributeValues[attributeCount], name ) == 0, AAFRESULT_TEST_FAILED ); pAttributeTypeDef->Release(); pAttributeTypeDef = NULL; pTDString->Release(); pTDString = NULL; pAttribute->Release(); pAttribute = NULL; attributeCount++; } checkExpression( 2 == attributeCount && atthr == AAFRESULT_NO_MORE_OBJECTS, AAFRESULT_TEST_FAILED ); aafUID_t code; checkResult( aMobInterface2->GetUsageCode( &code ) ); checkExpression( memcmp( &code, &kAAFUsage_SubClip, sizeof(code) ) == 0, AAFRESULT_TEST_FAILED ); pAttributesEnum->Release(); pAttributesEnum = NULL; enumTaggedVal->Release(); enumTaggedVal = NULL; aMobInterface2->Release(); aMobInterface2 = NULL; aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (slot) slot->Release(); if (slotIter) slotIter->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pDictionary) pDictionary->Release(); if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile * pFile = NULL; bool bFileOpen = false; IAAFHeader * pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IEnumAAFMobSlots *slotIter = NULL; IEnumAAFTaggedValues* pCommentIterator = NULL; IAAFTaggedValue* pComment = NULL; IAAFMobSlot *slot = NULL; aafNumSlots_t numMobs, n, slt; aafUInt32 numComments, bytesRead, com; HRESULT hr = S_OK; aafWChar tag[64]; aafWChar Value[64]; aafSearchCrit_t criteria; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFCompMob; checkResult(pHeader->CountMobs(kAAFCompMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->GetMobs (&criteria, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500], slotName[500]; aafNumSlots_t numSlots; aafMobID_t mobID; aafSlotID_t trackID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); // Check for comments checkResult(aMob->CountComments(&numComments)); checkExpression(1 == numComments, AAFRESULT_TEST_FAILED); checkResult(aMob->GetComments(&pCommentIterator)); for(com = 0; com < numComments; com++) { checkResult(pCommentIterator->NextOne(&pComment)); checkResult(pComment->GetName(tag, sizeof(tag))); checkResult(pComment->GetValue( sizeof(Value), (unsigned char *)Value, &bytesRead)); checkExpression(wcscmp(tag, TagNames)== 0, AAFRESULT_TEST_FAILED); checkExpression(wcscmp(Value, AltComment)== 0, AAFRESULT_TEST_FAILED); pComment->Release(); } pCommentIterator->Release(); checkResult(aMob->CountSlots (&numSlots)); checkExpression(5 == numSlots, AAFRESULT_TEST_FAILED); checkResult(aMob->GetSlots(&slotIter)); for(slt = 0; slt < numSlots; slt++) { checkResult(slotIter->NextOne (&slot)); checkResult(slot->GetName (slotName, sizeof(slotName))); checkResult(slot->GetSlotID(&trackID)); checkExpression (wcscmp(slotName, slotNames[slt]) == 0, AAFRESULT_TEST_FAILED); slot->Release(); slot = NULL; } aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (slot) slot->Release(); if (slotIter) slotIter->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { // Close file if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IAAFSourceMob* pSourceMob = NULL; IAAFMob* pMob = NULL; IAAFEssenceDescriptor* pEssDesc = NULL; IAAFBWFImportDescriptor* pBWFImportDesc = NULL; IEnumAAFRIFFChunks* pEnum = NULL; IAAFRIFFChunk* pRIFFChunk = NULL; IEnumAAFMobs* pMobIter = NULL; aafUInt32 numData, bytesRead, com, testID; aafLength_t testLength, testRIFFLen; aafPosition_t dataPos; aafNumSlots_t numMobs; char Value[sizeof(RIFFChunksmiley)]; char Value2[sizeof(RIFFChunkfrowney)]; HRESULT hr = AAFRESULT_SUCCESS; checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); checkResult( pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); if (1 == numMobs ) { checkResult(pHeader->GetMobs(NULL, &pMobIter)); checkResult(pMobIter->NextOne(&pMob)); checkResult(pMob->QueryInterface(IID_IAAFSourceMob, (void **)&pSourceMob)); // Back into testing mode checkResult(pSourceMob->GetEssenceDescriptor(&pEssDesc)); checkResult( pEssDesc->QueryInterface( IID_IAAFBWFImportDescriptor, (void**)&pBWFImportDesc )); checkResult(pBWFImportDesc->CountUnknownBWFChunks(&numData)); checkExpression(1 == numData, AAFRESULT_TEST_FAILED); checkResult(pBWFImportDesc->GetUnknownBWFChunks(&pEnum)); for(com = 0; com < numData; com++) { checkResult(pEnum->NextOne(&pRIFFChunk)); checkResult(pRIFFChunk->GetLength(&testRIFFLen)); checkExpression((sizeof(RIFFChunksmiley)+sizeof(RIFFChunkfrowney)) == testRIFFLen, AAFRESULT_TEST_FAILED); checkResult(pRIFFChunk->Read( sizeof(Value), (unsigned char *)Value, &bytesRead)); checkExpression(memcmp(Value, RIFFChunksmiley, sizeof(RIFFChunksmiley)) == 0, AAFRESULT_TEST_FAILED); checkResult(pRIFFChunk->Read( sizeof(Value2), (unsigned char *)Value2, &bytesRead)); checkExpression(memcmp(Value2, RIFFChunkfrowney, sizeof(RIFFChunkfrowney)) == 0, AAFRESULT_TEST_FAILED); checkResult(pRIFFChunk->GetPosition(&dataPos)); checkExpression(dataPos==(sizeof(RIFFChunksmiley)+sizeof(RIFFChunkfrowney)), AAFRESULT_TEST_FAILED); checkResult(pRIFFChunk->SetPosition(0)); checkResult(pRIFFChunk->Read( sizeof(Value), (unsigned char *)Value, &bytesRead)); checkExpression(memcmp(Value, RIFFChunksmiley, sizeof(RIFFChunksmiley)) == 0, AAFRESULT_TEST_FAILED); pRIFFChunk->GetChunkID(&testID); checkExpression(testID==chunkID, AAFRESULT_TEST_FAILED); pRIFFChunk->GetLength(&testLength); checkExpression(testLength == sizeof(RIFFChunksmiley) + sizeof(RIFFChunkfrowney), AAFRESULT_TEST_FAILED); pRIFFChunk->Release(); pRIFFChunk = NULL; } pEnum->Release(); pEnum = NULL; pEssDesc->Release(); pEssDesc = NULL; pBWFImportDesc->Release(); pBWFImportDesc = NULL; pSourceMob->Release(); pSourceMob = NULL; pMobIter->Release(); pMobIter = NULL; } pMob->Release(); pMob = NULL; pHeader->Release(); pHeader = NULL; pFile->Close(); pFile->Release(); pFile = NULL; return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { // IAAFSession * pSession = NULL; IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IEnumAAFMobs* pMobIter = NULL; IAAFMob* pMob = NULL; IAAFMob* pReferencedMob = NULL; IEnumAAFMobSlots* pSlotIter = NULL; IAAFMobSlot* pSlot = NULL; IAAFSegment* pSegment = NULL; IAAFDescriptiveClip* pDescClip = NULL; bool bFileOpen = false; aafSearchCrit_t criteria; aafNumSlots_t numMobs, numSlots; HRESULT hr = AAFRESULT_SUCCESS; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); // Get the number of mobs in the file (should be one) checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression(2 == numMobs, AAFRESULT_TEST_FAILED); // Enumerate over all Composition Mobs criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFCompMob; checkResult(pHeader->GetMobs(&criteria, &pMobIter)); while (AAFRESULT_SUCCESS == pMobIter->NextOne(&pMob)) { checkResult(pMob->CountSlots(&numSlots)); checkExpression(1 == numSlots, AAFRESULT_TEST_FAILED); checkResult(pMob->GetSlots(&pSlotIter)); while (AAFRESULT_SUCCESS == pSlotIter->NextOne(&pSlot)) { // The segment should be a source clip... checkResult(pSlot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface(IID_IAAFDescriptiveClip, (void **) &pDescClip)); // Get, and test, the described slots from the marker. aafUInt32 getDescribedSlotIDsVector[TestDescribedSlotIDsVectorSize]; aafUInt32 getDescribedSlotIDsVectorSize = 0; checkResult( pDescClip->CountDescribedSlotIDs( &getDescribedSlotIDsVectorSize ) ); checkExpression( TestDescribedSlotIDsVectorSize == getDescribedSlotIDsVectorSize, AAFRESULT_TEST_FAILED ); checkExpression( AAFRESULT_SMALLBUF == pDescClip->GetDescribedSlotIDs( getDescribedSlotIDsVectorSize-1, getDescribedSlotIDsVector ), AAFRESULT_TEST_FAILED ); checkResult( pDescClip->GetDescribedSlotIDs( getDescribedSlotIDsVectorSize, getDescribedSlotIDsVector ) ); checkExpression( 0 == memcmp( getDescribedSlotIDsVector, TestDescribedSlotIDsVector, sizeof(TestDescribedSlotIDsVector) ), AAFRESULT_TEST_FAILED ); pSlot->Release(); pSlot = NULL; } pMob->Release(); pMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup and return if (pReferencedMob) pReferencedMob->Release(); if (pDescClip) pDescClip->Release(); if (pSegment) pSegment->Release(); if (pSlot) pSlot->Release(); if (pSlotIter) pSlotIter->Release(); if (pMob) pMob->Release(); if (pMobIter) pMobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { if (bFileOpen) pFile->Close(); pFile->Release(); } return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { // IAAFSession * pSession = NULL; IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IAAFEssenceDescriptor *pEdesc = NULL; IAAFSourceMob *pSourceMob = NULL; IEnumAAFLocators * pEnum = NULL; IAAFLocator * pLocator = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; aafUInt32 numLocators; aafUInt32 readLen; aafNumSlots_t numMobs, n; HRESULT hr = AAFRESULT_SUCCESS; aafWChar readBuf[1024]; bool bFileOpen = false; try { // Open the file. checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); if (1 != numMobs ) checkResult(AAFRESULT_TEST_FAILED); //!!! aafSearchCrit_t criteria; //!!! criteria.searchTag = kAAFNoSearch; checkResult(pHeader->GetMobs (NULL, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500]; aafMobID_t mobID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->QueryInterface (IID_IAAFSourceMob, (void **)&pSourceMob)); checkResult(pSourceMob->GetEssenceDescriptor (&pEdesc)); // Verify that there is now one locator checkResult(pEdesc->CountLocators(&numLocators)); if (1 != numLocators) checkResult(AAFRESULT_TEST_FAILED); checkResult(pEdesc->GetLocators(&pEnum)); // This should read the one real locator checkResult(pEnum->NextOne(&pLocator)); checkResult(pLocator->GetPathBufLen (&readLen)); // if(readLen != strlen(TEST_PATH)) checkResult(pLocator->GetPath (readBuf, readLen)); // This should run off the end pLocator->Release(); pLocator = NULL; hr = pEnum->NextOne(&pLocator); if (AAFRESULT_NO_MORE_OBJECTS != hr) checkResult(hr); else hr = AAFRESULT_SUCCESS; // reset result } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup... if (pLocator) pLocator->Release(); if (pEnum) pEnum->Release(); if (pEdesc) pEdesc->Release(); if (pSourceMob) pSourceMob->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { if (bFileOpen) pFile->Close(); pFile->Release(); } // hr = pSession->EndSession(); // if (AAFRESULT_SUCCESS != hr) // return hr; // if (pSession) pSession->Release(); return hr; }
static HRESULT ReadAAFFile(aafWChar * pFileName) { // IAAFSession * pSession = NULL; IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IEnumAAFMobs *mobIter = NULL; IAAFMob *aMob = NULL; IAAFEssenceDescriptor *pEdesc = NULL; IAAFSourceMob *pSourceMob = NULL; IEnumAAFLocators * pEnum = NULL; IAAFLocator * pLocator = NULL; aafUInt32 numLocators; aafNumSlots_t numMobs, n; HRESULT hr = AAFRESULT_SUCCESS; bool bFileOpen = false; try { // Open the file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); bFileOpen = true; // We can't really do anthing in AAF without the header. checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->CountMobs(kAAFAllMob, &numMobs)); checkExpression (1 == numMobs, AAFRESULT_TEST_FAILED); checkResult(pHeader->GetMobs (NULL, &mobIter)); for(n = 0; n < numMobs; n++) { aafWChar name[500]; aafMobID_t mobID; checkResult(mobIter->NextOne (&aMob)); checkResult(aMob->GetName (name, sizeof(name))); checkResult(aMob->GetMobID (&mobID)); checkResult(aMob->QueryInterface (IID_IAAFSourceMob, (void **)&pSourceMob)); checkResult(pSourceMob->GetEssenceDescriptor (&pEdesc)); // Verify that there is now one locator checkResult(pEdesc->CountLocators(&numLocators)); checkExpression(20 == numLocators, AAFRESULT_TEST_FAILED); checkResult(pEdesc->GetLocators(&pEnum)); // This should read the one real locator for ( n=0; n<numLocators; n++) { checkResult(pEnum->NextOne(&pLocator)); pLocator->Release(); pLocator = NULL; } // We had better not succeed or get an unknown failure. checkExpression(AAFRESULT_NO_MORE_OBJECTS == pEnum->NextOne(&pLocator), AAFRESULT_TEST_FAILED); pEnum->Release(); pEnum = NULL; pEdesc->Release(); pEdesc = NULL; pSourceMob->Release(); pSourceMob = NULL; aMob->Release(); aMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (pLocator) pLocator->Release(); if (pEnum) pEnum->Release(); if (pEdesc) pEdesc->Release(); if (pSourceMob) pSourceMob->Release(); if (aMob) aMob->Release(); if (mobIter) mobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { // Close file, clean-up and return if (bFileOpen) pFile->Close(); pFile->Release(); } /* hr = pSession->EndSession(); if (AAFRESULT_SUCCESS != hr) return hr; */ return hr; }
static HRESULT ProcessAAFFile(const aafWChar * pFileName, testType_t testType) { IAAFFile * pFile = NULL; IAAFHeader * pHeader = NULL; IAAFDictionary* pDictionary = NULL; IEnumAAFMobs* pMobIter = NULL; aafNumSlots_t numMobs, numSlots; aafSearchCrit_t criteria; aafMobID_t mobID; aafWChar namebuf[1204]; const aafWChar* slotName = L"A slot in Composition Mob"; IAAFComponent* pComponent = NULL; IAAFComponent* aComponent = NULL; IEnumAAFMobSlots* pMobSlotIter = NULL; IAAFMobSlot* pMobSlot = NULL; IAAFTimelineMobSlot* newSlot = NULL; IAAFSegment* seg = NULL; IAAFSegment* pSegment = NULL; IAAFMob* pCompMob = NULL; IAAFMob* pMob = NULL; aafPosition_t zeroPos = 0; IAAFSequence* pAudioSequence = NULL; IAAFSourceClip* pSourceClip = NULL; aafLength_t duration; IAAFTimelineMobSlot* pTimelineMobSlot = NULL; IAAFClassDef *pCompositionMobDef = NULL; IAAFClassDef *pSequenceDef = NULL; IAAFClassDef *pSourceClipDef = NULL; IAAFDataDef *pSoundDef = NULL; IAAFDataDef *pDataDef = NULL; // Set the edit rate information aafRational_t editRate; editRate.numerator = 48000; editRate.denominator = 1; // Set search condition to true bool lookingForAudio = true; // Call the routine (from ExportAudioExample) to make the file for processing check(CreateAAFFile(pwFileName, NULL, testStandardCalls, &pFile)); /* Get the Header and iterate through the Master Mobs in the existing file */ check(pFile->GetHeader(&pHeader)); check(pHeader->GetDictionary(&pDictionary)); /* Lookup class definitions for the objects we want to create. */ check(pDictionary->LookupClassDef(AUID_AAFCompositionMob, &pCompositionMobDef)); check(pDictionary->LookupClassDef(AUID_AAFSequence, &pSequenceDef)); check(pDictionary->LookupClassDef(AUID_AAFSourceClip, &pSourceClipDef)); /* Lookup any necessary data definitions. */ check(pDictionary->LookupDataDef(kAAFDataDef_Sound, &pSoundDef)); // Get the number of master mobs in the existing file (must not be zero) check(pHeader->CountMobs(kAAFMasterMob, &numMobs)); if (numMobs != 0) { printf("Found %d Master Mobs\n", numMobs); criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFMasterMob; check(pHeader->GetMobs(&criteria, &pMobIter)); /* Create a Composition Mob */ check(pCompositionMobDef-> CreateInstance(IID_IAAFMob, (IUnknown **)&pCompMob)); /* Append the Mob to the Header */ check(pHeader->AddMob(pCompMob)); /* Create a TimelineMobSlot with an audio sequence */ check(pSequenceDef-> CreateInstance(IID_IAAFSequence, (IUnknown **)&pAudioSequence)); check(pAudioSequence->QueryInterface(IID_IAAFSegment, (void **)&seg)); check(pAudioSequence->QueryInterface(IID_IAAFComponent, (void **)&aComponent)); check(aComponent->SetDataDef(pSoundDef)); check(pCompMob->AppendNewTimelineSlot(editRate, seg, 1, slotName, zeroPos, &newSlot)); seg->Release(); seg = NULL; newSlot->Release(); newSlot = NULL; // This variable is about to be overwritten so we need to release the old interface aComponent->Release(); aComponent = NULL; while((AAFRESULT_SUCCESS == pMobIter->NextOne(&pMob))) { // Print out information about the Mob char mobIDstr[256]; char mobName[256]; check(pMob->GetMobID (&mobID)); check(pMob->GetName (namebuf, sizeof(namebuf))); convert(mobName, sizeof(mobName), namebuf); MobIDtoString(mobID, mobIDstr); printf(" MasterMob Name = '%s'\n", mobName); printf(" (mobID %s)\n", mobIDstr); // Add a Source Clip for each Master Mob to the audio sequence by iterating check(pMob->GetSlots(&pMobSlotIter)); /* Iterating through all Mob Slots */ // Get the number of slots check(pMob->CountSlots(&numSlots)); while (lookingForAudio && (AAFRESULT_SUCCESS == pMobSlotIter->NextOne(&pMobSlot))); { /* Check to see if it is an Audio Timeline Mob Slot */ HRESULT hr; hr=pMobSlot->QueryInterface(IID_IAAFTimelineMobSlot,(void **) &pTimelineMobSlot); if (SUCCEEDED(hr)) { printf("Found a timeline mob slot\n"); check(pMobSlot->GetDataDef(&pDataDef)); // Check that we have a sound file by examining its data definition aafBool bIsSoundKind = kAAFFalse; check(pDataDef->IsSoundKind(&bIsSoundKind)); if (kAAFTrue == bIsSoundKind) { printf("Found a sound file\n"); // We are no longer looking for audio data so set boolean lookingForAudio = false; /* Get the information for the new source clip */ check(pMob->GetMobID(&sourceRef.sourceID)); check(pMobSlot->GetSlotID(&sourceRef.sourceSlotID)); check(pTimelineMobSlot->GetOrigin(&sourceRef.startTime)); check(pMobSlot->GetSegment(&pSegment)); check(pSegment->QueryInterface(IID_IAAFComponent, (void **)&pComponent)); check(pComponent->GetLength(&duration)); pComponent->Release(); pComponent = NULL; pSegment->Release(); pSegment = NULL; // this loop is to be removed upon fixing of the bug // in essenceaccess relating to codec definitions... int j = 0; for (j=0; j<10; j++) { /* Create a new Source Clip */ check(pSourceClipDef-> CreateInstance(IID_IAAFSourceClip, (IUnknown **)&pSourceClip)); // Initialize the Source Clip check(pSourceClip->Initialize( pSoundDef, duration, sourceRef)); check(pSourceClip->QueryInterface(IID_IAAFComponent, (void **) &pComponent)); check(pAudioSequence->AppendComponent(pComponent)); pComponent->Release(); pComponent = NULL; pSourceClip->Release(); pSourceClip = NULL; } } pTimelineMobSlot->Release(); pTimelineMobSlot = NULL; pDataDef->Release(); pDataDef = NULL; } pMobSlot->Release(); pMobSlot = NULL; } pMobSlotIter->Release(); pMobSlotIter = NULL; pMob->Release(); pMob = NULL; } pAudioSequence->Release(); pAudioSequence = NULL; pCompMob->Release(); pCompMob = NULL; pMobIter->Release(); pMobIter = NULL; } else { printf("Error with file: File has no Master mobs.\n"); } cleanup: // Cleanup and return if (pSourceClip) pSourceClip->Release(); if (pComponent) pComponent->Release(); if (pSegment) pSegment->Release(); if (pTimelineMobSlot) pTimelineMobSlot->Release(); if (pMobSlotIter) pMobSlotIter->Release(); if (pMob) pMob->Release(); if (newSlot) newSlot->Release(); if (aComponent) aComponent->Release(); if (seg) seg->Release(); if (pAudioSequence) pAudioSequence->Release(); if (pCompMob) pCompMob->Release(); if (pMobIter) pMobIter->Release(); if (pDataDef) pDataDef->Release(); if (pSoundDef) pSoundDef->Release(); if (pSourceClipDef) pSourceClipDef->Release(); if (pSequenceDef) pSequenceDef->Release(); if (pCompositionMobDef) pCompositionMobDef->Release(); if (pDictionary) pDictionary->Release(); if (pHeader) pHeader->Release(); if (pFile) { /* Save the AAF file */ pFile->Save(); /* Close the AAF file */ pFile->Close(); pFile->Release(); } return moduleErrorTmp; }
void HTMLClipTest::OpenHTMLClip() { assert(_pHeader); HRESULT hr = S_OK; aafNumSlots_t compositionMobs = 0; IEnumAAFMobs *pEnumMobs = NULL; IAAFMob *pReferencingMob = NULL; IAAFCompositionMob *pCompositionMob = NULL; aafNumSlots_t mobSlots = 0; IEnumAAFMobSlots *pEnumSlots = NULL; IAAFMobSlot *pMobSlot = NULL; IAAFSegment *pSegment = NULL; IAAFHTMLClip *pHTMLClip = NULL; aafUInt32 bufSize = 0; aafUInt32 actualBufSize = 0; aafUInt32 actualLength = 0; wchar_t *pBeginAnchor = NULL; wchar_t *pEndAnchor = NULL; IAAFSourceReference *pSourceReference = NULL; aafMobID_t masterMobID = {0}; IAAFMasterMob *pMasterMob = NULL; IAAFMob *pReferencedMob = NULL; try { // Get the number of composition mobs in the file (should be one) checkResult(_pHeader->CountMobs(kAAFCompMob, &compositionMobs)); checkExpression(1 == compositionMobs, AAFRESULT_TEST_FAILED); // Get the composition mob. There should only be one. aafSearchCrit_t criteria; criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFCompMob; checkResult(_pHeader->GetMobs(&criteria, &pEnumMobs)); checkResult(pEnumMobs->NextOne(&pReferencingMob)); checkResult(pReferencingMob->QueryInterface(IID_IAAFCompositionMob, (void **)&pCompositionMob)); // Get the html clip in the slot. There should be only one. checkResult(pReferencingMob->CountSlots(&mobSlots)); checkExpression(1 == mobSlots, AAFRESULT_TEST_FAILED); checkResult(pReferencingMob->GetSlots(&pEnumSlots)); checkResult(pEnumSlots->NextOne(&pMobSlot)); checkResult(pMobSlot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface(IID_IAAFHTMLClip, (void **)&pHTMLClip)); // Validate the properties... checkResult(pHTMLClip->GetBeginAnchorBufLen(&bufSize)); actualLength = wcslen(_beginAnchor) + 1; actualBufSize = actualLength * 2; checkExpression(bufSize == actualBufSize, AAFRESULT_TEST_FAILED); pBeginAnchor = new wchar_t[actualLength]; checkExpression(NULL != pBeginAnchor, AAFRESULT_NOMEMORY); checkResult(pHTMLClip->GetBeginAnchor(pBeginAnchor, actualBufSize)); checkExpression(0 == wcscmp(pBeginAnchor, _beginAnchor), AAFRESULT_TEST_FAILED); checkResult(pHTMLClip->GetEndAnchorBufLen(&bufSize)); actualLength = wcslen(_endAnchor) + 1; actualBufSize = actualLength * 2; checkExpression(bufSize == actualBufSize, AAFRESULT_TEST_FAILED); pEndAnchor = new wchar_t[actualLength]; checkExpression(NULL != pEndAnchor, AAFRESULT_NOMEMORY); checkResult(pHTMLClip->GetEndAnchor(pEndAnchor, actualBufSize)); checkExpression(0 == wcscmp(pEndAnchor, _endAnchor), AAFRESULT_TEST_FAILED); // Attempt to "resolve" the reference and find the master mob. checkResult(pHTMLClip->QueryInterface(IID_IAAFSourceReference, (void **)&pSourceReference)); checkResult(pSourceReference->GetSourceID(&masterMobID)); checkExpression(0 == memcmp(&masterMobID, &_referencedMobID, sizeof(masterMobID)), AAFRESULT_TEST_FAILED); checkResult(_pHeader->LookupMob(masterMobID, &pReferencedMob)); checkResult(pReferencedMob->QueryInterface(IID_IAAFMasterMob, (void **)&pMasterMob)); // Use EssenceAccess to read some html essence // Find the file mob for the html essence. // Find the corresponding html essence. // Read some html essence. } catch (HRESULT& rHR) { hr = rHR; // fall through and handle cleanup } // Cleanup local references if (pMasterMob) { pMasterMob->Release(); pMasterMob = NULL; } if (pReferencedMob) { pReferencedMob->Release(); pReferencedMob = NULL; } if (pSourceReference) { pSourceReference->Release(); pSourceReference = NULL; } if (pEndAnchor) { delete [] pEndAnchor; pEndAnchor = NULL; } if (pBeginAnchor) { delete [] pBeginAnchor; pBeginAnchor = NULL; } if (pHTMLClip) { pHTMLClip->Release(); pHTMLClip = NULL; } if (pSegment) { pSegment->Release(); pSegment = NULL; } if (pMobSlot) { pMobSlot->Release(); pMobSlot = NULL; } if (pEnumSlots) { pEnumSlots->Release(); pEnumSlots = NULL; } if (pCompositionMob) { pCompositionMob->Release(); pCompositionMob = NULL; } if (pReferencingMob) { pReferencingMob->Release(); pReferencingMob = NULL; } if (pEnumMobs) { pEnumMobs->Release(); pEnumMobs = NULL; } // Propogate the error if necessary. checkResult(hr); }
static HRESULT ModifyAAFFile(aafWChar *filename, int level) { HRESULT hr = S_OK; try { // Open existing file for modification IAAFFile *pFile = NULL; TestProductID.productVersionString = const_cast<aafWChar*>(L"ModifyAAFFile"); checkResult( AAFFileOpenExistingModify( filename, 0, // modeFlags &TestProductID, &pFile) ); cout << "ModifyAAFFile() - appended Identification" << endl; // Get the header & dictionary IAAFHeader *pHeader = NULL; IAAFDictionary *pDictionary = NULL; checkResult(pFile->GetHeader(&pHeader)); checkResult(pHeader->GetDictionary(&pDictionary)); // Search for Mobs IAAFMob *pFileMob = NULL; IEnumAAFMobs *pFileMobIter = NULL; aafSearchCrit_t criteria; criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFFileMob; // Search by File Mob checkResult(pHeader->GetMobs(&criteria, &pFileMobIter)); while (AAFRESULT_SUCCESS == pFileMobIter->NextOne(&pFileMob)) { if (level == 0) break; IAAFEssenceDescriptor *edesc = NULL; IAAFSourceMob *pSourceMob = NULL; CR(pFileMob->QueryInterface(IID_IAAFSourceMob, (void **)&pSourceMob)); CR(pSourceMob->GetEssenceDescriptor(&edesc)); // Change the Name property CR(pFileMob->SetName(L"ModifyAAFFile - modified Name")); cout << "ModifyAAFFile() - changed FileMob's Name property" << endl; if (level == 1) break; // Change descriptor's properties IAAFAIFCDescriptor *pAIFCDesc = NULL; CR(edesc->QueryInterface(IID_IAAFAIFCDescriptor, (void **)&pAIFCDesc)); aafUInt8 AIFCsum[] = {0xa1,0xfc}; CR(pAIFCDesc->SetSummary(sizeof(AIFCsum), AIFCsum)); pAIFCDesc->Release(); edesc->Release(); cout << "ModifyAAFFile() - changed AIFCDescriptor's Summary" << endl; if (level == 2) break; // Change descriptor to new one (overwriting old one) IAAFClassDef *classDef = NULL; IAAFFileDescriptor *pFileDesc = NULL; IAAFWAVEDescriptor *pWAVEDesc = NULL; IAAFEssenceDescriptor *pNewEdesc = NULL; CR(pDictionary->LookupClassDef(AUID_AAFWAVEDescriptor, &classDef)); CR(classDef->CreateInstance(IID_IAAFFileDescriptor, (IUnknown **)&pFileDesc)); CR(pFileDesc->QueryInterface(IID_IAAFWAVEDescriptor, (void **)&pWAVEDesc)); CR(pFileDesc->QueryInterface(IID_IAAFEssenceDescriptor, (void **)&pNewEdesc)); aafUInt8 WAVEsum[] = {0x1a,0x1e,0xee,0xee}; CR(pWAVEDesc->SetSummary(sizeof(WAVEsum), WAVEsum)); CR(pSourceMob->SetEssenceDescriptor(pNewEdesc)); pNewEdesc->Release(); pWAVEDesc->Release(); pFileDesc->Release(); classDef->Release(); cout << "ModifyAAFFile() - replaced AIFCDescriptor with WAVEDescriptor" << endl; if (level == 3) break; // Add EssenceData IAAFEssenceData *pEssenceData = NULL; IAAFEssenceData2 *pEssenceData2 = NULL; IAAFPlainEssenceData *pPlainEssenceData = NULL; aafUInt32 bytesWritten = 0; aafUInt8 essdata[] = "Zaphod Beeblebrox"; CR(pDictionary->LookupClassDef(AUID_AAFEssenceData, &classDef)); CR(classDef->CreateInstance(IID_IAAFEssenceData, (IUnknown **)&pEssenceData)); CR(pEssenceData->SetFileMob(pSourceMob)); CR(pHeader->AddEssenceData(pEssenceData)); CR(pEssenceData->QueryInterface(IID_IAAFEssenceData2, (void**)&pEssenceData2)); CR(pEssenceData2->GetPlainEssenceData(0, &pPlainEssenceData)); CR(pPlainEssenceData->Write(sizeof(essdata), essdata, &bytesWritten)); pEssenceData->Release(); pEssenceData2->Release(); pPlainEssenceData->Release(); classDef->Release(); cout << "ModifyAAFFile() - added EssenceData" << endl; pSourceMob->Release(); } pFileMob->Release(); pFileMobIter->Release(); pDictionary->Release(); pHeader->Release(); // Save & close the file checkResult(pFile->Save()); checkResult(pFile->Close()); checkResult(pFile->Release()); } catch (HRESULT& rResult) { hr = rResult; cout << "*** ModifyAAFFile: caught error hr=0x" << hex << hr << dec << endl; } return hr; }
static HRESULT ReadAAFFile(aafWChar* pFileName) { IAAFFile* pFile = NULL; IAAFHeader* pHeader = NULL; IEnumAAFMobs* pMobIter = NULL; IAAFMob* pMob; IEnumAAFMobSlots* pSlotIter = NULL; IAAFMobSlot* pSlot = NULL; IAAFComponent* pComp = NULL; IAAFSegment* pSegment = NULL; IAAFDataDef* pDataDef = NULL; IAAFSequence* pSequence = NULL; IAAFDictionary* pDictionary = NULL; IEnumAAFDataDefs* pEnumDataDef = NULL; IEnumAAFDataDefs* pCloneEnum = NULL; IEnumAAFComponents* pCompIter = NULL; IAAFDataDef* pArray[2] = { NULL, NULL }; aafNumSlots_t numMobs; aafInt32 index; aafSearchCrit_t criteria; HRESULT hr = S_OK; aafBool testBool; aafUInt32 resultCount; try { // Open the AAF file checkResult(AAFFileOpenExistingRead(pFileName, 0, &pFile)); // Get the AAF file header. checkResult(pFile->GetHeader(&pHeader)); // Validate that there is only one composition mob. checkResult(pHeader->CountMobs(kAAFCompMob, &numMobs)); checkExpression(1 == numMobs, AAFRESULT_TEST_FAILED); // Get the AAF Dictionary so that we can create valid AAF objects. checkResult(pHeader->GetDictionary(&pDictionary)); // The test can't check the types on these because the order of adding data definitions // is defined by the toolkit, and not the test. !!!Change this to determine the order on // the first two tests, and then use to test the other functions. checkResult(pDictionary->GetDataDefs(&pEnumDataDef)); /* Read and check the first element */ checkResult(pEnumDataDef->NextOne(&pDataDef)); checkResult(pDataDef->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pDataDef->Release(); pDataDef = NULL; /**/ /* Read and check the second element */ checkResult(pEnumDataDef->NextOne(&pDataDef)); checkResult(pDataDef->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pDataDef->Release(); pDataDef = NULL; /*****/ /* Reset, and check the first element again*/ checkResult(pEnumDataDef->Reset()); checkResult(pEnumDataDef->NextOne(&pDataDef)); checkResult(pDataDef->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pDataDef->Release(); pDataDef = NULL; /* Reset, Skip, and check the second element again*/ checkResult(pEnumDataDef->Reset()); checkResult(pEnumDataDef->Skip(1)); checkResult(pEnumDataDef->NextOne(&pDataDef)); checkResult(pDataDef->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pDataDef->Release(); pDataDef = NULL; /* Reset, and read both elements */ checkResult(pEnumDataDef->Reset()); checkResult(pEnumDataDef->Next (2, (IAAFDataDef **)&pArray, &resultCount)); checkExpression (resultCount == 2, AAFRESULT_TEST_FAILED); checkResult(pArray[0]->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pArray[0]->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pArray[0]->Release(); pArray[0] = NULL; checkResult(pArray[1]->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pArray[1]->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pArray[1]->Release(); pArray[1] = NULL; // /* Read one past to make sure that it fails */ // checkExpression(pEnumDataDef->NextOne(&pDataDef) != AAFRESULT_SUCCESS, AAFRESULT_TEST_FAILED); /* Clone the enumerator, and read one element */ checkResult(pEnumDataDef->Clone(&pCloneEnum)); checkResult(pCloneEnum->Reset()); checkResult(pCloneEnum->NextOne(&pDataDef)); checkResult(pDataDef->IsPictureKind(&testBool)); // checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsSoundKind(&testBool)); // checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pDataDef->Release(); pDataDef = NULL; pCloneEnum->Release(); pCloneEnum = NULL; // Enumerate over Composition MOBs criteria.searchTag = kAAFByMobKind; criteria.tags.mobKind = kAAFCompMob; checkResult(pHeader->GetMobs(&criteria, &pMobIter)); CAAFBuiltinDefs defs (pDictionary); while (pMobIter && pMobIter->NextOne(&pMob) == AAFRESULT_SUCCESS) { aafNumSlots_t numSlots = 0; checkResult(pMob->CountSlots(&numSlots)); checkExpression(1 == numSlots, AAFRESULT_TEST_FAILED); // Enumerate over all MOB slots for this MOB checkResult(pMob->GetSlots(&pSlotIter)); while (pSlotIter && pSlotIter->NextOne(&pSlot) == AAFRESULT_SUCCESS) { aafUInt32 numCpnts; checkResult(pSlot->GetSegment(&pSegment)); checkResult(pSegment->QueryInterface(IID_IAAFSequence, (void **) &pSequence)); checkResult(pSequence->CountComponents(&numCpnts)); checkExpression(numCpnts == kNumComponents, AAFRESULT_TEST_FAILED); checkResult(pSequence->GetComponents(&pCompIter)); numCpnts = 0; index = 0; while (pCompIter && pCompIter->NextOne(&pComp) == AAFRESULT_SUCCESS) { aafBool testBool; numCpnts++; checkResult(pComp->GetDataDef(&pDataDef)); checkResult(pDataDef->IsSoundKind(&testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsMatteKind(&testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); if(index == 0) // First segment is Picture with Matte, converts to picture { checkResult(pDataDef->IsDataDefOf(defs.ddkAAFPictureWithMatte(), &testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureKind(&testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureWithMatteKind(&testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->DoesDataDefConvertTo (defs.ddkAAFPicture(), &testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); } else // First segment is Picture, converts from picture with Matte { checkResult(pDataDef->IsDataDefOf(defs.ddkAAFPicture(), &testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureKind(&testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); checkResult(pDataDef->IsPictureWithMatteKind(&testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); checkResult(pDataDef->DoesDataDefConvertFrom (defs.ddkAAFPictureWithMatte(), &testBool)); checkExpression(testBool == kAAFTrue, AAFRESULT_TEST_FAILED); } checkResult(pDataDef->DoesDataDefConvertTo (defs.ddkAAFSound(), &testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); checkResult(pDataDef->DoesDataDefConvertFrom (defs.ddkAAFSound(), &testBool)); checkExpression(testBool == kAAFFalse, AAFRESULT_TEST_FAILED); pComp->Release(); pComp = NULL; pDataDef->Release(); pDataDef = NULL; index++; } pCompIter->Release(); pCompIter = NULL; pSequence->Release(); pSequence = NULL; pSegment->Release(); pSegment = NULL; pSlot->Release(); pSlot = NULL; } pSlotIter->Release(); pSlotIter = NULL; pMob->Release(); pMob = NULL; } } catch (HRESULT& rResult) { hr = rResult; } // Cleanup object references if (pComp) pComp->Release(); if (pEnumDataDef) pEnumDataDef->Release(); if (pCloneEnum) pCloneEnum->Release(); if (pCompIter) pCompIter->Release(); if (pArray[0]) pArray[0]->Release(); if (pArray[1]) pArray[1]->Release(); if (pDataDef) pDataDef->Release(); if (pSequence) pSequence->Release(); if (pSegment) pSegment->Release(); if (pSlot) pSlot->Release(); if (pDictionary) pDictionary->Release(); if (pSlotIter) pSlotIter->Release(); if (pMob) pMob->Release(); if (pMobIter) pMobIter->Release(); if (pHeader) pHeader->Release(); if (pFile) { pFile->Close(); pFile->Release(); } return hr; }