From: Oliver M. <ter...@us...> - 2008-05-22 21:26:36
|
Update of /cvsroot/aaf/AAF/ref-impl/plugins In directory sc8-pr-cvs11.sourceforge.net:/tmp/cvs-serv29562 Modified Files: CAAFCDCIDescriptorHelper.cpp CAAFCDCIDescriptorHelper.h CAAFEssenceDataStream.cpp CAAFEssenceDataStream.h Log Message: add support for setting MXF EssenceElementKey Index: CAAFEssenceDataStream.h =================================================================== RCS file: /cvsroot/aaf/AAF/ref-impl/plugins/CAAFEssenceDataStream.h,v retrieving revision 1.14 retrieving revision 1.15 diff -C2 -d -r1.14 -r1.15 *** CAAFEssenceDataStream.h 16 Mar 2007 18:00:13 -0000 1.14 --- CAAFEssenceDataStream.h 22 May 2008 21:26:42 -0000 1.15 *************** *** 44,48 **** class CAAFEssenceDataStream ! : public IAAFEssenceDataStream, public IAAFEssenceStream, public CAAFUnknown --- 44,49 ---- class CAAFEssenceDataStream ! : public IAAFEssenceDataStream2, ! public IAAFEssenceDataStream, public IAAFEssenceStream, public CAAFUnknown *************** *** 67,71 **** --- 68,99 ---- (/* [in] */ IUnknown *essenceData); + // + // IAAFEssenceDataStream2 methods. + // + + STDMETHOD (GetEssenceData) + (// @parm [out] essence data + IAAFEssenceData ** ppEssenceData); + + virtual AAFRESULT STDMETHODCALLTYPE + GetEssenceElementKey + (// @parm [out,ref] key of the essence elements in this stream + aafUID_t * pEssenceElementKey); + virtual AAFRESULT STDMETHODCALLTYPE + SetEssenceElementKey + (// @parm [in] essence element key + aafUID_constref eek, + // @parm [in] essence element kind + aafUInt8 eeKind, + // @parm [in] essence element count + aafUInt8 eeCount, + // @parm [in] essence element type + aafUInt8 eeType, + // @parm [in] essence element index + aafUInt8 eeIndex, + // @parm [in] logical slot id of source slot + aafSlotID_t sourceSlotID ); + // // IAAFEssenceStream methods. *************** *** 143,146 **** --- 171,175 ---- private: IAAFPlainEssenceData *_data; + aafUID_t _eek; }; Index: CAAFCDCIDescriptorHelper.cpp =================================================================== RCS file: /cvsroot/aaf/AAF/ref-impl/plugins/CAAFCDCIDescriptorHelper.cpp,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** CAAFCDCIDescriptorHelper.cpp 19 Sep 2007 20:01:11 -0000 1.9 --- CAAFCDCIDescriptorHelper.cpp 22 May 2008 21:26:42 -0000 1.10 *************** *** 267,270 **** --- 267,346 ---- + HRESULT STDMETHODCALLTYPE + CAAFCDCIDescriptorHelper::SetContainerFormat (const aafUID_t &FormatID) + { + HRESULT hr = S_OK; + IAAFObject* p_obj = NULL; + IAAFDictionary* p_dict = NULL; + IAAFContainerDef* p_containerdef = NULL; + + checkAssertion(NULL != _filedes); + + try + { + checkResult( _filedes->QueryInterface( IID_IAAFObject, (void**)&p_obj ) ); + checkResult( p_obj->GetDictionary( &p_dict ) ); + checkResult( p_dict->LookupContainerDef( FormatID, &p_containerdef ) ); + checkResult( _filedes->SetContainerFormat( p_containerdef ) ); + } + catch (HRESULT& rhr) + { + hr = rhr; // return thrown error code. + } + catch (...) + { + // We CANNOT throw an exception out of a COM interface method! + // Return a reasonable exception code. + hr = AAFRESULT_UNEXPECTED_EXCEPTION; + } + + // Cleanup + if( p_obj != NULL ) + p_obj->Release(); + if( p_dict != NULL ) + p_dict->Release(); + if( p_containerdef != NULL ) + p_containerdef->Release(); + + return hr; + } + + + HRESULT STDMETHODCALLTYPE + CAAFCDCIDescriptorHelper::GetContainerFormat (aafUID_t *pFormatID) + { + HRESULT hr = S_OK; + IAAFDefObject* p_obj = NULL; + IAAFContainerDef* p_containerdef = NULL; + + checkAssertion(NULL != _filedes); + + try + { + checkResult( _filedes->GetContainerFormat (&p_containerdef) ); + + checkResult( p_containerdef->QueryInterface( IID_IAAFDefObject, (void**)&p_obj ) ); + checkResult( p_obj->GetAUID( pFormatID ) ); + } + catch (HRESULT& rhr) + { + hr = rhr; // return thrown error code. + } + catch (...) + { + // We CANNOT throw an exception out of a COM interface method! + // Return a reasonable exception code. + hr = AAFRESULT_UNEXPECTED_EXCEPTION; + } + + // Cleanup + if( p_containerdef != NULL ) + p_containerdef->Release(); + if( p_obj != NULL ) + p_obj->Release(); + + return hr; + } + HRESULT STDMETHODCALLTYPE *************** *** 774,787 **** kAAFPropID_DigitalImageDescriptor_FieldStartOffset, &p_propdef)); ! checkResult( p_obj->GetPropertyValue( p_propdef, &p_propval ) ); ! checkResult( p_propval->GetType( &p_typedef ) ); ! checkResult( p_typedef->QueryInterface( IID_IAAFTypeDefInt, ! (void**)&p_typedef_int ) ); - checkResult( p_typedef_int->GetInteger( p_propval, - reinterpret_cast<aafMemPtr_t>(pFieldStartOffset), - sizeof(*pFieldStartOffset) ) ); } catch (HRESULT& rhr) --- 850,869 ---- kAAFPropID_DigitalImageDescriptor_FieldStartOffset, &p_propdef)); ! // Try to get prop value. If it doesn't exist, escape. ! hr = p_obj->GetPropertyValue( p_propdef, &p_propval ); ! if( hr == AAFRESULT_SUCCESS ) ! { ! checkResult( p_propval->GetType( &p_typedef ) ); ! checkResult( p_typedef->QueryInterface( IID_IAAFTypeDefInt, ! (void**)&p_typedef_int ) ); ! checkResult( p_typedef_int->GetInteger( p_propval, ! reinterpret_cast<aafMemPtr_t>(pFieldStartOffset), ! sizeof(*pFieldStartOffset) ) ); ! } ! else if( hr != AAFRESULT_PROP_NOT_PRESENT ) throw hr; ! // else return AAFRESULT_PROP_NOT_PRESENT } catch (HRESULT& rhr) *************** *** 929,942 **** kAAFPropID_DigitalImageDescriptor_FieldEndOffset, &p_propdef)); ! checkResult( p_obj->GetPropertyValue( p_propdef, &p_propval ) ); ! checkResult( p_propval->GetType( &p_typedef ) ); ! checkResult( p_typedef->QueryInterface( IID_IAAFTypeDefInt, ! (void**)&p_typedef_int ) ); - checkResult( p_typedef_int->GetInteger( p_propval, - reinterpret_cast<aafMemPtr_t>(pFieldEndOffset), - sizeof(*pFieldEndOffset) ) ); } catch (HRESULT& rhr) --- 1011,1030 ---- kAAFPropID_DigitalImageDescriptor_FieldEndOffset, &p_propdef)); ! // Try to get prop value. If it doesn't exist, escape. ! hr = p_obj->GetPropertyValue( p_propdef, &p_propval ); ! if( hr == AAFRESULT_SUCCESS ) ! { ! checkResult( p_propval->GetType( &p_typedef ) ); ! checkResult( p_typedef->QueryInterface( IID_IAAFTypeDefInt, ! (void**)&p_typedef_int ) ); ! checkResult( p_typedef_int->GetInteger( p_propval, ! reinterpret_cast<aafMemPtr_t>(pFieldEndOffset), ! sizeof(*pFieldEndOffset) ) ); ! } ! else if( hr != AAFRESULT_PROP_NOT_PRESENT ) throw hr; ! // else return AAFRESULT_PROP_NOT_PRESENT } catch (HRESULT& rhr) *************** *** 1229,1237 **** checkResult(pObj->GetDefinition (&pClassDef)); checkResult(pClassDef->LookupPropertyDef(kAAFPropID_DIDFrameSampleSize, &pPropertyDef)); ! checkResult(pObj->GetPropertyValue (pPropertyDef, &pPropValue)); ! checkResult(pPropValue->GetType(&pTypeDef)); ! checkResult(pTypeDef->QueryInterface(IID_IAAFTypeDefInt, (void**)&pTypeDefInt)); ! checkResult(pTypeDefInt->GetInteger(pPropValue, (aafMemPtr_t) &val, sizeof (val))); ! *pframeSampleSize = val; } catch (HRESULT& rhr) --- 1317,1332 ---- checkResult(pObj->GetDefinition (&pClassDef)); checkResult(pClassDef->LookupPropertyDef(kAAFPropID_DIDFrameSampleSize, &pPropertyDef)); ! // Try to get prop value. If it doesn't exist, escape. ! hr = pObj->GetPropertyValue( pPropertyDef, &pPropValue ); ! if( hr == AAFRESULT_SUCCESS ) ! { ! checkResult(pPropValue->GetType(&pTypeDef)); ! checkResult(pTypeDef->QueryInterface(IID_IAAFTypeDefInt, (void**)&pTypeDefInt)); ! checkResult(pTypeDefInt->GetInteger(pPropValue, (aafMemPtr_t) &val, sizeof (val))); ! *pframeSampleSize = val; ! } ! else if( hr != AAFRESULT_PROP_NOT_PRESENT ) throw hr; ! // else return AAFRESULT_PROP_NOT_PRESENT ! } catch (HRESULT& rhr) Index: CAAFEssenceDataStream.cpp =================================================================== RCS file: /cvsroot/aaf/AAF/ref-impl/plugins/CAAFEssenceDataStream.cpp,v retrieving revision 1.26 retrieving revision 1.27 diff -C2 -d -r1.26 -r1.27 *** CAAFEssenceDataStream.cpp 5 Feb 2007 22:33:19 -0000 1.26 --- CAAFEssenceDataStream.cpp 22 May 2008 21:26:42 -0000 1.27 *************** *** 30,33 **** --- 30,82 ---- #include <string.h> #include "AAFResult.h" + #include "AAFUtils.h" + + #include "AAFSmartPointer.h" + + // declare a handy typedef for smart pointer + #define TYPEDEF_SP( Object ) \ + typedef IAAFSmartPointer<IAAF##Object> IAAF##Object##SP + + // smartpointer typedefs for common objects + TYPEDEF_SP( EssenceData ); + TYPEDEF_SP( EssenceData2 ); + TYPEDEF_SP( PlainEssenceData ); + TYPEDEF_SP( KLVEssenceDataParameters ); + TYPEDEF_SP( Mob ); + TYPEDEF_SP( SourceMob ); + TYPEDEF_SP( MobSlot ); + + const aafUID_t NULL_UID = { 0, 0, 0, { 0, 0, 0, 0, 0, 0, 0, 0 } }; + + // Debugging log function which is optimised away for default builds + inline void plugin_trace(const char *fmt, ...) + { + #ifdef PLUGIN_TRACE + va_list ap; + + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + #endif + } + + // local function for simplifying error handling. + inline void checkResult(AAFRESULT r) + { + if (AAFRESULT_SUCCESS != r) + throw HRESULT(r); + } + + inline void checkExpression(bool test, AAFRESULT r) + { + if (!test) + throw r; + } + + inline void checkAssertion(bool test) + { + if (!test) + throw HRESULT(AAFRESULT_ASSERTION_VIOLATION); + } const CLSID CLSID_AAFEssenceDataStream = { 0x42A63FE1, 0x968A, 0x11d2, { 0x80, 0x89, 0x00, 0x60, 0x08, 0x14, 0x3e, 0x6f } }; *************** *** 37,41 **** CAAFEssenceDataStream::CAAFEssenceDataStream (IUnknown * pControllingUnknown) : CAAFUnknown (pControllingUnknown), ! _data(NULL) { } --- 86,91 ---- CAAFEssenceDataStream::CAAFEssenceDataStream (IUnknown * pControllingUnknown) : CAAFUnknown (pControllingUnknown), ! _data(NULL), ! _eek(NULL_UID) { } *************** *** 57,61 **** if (NULL != _data) ! return AAFRESULT_NOT_INITIALIZED; IAAFEssenceData2* essenceData2 = NULL; --- 107,111 ---- if (NULL != _data) ! return AAFRESULT_ALREADY_INITIALIZED; IAAFEssenceData2* essenceData2 = NULL; *************** *** 71,74 **** --- 121,256 ---- } + // + // IAAFEssenceDataStream2 methods. + // + HRESULT STDMETHODCALLTYPE + CAAFEssenceDataStream::GetEssenceData + (// @parm [in] essence data + IAAFEssenceData ** ppEssenceData) + { + if (NULL == ppEssenceData) + return AAFRESULT_NULL_PARAM; + + if (NULL == _data) + return AAFRESULT_NOT_INITIALIZED; + + // FIXME: this will always fail because _data is an IAAFPlainEssenceData, whose QI does not know about IID_IAAFEssenceData + // return _data->QueryInterface( IID_IAAFEssenceData, (void **)ppEssenceData ); + // should be named: GetPlainEssenceData() coded return _data; + + return _data->QueryInterface( IID_IAAFPlainEssenceData, (void **)ppEssenceData ); + + } + + HRESULT STDMETHODCALLTYPE + CAAFEssenceDataStream::GetEssenceElementKey + (// @parm [out,ref] key of the essence elements in this stream + aafUID_t * pEssenceElementKey) + { + if (NULL == pEssenceElementKey) + return AAFRESULT_NULL_PARAM; + + if (NULL == _data) + return AAFRESULT_NOT_INITIALIZED; + + *pEssenceElementKey = _eek; + + AAFRESULT hr = AAFRESULT_SUCCESS; + return hr; + } + + // some well-known EssenceElementKeys + const aafUID_t GC_EEK = { 0x0d010301, 0x0000, 0x0000, {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x01 } }; + + // the Avid legacy EEK for DNxHD + const aafUID_t Avid_EEK = { 0x0e040301, 0x0000, 0x0000, {0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x01 } }; + + // set EssenceElementKey from member variables and known consts + HRESULT STDMETHODCALLTYPE + CAAFEssenceDataStream::SetEssenceElementKey + (// @parm [in] essence element key + aafUID_constref eek, + // @parm [in] essence element kind + aafUInt8 eeKind, + // @parm [in] essence element count + aafUInt8 eeCount, + // @parm [in] essence element type + aafUInt8 eeType, + // @parm [in] essence element index + aafUInt8 eeIndex, + // @parm [in] logical slot id of source slot + aafSlotID_t sourceSlotID ) + { + plugin_trace("CAAFEssenceDataStream::SetEssenceElementKey()\n"); + + if (NULL == _data) return AAFRESULT_NOT_INITIALIZED; + + AAFRESULT hr = AAFRESULT_SUCCESS; + try + { + hr = AAFRESULT_INTERNAL_ERROR; + + // SetEEK + // we know how to set the EssenceElementKey on an EssenceData object + // via PlainEssenceData then KLVEssenceDataParameters::SetEssenceElementKey() + + IAAFKLVEssenceDataParametersSP pParameters; + checkResult( _data->QueryInterface(IID_IAAFKLVEssenceDataParameters, (void **)&pParameters) ); + + aafUID_t Peek; + hr = pParameters->GetEssenceElementKey( &Peek ); + + // only do this is the file kind allows us to + if( hr == AAFRESULT_SUCCESS ) + { + if( true ) // was: if( EqualAUID( &_eek, &NULL_UID ) ) + { + // if null passed in by caller, preset to what the file kind wants + if( EqualAUID( &eek, &NULL_UID ) ) _eek = Peek; + else _eek = eek; + + // make a GC bytes 12..16 + aafUInt32 GCeeIndex = ( ( (eeKind&0xff)<<8 | (eeCount&0xff) )<<8 | (eeType&0xff) )<<8 | (eeIndex&0xff); + + // overwrite eek bytes 12..16 + _eek.Data2 = (aafUInt16)(GCeeIndex>>16)&0xffff; + _eek.Data3 = (aafUInt16)(GCeeIndex)&0xffff; + + // set the EssenceElementKey + checkResult( pParameters->SetEssenceElementKey( _eek ) ); + + // set the PhysicalNum in the track of the FileSourceMob + IAAFSourceMobSP pSourceMob; + checkResult( _data->GetFileMob( &pSourceMob ) ); + + IAAFMobSP pFileMob; + checkResult( pSourceMob->QueryInterface( IID_IAAFMob,(void**)&pFileMob ) ); + + IAAFMobSlotSP pSlot; + checkResult( pFileMob->LookupSlot( 1, &pSlot ) ); + checkResult( pSlot->SetPhysicalNum( GCeeIndex ) ); + } + else + { + // _eek has been initialized already + // we ought to leave it alone + } + } + else if( hr == AAFRESULT_OPERATION_NOT_PERMITTED ) + // must be a file kind where eek isn't important + hr = AAFRESULT_CODEC_SEMANTIC_WARN; + } + catch (...) + { + // We CANNOT throw an exception out of a COM interface method! + // Return a reasonable exception code. + hr = AAFRESULT_UNEXPECTED_EXCEPTION; + } + // smart pointers clean themselves up + + return hr; + } + + HRESULT STDMETHODCALLTYPE CAAFEssenceDataStream::Write ( *************** *** 235,239 **** return E_INVALIDARG; ! // We only support the IID_IAAFEssenceDataStream interface if (EQUAL_UID(riid,IID_IAAFEssenceDataStream)) { --- 417,421 ---- return E_INVALIDARG; ! // We support the IID_IAAFEssenceDataStream and the IID_IAAFEssenceDataStream2 interfaces if (EQUAL_UID(riid,IID_IAAFEssenceDataStream)) { *************** *** 242,245 **** --- 424,433 ---- return S_OK; } + else if (EQUAL_UID(riid,IID_IAAFEssenceDataStream2)) + { + *ppvObj = (IAAFEssenceDataStream2 *)this; + ((IUnknown *)*ppvObj)->AddRef(); + return S_OK; + } else if (EQUAL_UID(riid,IID_IAAFEssenceStream)) { Index: CAAFCDCIDescriptorHelper.h =================================================================== RCS file: /cvsroot/aaf/AAF/ref-impl/plugins/CAAFCDCIDescriptorHelper.h,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** CAAFCDCIDescriptorHelper.h 19 Sep 2007 20:01:12 -0000 1.11 --- CAAFCDCIDescriptorHelper.h 22 May 2008 21:26:42 -0000 1.12 *************** *** 83,86 **** --- 83,89 ---- STDMETHOD (SetContainerFormat) (IAAFContainerDef *pFormat); STDMETHOD (GetContainerFormat) (IAAFContainerDef **ppFormat); + // Added methods to go direct to AUID + STDMETHOD (SetContainerFormat) (const aafUID_t &FormatID); + STDMETHOD (GetContainerFormat) (aafUID_t *pFormatID); // // DigitalImageDescriptor methods: |