--- /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 <eikenv.h>
+#include <bautils.h>
+#include <mmf/server/mmfdatasourcesink.hrh>
+#include <mmf/common/mmfcontrollerpluginresolver.h>
+
+#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<KMaxDataTypeLength>
+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<KMaxFileName> 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<KMaxDataTypeLength> 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<TUid> 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<TUid> 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