mmappcomponents/harvester/metadataextractor/src/mpxmetadataextractor.cpp
branchRCL_3
changeset 19 51035f0751c2
parent 17 780c925249c1
child 23 4740b34b83ce
equal deleted inserted replaced
17:780c925249c1 19:51035f0751c2
    10 * Nokia Corporation - initial contribution.
    10 * Nokia Corporation - initial contribution.
    11 *
    11 *
    12 * Contributors:
    12 * Contributors:
    13 *
    13 *
    14 * Description:  Extracts metadata from a file
    14 * Description:  Extracts metadata from a file
    15 *  Version     : %version: da1mmcf#38.1.4.2.6.1.7 % << Don't touch! Updated by Synergy at check-out.
    15 *  Version     : %version: da1mmcf#38.1.4.2.6.1.9 % << Don't touch! Updated by Synergy at check-out.
    16 *
    16 *
    17 */
    17 */
    18 
       
    19 
    18 
    20 #include <e32base.h>
    19 #include <e32base.h>
    21 #include <badesca.h>
    20 #include <badesca.h>
    22 #include <apgcli.h>
    21 #include <apgcli.h>
    23 #include <MetaDataUtility.h>
    22 #include <MetaDataUtility.h>
    43 #include <mpxmediadrmdefs.h>
    42 #include <mpxmediadrmdefs.h>
    44 #include <mpxmediamtpdefs.h>
    43 #include <mpxmediamtpdefs.h>
    45 
    44 
    46 #include "mpxmetadataextractor.h"
    45 #include "mpxmetadataextractor.h"
    47 #include "mpxfileinfoutility.h"
    46 #include "mpxfileinfoutility.h"
       
    47 
       
    48 _LIT( KWmaMimeType, "audio/x-ms-wma" );
       
    49 _LIT( KWmaCafMimeType, "x-caf-audio/x-ms-wma" );
       
    50 
    48 #ifdef RD_MPX_TNM_INTEGRATION
    51 #ifdef RD_MPX_TNM_INTEGRATION
    49 _LIT( KImageFileType, "image/jpeg" );
    52 _LIT( KImageFileType, "image/jpeg" );
    50 const TInt KMPXTimeoutTimer = 3000000; // 3 seconds
    53 const TInt KMPXTimeoutTimer = 3000000; // 3 seconds
    51 const TInt KMPXMaxThumbnailRequest = 5; 
    54 const TInt KMPXMaxThumbnailRequest = 2; 
    52 #endif //RD_MPX_TNM_INTEGRATION
    55 #endif //RD_MPX_TNM_INTEGRATION
    53 
    56 
    54 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
    57 #ifdef ABSTRACTAUDIOALBUM_INCLUDED
    55 _LIT( KNonEmbeddedArtExt, ".alb" );
    58 _LIT( KNonEmbeddedArtExt, ".alb" );
    56 #endif
    59 #endif
   237     //
   240     //
   238     RFile file;
   241     RFile file;
   239     TInt err = file.Open( iFs, *fileName, EFileRead | EFileShareReadersOrWriters );
   242     TInt err = file.Open( iFs, *fileName, EFileRead | EFileShareReadersOrWriters );
   240     CleanupClosePushL(file);
   243     CleanupClosePushL(file);
   241     
   244     
       
   245     // Initially set default tags.
       
   246     SetDefaultL( *media );
   242     // Metadata related
   247     // Metadata related
   243     //
   248     //
   244     if( err == KErrNone )
   249     if( err == KErrNone )
   245         {
   250         {
   246         const TDesC& mimeType = media->ValueText( KMPXMediaGeneralMimeType );
   251         const TDesC& mimeType = media->ValueText( KMPXMediaGeneralMimeType );
   247         HBufC8* mimeType8 = HBufC8::NewLC( mimeType.Length() );
   252         HBufC8* mimeType8 = HBufC8::NewLC( mimeType.Length() );
   248         mimeType8->Des().Append( mimeType );
   253         mimeType8->Des().Append( mimeType );
   249         TRAPD( metadataerror, iMetadataUtility->OpenFileL( file, *mimeType8 ) );
   254         TRAPD( metadataerror, iMetadataUtility->OpenFileL( file, *mimeType8 ) );
       
   255         MPX_DEBUG2("CMPXMetadataExtractor::CreateMediaL, error %d parsing metadata", 
       
   256             metadataerror );
   250         CleanupStack::PopAndDestroy( mimeType8 );
   257         CleanupStack::PopAndDestroy( mimeType8 );
   251 
   258         
   252         // No problem
   259         // Even if there is error extracting metadata, fill extracted tags.
   253         if( KErrNone == metadataerror )
   260         TRAP( metadataerror, SetMediaPropertiesL( *media, *fileName ) ); 
   254             {
   261         MPX_DEBUG2("CMPXMetadataExtractor::CreateMediaL, error %d setting tags", 
   255             // Add TRAPD to capture exception KErrNoMemory.
   262             metadataerror );
   256             //If album art size is too large, trap this exception and SetDefaultL.
       
   257             //Fix EYLU-7ESE5L
       
   258             TRAPD( err, SetMediaPropertiesL( *media, *fileName ) );
       
   259             if ( KErrNoMemory == err )
       
   260                 {
       
   261                 SetDefaultL( *media );
       
   262                 }
       
   263             }
       
   264         else  // Error, Set defaults
       
   265             {
       
   266             SetDefaultL( *media );
       
   267             }
       
   268 
   263 
   269         // Reset the utility
   264         // Reset the utility
   270         iMetadataUtility->ResetL();
   265         iMetadataUtility->ResetL();
   271         }
       
   272     else // Error, Set defaults
       
   273         {
       
   274         SetDefaultL( *media );
       
   275         }
   266         }
   276     
   267     
   277     // Common properties that we can extract
   268     // Common properties that we can extract
   278     //
   269     //
   279     SetExtMediaPropertiesL( *media, *fileName, aMetadataOnly, file, err );
   270     SetExtMediaPropertiesL( *media, *fileName, aMetadataOnly, file, err );
   459                 HBufC8* value8; 
   450                 HBufC8* value8; 
   460                 TRAPD( err, value8 = ptr8.AllocL() );
   451                 TRAPD( err, value8 = ptr8.AllocL() );
   461                 if ( KErrNone != err )
   452                 if ( KErrNone != err )
   462                     {
   453                     {
   463                     MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error jpeg = %i", err);           
   454                     MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error jpeg = %i", err);           
   464                     User::Leave( err );  
   455                     }
   465                     }                 
   456                 else
   466                 CleanupStack::PushL( value8 );
   457                     {
   467                 AddMediaAlbumArtL( aMedia, aFile, *value8 );
   458                     CleanupStack::PushL( value8 );
   468                 CleanupStack::Pop( value8 );
   459                     TRAPD( err, AddMediaAlbumArtL( aMedia, aFile, *value8 ) );
       
   460                     if ( KErrNone != err )
       
   461                         {
       
   462                         MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL - error album art = %i", err);           
       
   463                         }
       
   464                     CleanupStack::Pop( value8 );
       
   465                     }
   469                 MPX_PERF_END(CMPXMetadataExtractor_SetMediaPropertiesL_JPEG_TNM);
   466                 MPX_PERF_END(CMPXMetadataExtractor_SetMediaPropertiesL_JPEG_TNM);
   470 #else //RD_MPX_TNM_INTEGRATION
   467 #else //RD_MPX_TNM_INTEGRATION
   471                 aMedia.SetTextValueL( KMPXMediaMusicAlbumArtFileName,
   468                 aMedia.SetTextValueL( KMPXMediaMusicAlbumArtFileName,
   472                                       aFile );
   469                                       aFile );
   473 #endif //RD_MPX_TNM_INTEGRATION
   470 #endif //RD_MPX_TNM_INTEGRATION
   477                 {
   474                 {
   478                 aMedia.SetTextValueL( KMPXMediaGeneralCopyright,
   475                 aMedia.SetTextValueL( KMPXMediaGeneralCopyright,
   479                                       *value );
   476                                       *value );
   480                 break;
   477                 break;
   481                 }
   478                 }
       
   479             case EMetaDataDuration:     
       
   480                 {                  
       
   481                 const TDesC& mimeType = aMedia.ValueText( KMPXMediaGeneralMimeType );
       
   482                 MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);   
       
   483                 
       
   484                 // Verify if WMA, get the duration
       
   485                 if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
       
   486                     {
       
   487                     MPX_DEBUG1("CMPXMetadataExtractor::SetMediaPropertiesL- WMA");                         
       
   488 
       
   489                     // Perform the duration conversion
       
   490                     TLex lexer( *value );
       
   491                     TInt32 duration ( 0 );
       
   492                     lexer.Val( duration );   // [second]      
       
   493                     duration *= 1000;        // [msec]
       
   494                 
       
   495                     aMedia.SetTObjectValueL<TInt32>( KMPXMediaGeneralDuration,
       
   496                                                 duration );      
       
   497                 
       
   498                     MPX_DEBUG2("CMPXMetadataExtractor::SetMediaPropertiesL- duration = %i", duration);  
       
   499                     }
       
   500                 break;
       
   501                 }
   482             case EMetaDataOriginalArtist:  // fall through
   502             case EMetaDataOriginalArtist:  // fall through
   483             case EMetaDataVendor:          // fall through
   503             case EMetaDataVendor:          // fall through
   484             case EMetaDataRating:          // fall through
   504             case EMetaDataRating:          // fall through
   485             case EMetaDataUniqueFileIdentifier:  // fall through
   505             case EMetaDataUniqueFileIdentifier:  // fall through
   486             case EMetaDataDuration:        // fall through
       
   487             case EMetaDataDate:            // fall through
   506             case EMetaDataDate:            // fall through
   488                 {
   507                 {
   489                 // not used
   508                 // not used
   490                 break;
   509                 break;
   491                 }
   510                 }
   578     aProp.SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
   597     aProp.SetTObjectValueL<TBool>( KMPXMediaDrmProtected, prot );
   579     aProp.SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
   598     aProp.SetTObjectValueL<TUint16>( KMPXMediaMTPDrmStatus, (TUint16)prot );
   580     
   599     
   581     iDrmMediaUtility->Close();
   600     iDrmMediaUtility->Close();
   582     
   601     
   583     // File Size
   602     //
       
   603     // File Size --- The following needs MMF support
   584     //
   604     //
   585     TInt size( 0 );
   605     TInt size( 0 );
   586     if( aFileErr == KErrNone )
   606     if( aFileErr == KErrNone )
   587         {
   607         {
   588         aFileHandle.Size( size );
   608         const TDesC& mimeType = aProp.ValueText( KMPXMediaGeneralMimeType );
   589         aProp.SetTObjectValueL<TInt>( KMPXMediaGeneralSize,
   609         MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, mimeType = %S", &mimeType);   
   590                                       size );
   610         
   591 
   611         // Verify if WMA, skip getting info from MMF
   592         // Duration, bitrate, samplerate, etc
   612         if( mimeType.Compare(KWmaMimeType) == 0 || mimeType.Compare(KWmaCafMimeType) == 0 )
   593         //
   613             {
   594         if( !aMetadataOnly )
   614             // No need to get MMF support
   595             {
   615             MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, skip MMF ");   
   596             TRAPD(err2, iFileInfoUtil->OpenFileL(
   616             }
       
   617         else
       
   618             {
       
   619             MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL, get MMF controller");   
       
   620             aFileHandle.Size( size );
       
   621             aProp.SetTObjectValueL<TInt>( KMPXMediaGeneralSize, size );
       
   622 
       
   623             // Duration, bitrate, samplerate, etc
       
   624             //
       
   625             if( !aMetadataOnly )
       
   626             {
       
   627                 TRAPD(err2, iFileInfoUtil->OpenFileL(
   597                           aFileHandle, 
   628                           aFileHandle, 
   598                           aProp.ValueText(KMPXMediaGeneralMimeType)));
   629                           aProp.ValueText(KMPXMediaGeneralMimeType)));
   599             MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, file info util error %i", err2);
   630                 MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL, file info util error %i", err2);
   600             if( KErrNone == err2 )
   631                 if( KErrNone == err2 )
   601                 {
   632                     {
   602                 aProp.SetTObjectValueL<TUint>( KMPXMediaAudioBitrate,
   633                     aProp.SetTObjectValueL<TUint>( KMPXMediaAudioBitrate,
   603                                                iFileInfoUtil->BitRate() );
   634                                                    iFileInfoUtil->BitRate() );
   604                 aProp.SetTObjectValueL<TUint>( KMPXMediaAudioSamplerate,
   635                     aProp.SetTObjectValueL<TUint>( KMPXMediaAudioSamplerate,
   605                                                iFileInfoUtil->SampleRate() );
   636                                                    iFileInfoUtil->SampleRate() );
   606                 TInt64 duration = (TInt64) iFileInfoUtil->Duration().Int64() / 1000; // ms
   637                     TInt64 duration = (TInt64) iFileInfoUtil->Duration().Int64() / 1000; // ms
   607                 aProp.SetTObjectValueL<TInt32>( KMPXMediaGeneralDuration,
   638                     aProp.SetTObjectValueL<TInt32>( KMPXMediaGeneralDuration,
   608                                               duration );
   639                                                     duration );
   609                 MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL -- duration %i", duration);
   640 
       
   641                     MPX_DEBUG2("CMPXMetadataExtractor::SetExtMediaPropertiesL -- duration %i", duration);
       
   642                     }
       
   643                 
       
   644                 iFileInfoUtil->Reset();
   610                 }
   645                 }
   611             }
   646             }
   612         }
   647         }
   613     else if( aFileErr == KErrNotFound || aFileErr == KErrPathNotFound )
   648     else if( aFileErr == KErrNotFound || aFileErr == KErrPathNotFound )
   614         {
   649         {
   616         }
   651         }
   617     // Finally set the db flag
   652     // Finally set the db flag
   618     //
   653     //
   619     aProp.SetTObjectValueL( KMPXMediaGeneralFlags,
   654     aProp.SetTObjectValueL( KMPXMediaGeneralFlags,
   620                             dbFlags );
   655                             dbFlags );
   621 
       
   622     iFileInfoUtil->Reset();
       
   623     
   656     
   624     MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL --->");
   657     MPX_DEBUG1("CMPXMetadataExtractor::SetExtMediaPropertiesL --->");
   625     }
   658     }
   626 
   659 
   627 // ---------------------------------------------------------------------------
   660 // ---------------------------------------------------------------------------
   665 // ---------------------------------------------------------------------------
   698 // ---------------------------------------------------------------------------
   666 void CMPXMetadataExtractor::ThumbnailReady( TInt /*aError*/, 
   699 void CMPXMetadataExtractor::ThumbnailReady( TInt /*aError*/, 
   667         MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ )
   700         MThumbnailData& /*aThumbnail*/, TThumbnailRequestId /*aId*/ )
   668     {
   701     {
   669     MPX_FUNC("CMPXMetadataExtractor::ThumbnailReady()");
   702     MPX_FUNC("CMPXMetadataExtractor::ThumbnailReady()");
       
   703     MPX_DEBUG2("CMPXMetadataExtractor::ThumbnailReady(): iOutstandingThumbnailRequest %d",
       
   704         iOutstandingThumbnailRequest);
   670     iOutstandingThumbnailRequest--;
   705     iOutstandingThumbnailRequest--;
   671     if ( iOutstandingThumbnailRequest <= KMPXMaxThumbnailRequest )
   706     if ( iOutstandingThumbnailRequest < KMPXMaxThumbnailRequest )
   672         {
   707         {
   673         StopWaitLoop();
   708         StopWaitLoop();
   674         }
   709         }
   675     }
   710     }
   676 
   711 
   865 
   900 
   866 void CMPXMetadataExtractor::CheckBeforeSendRequest()
   901 void CMPXMetadataExtractor::CheckBeforeSendRequest()
   867      {
   902      {
   868      MPX_FUNC("CMPXMetadataExtractor::CheckBeforeSendRequest()");
   903      MPX_FUNC("CMPXMetadataExtractor::CheckBeforeSendRequest()");
   869 #ifdef RD_MPX_TNM_INTEGRATION
   904 #ifdef RD_MPX_TNM_INTEGRATION
       
   905     MPX_DEBUG2("CMPXMetadataExtractor::CheckBeforeSendRequest(): iOutstandingThumbnailRequest %d",
       
   906         iOutstandingThumbnailRequest);
   870 	// If thumbnail creation is ongoing, wait til it is done
   907 	// If thumbnail creation is ongoing, wait til it is done
   871     if ( iOutstandingThumbnailRequest > KMPXMaxThumbnailRequest )
   908     if ( iOutstandingThumbnailRequest >= KMPXMaxThumbnailRequest )
   872         {
   909         {
   873         MPX_DEBUG1("CMPXMetadataExtractor::CheckBeforeSendRequest(): Thumbnail creation ongoing!");
   910         MPX_DEBUG1("CMPXMetadataExtractor::CheckBeforeSendRequest(): Thumbnail creation ongoing!");
   874         iTNMBlockCount++;
   911         iTNMBlockCount++;
   875         // Cancel timer.
   912         // Cancel timer.
   876         CancelTimeoutTimer();
   913         CancelTimeoutTimer();