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 { |
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(); |