diff -r 000000000000 -r 84ad3b177aa3 browserplugins/browseraudiovideoplugin/src/BavpMediaRecognizer.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/browserplugins/browseraudiovideoplugin/src/BavpMediaRecognizer.cpp Mon Mar 30 12:49:49 2009 +0300 @@ -0,0 +1,518 @@ +/* +* Copyright (c) 2006 Nokia Corporation and/or its subsidiary(-ies). +* All rights reserved. +* This component and the accompanying materials are made available +* under the terms of the License "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: Implementation of CBavpMediaRecognizer +* +*/ + + +// INCLUDE FILES +#include +#include +#include +#include + +#include "BavpMediaRecognizer.h" +#include "BavpLogger.h" + +// CONSTANTS +_LIT8(KDataTypeRAM, "audio/x-pn-realaudio-plugin"); +_LIT8(KDataTypeSDP, "application/sdp"); +_LIT8(KDataTypePlaylist, "audio/mpegurl"); +_LIT8(KDataTypeRNG, "application/vnd.nokia.ringing-tone"); +_LIT8(KDataTypeMp3, "audio/mp3"); +_LIT8(KDataTypeXmp3, "audio/x-mp3"); +_LIT8(KDataTypeAudio3gp, "audio/3gpp"); + +#if defined(BRDO_ASX_FF) +_LIT8(KDataTypeWvx, "video/x-ms-wvx"); +_LIT8(KDataTypeWax, "audio/x-ms-wax"); +_LIT8(KDataTypeAsx, "video/x-ms-asx"); +#endif // BRDO_ASX_FF + +_LIT(KUrlRtsp, "rtsp:"); + +const TInt KDefaultBufferSize = 1000; + +// _LIT(KRamFileExtension,".ram"); + +// ============================ MEMBER FUNCTIONS =============================== + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::CBavpMediaRecognizer +// C++ default constructor can NOT contain any code, that +// might leave. +// ----------------------------------------------------------------------------- +CBavpMediaRecognizer::CBavpMediaRecognizer() + { + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::ConstructL +// Symbian 2nd phase constructor can leave. +// ----------------------------------------------------------------------------- +void CBavpMediaRecognizer::ConstructL() + { + User::LeaveIfError( iRecognizer.Connect() ); + if ( iRecognizer.GetMaxDataBufSize( iBufSize) || iBufSize <= 0 ) + { + iBufSize = KDefaultBufferSize; + } + CreateVideoFormatsArrayL(); + CreateAudioFormatsArrayL(); + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::NewL +// Two-phased constructor. +// ----------------------------------------------------------------------------- +CBavpMediaRecognizer* CBavpMediaRecognizer::NewL() + { + CBavpMediaRecognizer* self = new( ELeave ) CBavpMediaRecognizer; + CleanupStack::PushL( self ); + self->ConstructL(); + CleanupStack::Pop(); + return self; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::~CBavpMediaRecognizer +// Destructor +// ----------------------------------------------------------------------------- +CBavpMediaRecognizer::~CBavpMediaRecognizer() + { + iVideoControllers.ResetAndDestroy(); + iAudioControllers.ResetAndDestroy(); + iRecognizer.Close(); + iFileHandle.Close(); + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::IdentifyMediaTypeL +// ----------------------------------------------------------------------------- +TBavpMediaType +CBavpMediaRecognizer::IdentifyMediaTypeL( const TDesC& aMediaName, + TBool aIncludeUrls ) + { + TBavpMediaType ret = EUnidentified; + + if ( BaflUtils::FileExists( CEikonEnv::Static()->FsSession(), aMediaName ) ) + { + TDataRecognitionResult fileRecognitionResult; + RecognizeFileL( aMediaName, fileRecognitionResult ); + + if ( !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeSDP ) ) + { + ret = ELocalSdpFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalSdpFile") ); + } + + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypePlaylist ) ) + { + ret = ELocalAudioPlaylist; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAudioPlaylist") ); + } + + if ( ret == EUnidentified && + FileHasAudioSupport( aMediaName, fileRecognitionResult ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeRNG ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeMp3 ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeXmp3 ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeAudio3gp ) ) + { + ret = ELocalAudioFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAudioFile") ); + } + + if ( ret == EUnidentified && + FileHasVideoSupport( aMediaName, fileRecognitionResult ) ) + { + ret = ELocalVideoFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalVideoFile") ); + } + + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeRAM ) ) + { + ret = ELocalRamFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalRamFile") ); + } +#if defined(BRDO_ASX_FF) + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeWvx ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeWax ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeAsx )) + { + ret = ELocalAsxFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAsxFile") ); + } +#endif // BRDO_ASX_FF + } + else + { + if ( aIncludeUrls && ValidUrl( aMediaName ) ) + { + ret = EUrl; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - EUrl") ); + } + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::IdentifyMediaTypeL +// ----------------------------------------------------------------------------- +TBavpMediaType +CBavpMediaRecognizer::IdentifyMediaTypeL( const TDesC& aMediaName, + RFile& aFile, + TBool aIncludeUrls ) + { + if( aFile.SubSessionHandle() ) + { + User::LeaveIfError( iFileHandle.Duplicate( aFile ) ); + } + + TBavpMediaType ret = EUnidentified; + + if ( BaflUtils::FileExists( CEikonEnv::Static()->FsSession(), aMediaName ) || FileHandleExists() ) + { + TDataRecognitionResult fileRecognitionResult; + RecognizeFileL( aMediaName, fileRecognitionResult ); + + if ( !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeSDP ) ) + { + ret = ELocalSdpFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalSdpFile") ); + } + + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( + KDataTypePlaylist ) ) + { + ret = ELocalAudioPlaylist; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAudioPlaylist") ); + } + + if ( ret == EUnidentified && + FileHasAudioSupport( aMediaName, fileRecognitionResult ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeRNG ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeMp3 ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeXmp3 ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeAudio3gp ) ) + { + ret = ELocalAudioFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAudioFile") ); + } + + if ( ret == EUnidentified && + FileHasVideoSupport( aMediaName, fileRecognitionResult ) ) + { + ret = ELocalVideoFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalVideoFile") ); + } + + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeRAM ) ) + { + ret = ELocalRamFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalRamFile") ); + } +#if defined(BRDO_ASX_FF) + if ( ret == EUnidentified && + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeWvx ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeWax ) || + !fileRecognitionResult.iDataType.Des8().CompareF( KDataTypeAsx ) ) + { + ret = ELocalAsxFile; + Log( EFalse, _L("CBavpMediaRecognizer::IdentifyMediaTypeL - ELocalAsxFile") ); + } +#endif // BRDO_ASX_FF + } + else + { + if (aIncludeUrls && ValidUrl(aMediaName)) + { + ret = EUrl; + } + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::MimeTypeL +// ----------------------------------------------------------------------------- +TBuf +CBavpMediaRecognizer::MimeTypeL( const TDesC& aLocalFile ) + { + TDataRecognitionResult fileRecognitionResult; + RecognizeFileL( aLocalFile,fileRecognitionResult ); + + if ( fileRecognitionResult.iConfidence >= CApaDataRecognizerType::EPossible ) + { + return fileRecognitionResult.iDataType.Des(); + } + + return KNullDesC(); + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::FileHasVideoSupport +// ----------------------------------------------------------------------------- +TBool CBavpMediaRecognizer::FileHasVideoSupport( const TDesC& /*aFileName*/, + TDataRecognitionResult& aFileRecognitionResult) + { + // Try with mime type + // We have a good quess -> go with mime type + if ( aFileRecognitionResult.iConfidence >= CApaDataRecognizerType::EPossible ) + { + for (TInt i = 0 ; i < iVideoControllers.Count() ; i++) + { + RMMFFormatImplInfoArray formats = + iVideoControllers[i]->PlayFormats(); + for ( TInt j = 0; j < formats.Count() ; j++ ) + { + if ( formats[j]->SupportsMimeType( + aFileRecognitionResult.iDataType.Des8() ) ) + return ETrue; + } + } + } + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::FileHasAudioSupport +// ----------------------------------------------------------------------------- +TBool CBavpMediaRecognizer::FileHasAudioSupport(const TDesC& aFileName, + TDataRecognitionResult& aFileRecognitionResult ) + { + // try with mime type + // we have a good quess -> gogo with mime type + if (aFileRecognitionResult.iConfidence >= CApaDataRecognizerType::EPossible) + { + for (TInt i = 0 ; i < iAudioControllers.Count() ; i++) + { + RMMFFormatImplInfoArray formats = + iAudioControllers[i]->PlayFormats(); + for (TInt j = 0; j < formats.Count() ; j++) + { + if ( formats[j]->SupportsMimeType( + aFileRecognitionResult.iDataType.Des8() ) ) + return ETrue; + } + } + } + + // we can't quess -> try with file extension + else + { + TParsePtrC parser(aFileName); + TBuf8 fileExtension; + fileExtension.Copy(parser.Ext()); + for (TInt i = 0 ; i < iVideoControllers.Count() ; i++) + { + RMMFFormatImplInfoArray formats = + iAudioControllers[i]->PlayFormats(); + for (TInt j = 0; j < formats.Count() ; j++) + { + if (formats[j]->SupportsFileExtension(fileExtension)) + return ETrue; + } + } + } + + return EFalse; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::ValidUrl +// ----------------------------------------------------------------------------- +TBool CBavpMediaRecognizer::ValidUrl(const TDesC& aUrl) + { + TBool ret = EFalse; + if (aUrl.Find(KUrlRtsp) == 0) + { + ret = ETrue; + } + return ret; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::MimeTypeL +// ----------------------------------------------------------------------------- +TBuf CBavpMediaRecognizer::MimeTypeL(RFile& aFile) + { + if( aFile.SubSessionHandle() ) + { + // Preferred + User::LeaveIfError( iFileHandle.Duplicate( aFile ) ); + } + + // If new handle is not valid, old might still be + if ( !FileHandleExists() ) + { + User::Leave( KErrBadHandle ); + } + + TDataRecognitionResult fileRecognitionResult; + RecognizeFileL( KNullDesC(), fileRecognitionResult ); + + if (fileRecognitionResult.iConfidence >= CApaDataRecognizerType::EPossible) + { + return fileRecognitionResult.iDataType.Des(); + } + return KNullDesC(); + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::CreateVideoFormatsArrayL +// ----------------------------------------------------------------------------- +void CBavpMediaRecognizer::CreateVideoFormatsArrayL() + { + CMMFControllerPluginSelectionParameters* cSelect = + CMMFControllerPluginSelectionParameters::NewLC(); + + CMMFFormatSelectionParameters* fSelect = + CMMFFormatSelectionParameters::NewLC(); + + // Set the play and record format selection parameters to be blank. + // - format support is only retrieved if requested. + cSelect->SetRequiredPlayFormatSupportL(*fSelect); + + // Set the media ids + RArray mediaIds; + CleanupClosePushL(mediaIds); + User::LeaveIfError(mediaIds.Append(KUidMediaTypeVideo)); + + // Get plugins that support at least video + cSelect->SetMediaIdsL( mediaIds, + CMMFPluginSelectionParameters::EAllowOtherMediaIds ); + + // iVideoControllers contains now all plugins that support at least video + cSelect->ListImplementationsL(iVideoControllers); + + // Clean up + CleanupStack::PopAndDestroy( 3 ); // fSelect, cSelect, mediaIds + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::CreateAudioFormatsArrayL +// ----------------------------------------------------------------------------- +void CBavpMediaRecognizer::CreateAudioFormatsArrayL() + { + CMMFControllerPluginSelectionParameters* cSelect = + CMMFControllerPluginSelectionParameters::NewLC(); + + CMMFFormatSelectionParameters* fSelect = + CMMFFormatSelectionParameters::NewLC(); + + // Set the play and record format selection parameters to be blank. + // - format support is only retrieved if requested. + cSelect->SetRequiredPlayFormatSupportL( *fSelect ); + + // Set the media ids + RArray mediaIds; + CleanupClosePushL( mediaIds ); + User::LeaveIfError( mediaIds.Append(KUidMediaTypeAudio) ); + + // Get plugins that supports audio only + cSelect->SetMediaIdsL( mediaIds, + CMMFPluginSelectionParameters::EAllowOnlySuppliedMediaIds ); + + // iAudioControllers contains now all audio plugins that + // support at least audio. + cSelect->ListImplementationsL( iAudioControllers ); + + // Clean up + CleanupStack::PopAndDestroy( 3 ); // fSelect, cSelect, mediaIds + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::RecognizeFileL +// ----------------------------------------------------------------------------- +void CBavpMediaRecognizer::RecognizeFileL( const TDesC& aFileName, + TDataRecognitionResult& aResult ) + { + aResult.Reset(); + HBufC8* fBuf = HBufC8::NewLC( iBufSize ); // fBuf in CS + TPtr8 fileBuf = fBuf->Des(); + + // Recognize file + if ( FileHandleExists() ) + { + User::LeaveIfError( iRecognizer.RecognizeData( iFileHandle, aResult ) ); + } + else + { + // Read file + User::LeaveIfError( ReadFile( aFileName, fileBuf ) ); + User::LeaveIfError( iRecognizer.RecognizeData( aFileName, fileBuf, aResult ) ); + } + + CleanupStack::PopAndDestroy(); // fBuf + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::ReadFile +// ----------------------------------------------------------------------------- +TInt CBavpMediaRecognizer::ReadFile( const TDesC& aFileName, TDes8& aBuf ) + { + RFile file; + TInt err; + + if ( FileHandleExists() ) + { + err = file.Duplicate( iFileHandle ); + } + else + { + err = file.Open( CEikonEnv::Static()->FsSession(), aFileName, + EFileRead | EFileShareAny ); + if ( err ) + { + err = file.Open( CEikonEnv::Static()->FsSession(), aFileName, + EFileRead | EFileShareReadersOnly ); + } + } + + if ( err ) + { + // If file does not exist + return err; + } + + // Read the beginning of the file + err = file.Read( 0, aBuf, iBufSize ); + file.Close(); + + return err; + } + +// ----------------------------------------------------------------------------- +// CBavpMediaRecognizer::FileHandleExists +// ----------------------------------------------------------------------------- +TBool CBavpMediaRecognizer::FileHandleExists() + { + TInt size(0); + TInt err(0); + + if ( iFileHandle.SubSessionHandle() ) + { + err = iFileHandle.Size( size ); + } + + return ( !err && size ) ? ETrue : EFalse; + } + +// End of File