browserplugins/browseraudiovideoplugin/src/BavpMediaRecognizer.cpp
changeset 0 84ad3b177aa3
--- /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