diff -r 000000000000 -r c53acadfccc6 harvester/harvesterplugins/RTPPlugin/src/harvesterrtpplugin.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/harvester/harvesterplugins/RTPPlugin/src/harvesterrtpplugin.cpp Mon Jan 18 20:34:07 2010 +0200 @@ -0,0 +1,327 @@ +/* +* Copyright (c) 2007-2009 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of "Eclipse Public License v1.0" +* which accompanies this distribution, and is available +* at the URL "http://www.eclipse.org/legal/epl-v10.html". +* +* Initial Contributors: +* Nokia Corporation - initial contribution. +* +* Contributors: +* +* Description: Harvests metadata from rtp video file +* +*/ + +#include +#include + +#include "harvesterdata.h" +#include "harvesterrtpplugin.h" +#include "harvesterlog.h" +#include "mdeobject.h" +#include "mdsutils.h" +#include "mdeobjectwrapper.h" +#include "harvesterrtpmetadatareader.h" +#include +#include + +// Supported mime type +_LIT( KRtpClipMimetype, "application/x-nokia-teh-rtp" ); + +// Enough size to recognize file and read metaheader +const TInt KFileBufferSize( KMaxMetaHeaderLength ); + +CHarvesterRtpPluginPropertyDefs::CHarvesterRtpPluginPropertyDefs() : CBase() + { + } + +void CHarvesterRtpPluginPropertyDefs::ConstructL(CMdEObjectDef& aObjectDef) + { + CMdENamespaceDef& nsDef = aObjectDef.NamespaceDef(); + + // Common property definitions + CMdEObjectDef& objectDef = nsDef.GetObjectDefL( MdeConstants::Object::KBaseObject ); + iCreationDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KCreationDateProperty ); + iLastModifiedDatePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KLastModifiedDateProperty ); + iSizePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KSizeProperty ); + iItemTypePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KItemTypeProperty ); + iTitlePropertyDef = &objectDef.GetPropertyDefL( MdeConstants::Object::KTitleProperty ); + + CMdEObjectDef& mediaDef = nsDef.GetObjectDefL( MdeConstants::MediaObject::KMediaObject ); + iCaptureDatePropertyDef =& mediaDef.GetPropertyDefL( MdeConstants::MediaObject::KCaptureDateProperty ); + iDurationPropertyDef = &mediaDef.GetPropertyDefL( MdeConstants::MediaObject::KDurationProperty ); + + CMdEObjectDef& videoDef = nsDef.GetObjectDefL( MdeConstants::Video::KVideoObject ); + iAgeProfilePropertyDef = &videoDef.GetPropertyDefL( MdeConstants::Video::KAgeProfileProperty ); + iRecordingFlagsPropertyDef = &videoDef.GetPropertyDefL( MdeConstants::Video::KRecordingFlagsProperty ); + } + +CHarvesterRtpPluginPropertyDefs* CHarvesterRtpPluginPropertyDefs::NewL(CMdEObjectDef& aObjectDef) + { + CHarvesterRtpPluginPropertyDefs* self = + new (ELeave) CHarvesterRtpPluginPropertyDefs(); + CleanupStack::PushL( self ); + self->ConstructL( aObjectDef ); + CleanupStack::Pop( self ); + return self; + } + +// ======== MEMBER FUNCTIONS ======== + +// --------------------------------------------------------------------------- +// Default constructor +// --------------------------------------------------------------------------- +// +CHarvesterRtpPlugin::CHarvesterRtpPlugin() : CHarvesterPlugin(), iPropDefs( NULL ) + { + } + +// --------------------------------------------------------------------------- +// 2nd phase constructor +// --------------------------------------------------------------------------- +// +void CHarvesterRtpPlugin::ConstructL() + { + WRITELOG( "CHarvesterRtpPlugin::ConstructL()" ); + } + +// --------------------------------------------------------------------------- +// Constructor +// --------------------------------------------------------------------------- +// +CHarvesterRtpPlugin* CHarvesterRtpPlugin::NewL() + { + CHarvesterRtpPlugin* self = new(ELeave) CHarvesterRtpPlugin(); + CleanupStack::PushL(self); + self->ConstructL(); + CleanupStack::Pop(self); + + return self; + } + +// --------------------------------------------------------------------------- +// Destructor +// --------------------------------------------------------------------------- +// +CHarvesterRtpPlugin::~CHarvesterRtpPlugin() + { + WRITELOG( "CHarvesterRtpPlugin::~CHarvesterRtpPlugin()" ); + } + +// --------------------------------------------------------------------------- +// Harvest file +// --------------------------------------------------------------------------- +// +void CHarvesterRtpPlugin::HarvestL( CHarvesterData* aHD ) + { + WRITELOG( "CHarvesterRtpPlugin::Harvest()" ); + CMdEObject& mdeObject = aHD->MdeObject(); + + CHarvesterRtpClipDetails* clipDetails = CHarvesterRtpClipDetails::NewL(); + CleanupStack::PushL( clipDetails ); + + TRAPD( error, GatherDataL( mdeObject, *clipDetails ) ); + if ( error == KErrNone || error == KErrCompletion ) + { + TBool isNewObject( mdeObject.Id() == 0 ); + + if ( isNewObject || mdeObject.Placeholder() ) + { + TRAP( error, HandleObjectPropertiesL( *aHD, *clipDetails, ETrue ) ); + mdeObject.SetPlaceholder( EFalse ); + } + else + { + TRAP( error, HandleObjectPropertiesL( *aHD, *clipDetails, EFalse ) ); + } + + if ( error != KErrNone ) + { + WRITELOG1( "CHarvesterWMVPlugin::HarvestL() - Handling object failed: ", error ); + } + } + else + { + TInt convertedError = KErrNone; + MdsUtils::ConvertTrapError( error, convertedError ); + aHD->SetErrorCode( convertedError ); + } + CleanupStack::PopAndDestroy( clipDetails ); + } + +// --------------------------------------------------------------------------- +// Gather metadata +// --------------------------------------------------------------------------- +// +void CHarvesterRtpPlugin::GatherDataL( CMdEObject& aMetadataObject, CHarvesterRtpClipDetails& aClipDetails ) + { + WRITELOG( "CHarvesterRtpPlugin - GatherDataL()" ); + + const TDesC& uri = aMetadataObject.Uri(); + + HBufC8* buffer = HBufC8::NewLC( KFileBufferSize ); + TPtr8 bufferPtr( buffer->Des() ); + + RFile64 file; + CleanupClosePushL( file ); + + User::LeaveIfError( file.Open( iFs, uri, EFileShareAny ) ); + + TEntry* entry = new (ELeave) TEntry(); + CleanupStack::PushL( entry ); + User::LeaveIfError( iFs.Entry( uri, *entry ) ); + aClipDetails.iFileSize = (TUint)entry->iSize; + aClipDetails.iModifiedDate = entry->iModified; + CleanupStack::PopAndDestroy( entry ); // entry + + User::LeaveIfError( file.Read( bufferPtr, KFileBufferSize ) ); + User::LeaveIfError( RecognizeFile( uri, *buffer, aClipDetails ) ); + User::LeaveIfError( CheckIfMimeSupported( aClipDetails.iMimeType ) ); + + CHarvesterRtpMetaDataReader* mdr = CHarvesterRtpMetaDataReader::NewL( buffer ); + CleanupStack::PushL( mdr ); + + WRITELOG( "CHarvesterRtpPlugin - GatherDataL() ---> found metadata!" ); + mdr->GetClipDetailsL( aClipDetails ); + + CleanupStack::PopAndDestroy( mdr ); // mdr + CleanupStack::PopAndDestroy( &file ); // file + CleanupStack::PopAndDestroy( buffer ); // buffer + } + +// ----------------------------------------------------------------------------- +// Runs recognizers on the given file to determine its mime type +// ----------------------------------------------------------------------------- +// +TInt CHarvesterRtpPlugin::RecognizeFile( + const TDesC& aFilePath, + const TDesC8& aFileBuffer, + CHarvesterRtpClipDetails& aClipDetails ) + { + WRITELOG( "CHarvesterRtpPlugin::RecognizeFile()" ); + TInt err( KErrNone ); + + RApaLsSession apaSession; + err = apaSession.Connect(); + if ( err == KErrNone ) + { + TDataRecognitionResult result; + err = apaSession.RecognizeData( aFilePath, aFileBuffer, result ); + if ( result.iConfidence >= CApaDataRecognizerType::EProbable ) + { + aClipDetails.iMimeType = result.iDataType.Des(); + WRITELOG1( "CHarvesterRtpPlugin - Mime type: %S", &aClipDetails.iMimeType ); + } + + apaSession.Close(); + } + + return err; + } + +///--------------------------------------------------------------------------- +/// Check if mime type is supported +///--------------------------------------------------------------------------- +// +TInt CHarvesterRtpPlugin::CheckIfMimeSupported( const TDesC& aMimeBuf ) + { + if ( MdsUtils::Compare( KRtpClipMimetype, aMimeBuf ) == 0 ) + { + WRITELOG( "CHarvesterRtpPlugin - Mime type supported"); + return KErrNone; + } + + WRITELOG( "CHarvesterRtpPlugin - Mime type not supported"); + return KErrNotSupported; + } + +// --------------------------------------------------------------------------- +// Add object properties +// --------------------------------------------------------------------------- +// +void CHarvesterRtpPlugin::HandleObjectPropertiesL( + CHarvesterData& aHD, + CHarvesterRtpClipDetails& aClipDetails, + TBool aIsAdd) + { + WRITELOG( "CHarvesterRtpPlugin::HandleObjectPropertiesL()" ); + + CMdEObject& mdeObject = aHD.MdeObject(); + + if( !iPropDefs ) + { + CMdEObjectDef& objectDef = mdeObject.Def(); + iPropDefs = CHarvesterRtpPluginPropertyDefs::NewL( objectDef ); + } + + TTimeIntervalSeconds timeOffset = User::UTCOffset(); + TTime localModifiedTime = aClipDetails.iModifiedDate + timeOffset; + + if( ! mdeObject.Placeholder() ) + { + // Creation date of media file + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iCreationDatePropertyDef, &localModifiedTime, aIsAdd ); + // Last modified date + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iLastModifiedDatePropertyDef, &aClipDetails.iModifiedDate, aIsAdd ); + // File size + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iSizePropertyDef, &aClipDetails.iFileSize, aIsAdd ); + } + + // Title (is set from URI by default) + if ( aClipDetails.iTitle.Length() > 0 ) + { + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iTitlePropertyDef, &aClipDetails.iTitle, EFalse ); + } + + // Mime Type + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iItemTypePropertyDef, &aClipDetails.iMimeType, aIsAdd ); + + // Capture date + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iCaptureDatePropertyDef, &localModifiedTime, aIsAdd ); + + // Duration + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iDurationPropertyDef, &aClipDetails.iDuration, aIsAdd ); + + //Save these if video center videostorage available + //AgeProfile + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iAgeProfilePropertyDef, &aClipDetails.iParental, aIsAdd ); + + //VideoFlags + TUint32 flags = 0; + + //always set clip type as recording + flags |= EIptvMyVideosVideoTypeRecording; + + if ( aClipDetails.iRecOngoing ) + { + //Recording ongoing + //Otherwise assuming that recording has completed + flags |= EIptvMyVideosVideoIsRecording; + } + + if ( aClipDetails.iRecFailed ) + { + //Recording failed + flags |= EIptvMyVideosVideoRecFailed; + } + + if ( aClipDetails.iQuality <= KPartiallyFailedLimit ) + { + //Clip partially failed + flags |= EIptvMyVideosVideoRecPartiallyFailed; + } + + CMdeObjectWrapper::HandleObjectPropertyL(mdeObject, + *iPropDefs->iRecordingFlagsPropertyDef, &flags, aIsAdd ); + }