imagehandlingutilities/thumbnailmanager/plugins/video/src/thumbnailvideoprovider.cpp
changeset 54 48dd0f169f0d
parent 42 2e2a89493e2b
equal deleted inserted replaced
42:2e2a89493e2b 54:48dd0f169f0d
     1 /*
       
     2 * Copyright (c) 2006-2007 Nokia Corporation and/or its subsidiary(-ies). 
       
     3 * All rights reserved.
       
     4 * This component and the accompanying materials are made available
       
     5 * under the terms of "Eclipse Public License v1.0"
       
     6 * which accompanies this distribution, and is available
       
     7 * at the URL "http://www.eclipse.org/legal/epl-v10.html".
       
     8 *
       
     9 * Initial Contributors:
       
    10 * Nokia Corporation - initial contribution.
       
    11 *
       
    12 * Contributors:
       
    13 *
       
    14 * Description:  Video thumbnail provider
       
    15  *
       
    16 */
       
    17 
       
    18 
       
    19 #include <e32base.h>
       
    20 #include <ecom/ecom.h>
       
    21 #include <implementationproxy.h>
       
    22 #include <fbs.h>
       
    23 
       
    24 #include "thumbnailvideoprovider.h"
       
    25 #include "thumbnailmanageruids.hrh"
       
    26 #include "thumbnailmanagerconstants.h"
       
    27 #include "thumbnaillog.h"
       
    28 #include "OstTraceDefinitions.h"
       
    29 #ifdef OST_TRACE_COMPILER_IN_USE
       
    30 #include "thumbnailvideoproviderTraces.h"
       
    31 #endif
       
    32 
       
    33 
       
    34 #ifndef IMPLEMENTATION_PROXY_ENTRY
       
    35 typedef TAny* TProxyNewLPtr;
       
    36 #define IMPLEMENTATION_PROXY_ENTRY(aUid, aFuncPtr) \
       
    37 { {aUid}, static_cast<TProxyNewLPtr>(aFuncPtr) }
       
    38 #endif 
       
    39 
       
    40 // ======== MEMBER FUNCTIONS ========
       
    41 
       
    42 // ---------------------------------------------------------------------------
       
    43 // CThumbnailVideoProvider::NewL()
       
    44 // Two-phased constructor.
       
    45 // ---------------------------------------------------------------------------
       
    46 //
       
    47 CThumbnailVideoProvider* CThumbnailVideoProvider::NewL()
       
    48     {
       
    49     CThumbnailVideoProvider* self = new( ELeave )CThumbnailVideoProvider();
       
    50     return self;
       
    51     }
       
    52 
       
    53 
       
    54 // ---------------------------------------------------------------------------
       
    55 // CThumbnailImageProvider::CThumbnailImageProvider()
       
    56 // C++ default constructor can NOT contain any code, that might leave.
       
    57 // ---------------------------------------------------------------------------
       
    58 //
       
    59 CThumbnailVideoProvider::CThumbnailVideoProvider():CActive( EPriorityStandard )
       
    60     {
       
    61     CActiveScheduler::Add( this );
       
    62     
       
    63     iTimer.CreateLocal();
       
    64     iTimeout = EFalse;
       
    65     
       
    66     TN_DEBUG1( "CThumbnailVideoProvider::CThumbnailVideoProvider()" );
       
    67     OstTrace0( TRACE_NORMAL, CTHUMBNAILVIDEOPROVIDER_CTHUMBNAILVIDEOPROVIDER, "CThumbnailVideoProvider::CThumbnailVideoProvider" );
       
    68     }
       
    69 
       
    70 
       
    71 // ---------------------------------------------------------------------------
       
    72 // CThumbnailVideoProvider::~CThumbnailVideoProvider()
       
    73 // Destructor.
       
    74 // ---------------------------------------------------------------------------
       
    75 //
       
    76 CThumbnailVideoProvider::~CThumbnailVideoProvider()
       
    77     {
       
    78     // run DoCancel even if not active
       
    79     if ( IsActive() )
       
    80         {
       
    81         Cancel();
       
    82         }
       
    83     else
       
    84         {
       
    85         DoCancel();
       
    86         }
       
    87     
       
    88     iTimer.Close();
       
    89     
       
    90     TN_DEBUG1( "CThumbnailVideoProvider::~CThumbnailVideoProvider()" );
       
    91     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILVIDEOPROVIDER_CTHUMBNAILVIDEOPROVIDER, "CThumbnailVideoProvider::~CThumbnailVideoProvider" );
       
    92     REComSession::DestroyedImplementation( iDtor_ID_Key );
       
    93     }
       
    94 // -----------------------------------------------------------------------------
       
    95 // CThumbnailVideoProvider::DoCancel()
       
    96 // -----------------------------------------------------------------------------
       
    97 //
       
    98 void CThumbnailVideoProvider::DoCancel()
       
    99     {
       
   100     iTimer.Cancel();
       
   101     
       
   102     if ( iVideoClipInfo )
       
   103         {
       
   104         iVideoClipInfo->CancelThumb();
       
   105         
       
   106         delete iVideoClipInfo;
       
   107         iVideoClipInfo = NULL;
       
   108         }
       
   109     }
       
   110 
       
   111 
       
   112 // -----------------------------------------------------------------------------
       
   113 // CThumbnailImageDecoder::RunL()
       
   114 // -----------------------------------------------------------------------------
       
   115 //
       
   116 void CThumbnailVideoProvider::RunL()
       
   117     {
       
   118     DoCancel();
       
   119     
       
   120     // video thumbnail engine doesn't respond
       
   121     if (iTimeout)
       
   122         {
       
   123         iObserver->ThumbnailProviderReady( KErrCompletion, NULL, TSize(), EFalse, EFalse);
       
   124         iTimeout = EFalse;
       
   125         
       
   126         TN_DEBUG1( "CThumbnailVideoProvider::RunL() - timeout" );
       
   127         OstTrace0( TRACE_NORMAL, CTHUMBNAILVIDEOPROVIDER_RUNL, "CThumbnailVideoProvider::RunL - timeout" );
       
   128         }
       
   129     }
       
   130 
       
   131 // ---------------------------------------------------------------------------
       
   132 // CThumbnailVideoProvider::GetThumbnailL()
       
   133 // Provides the thumbnail image of video clip
       
   134 // ---------------------------------------------------------------------------
       
   135 //
       
   136 void CThumbnailVideoProvider::GetThumbnailL( RFs&  /*aFs*/, RFile64& aFile, const
       
   137     TDataType&  /*aMimeType*/, const CThumbnailManager::TThumbnailFlags aFlags,
       
   138     const TDisplayMode /*aDisplayMode*/, const CThumbnailManager::TThumbnailQualityPreference /*aQualityPreference */)
       
   139     {
       
   140     TN_DEBUG1( "CThumbnailVideoProvider::GetThumbnailL() start" );
       
   141     OstTrace0( TRACE_NORMAL, CTHUMBNAILVIDEOPROVIDER_GETTHUMBNAILL, "CThumbnailVideoProvider::GetThumbnailL - start" );
       
   142 
       
   143     iFlags = aFlags;
       
   144 	//set default mode displaymode from global constants
       
   145     iDisplayMode = KStoreDisplayMode;
       
   146 
       
   147 //Symbian^4 specific	
       
   148 //TODO currently only ARM platforms supports MAP mode
       
   149 #if !(defined(__CC_ARM) || defined(__ARMCC__))
       
   150     iDisplayMode = EColor16M;
       
   151 #endif	
       
   152 
       
   153     TFileName filename;
       
   154     User::LeaveIfError( aFile.FullName( filename ));
       
   155 
       
   156     TRAPD( err, iVideoClipInfo = CTNEVideoClipInfo::NewL( filename, * this ));
       
   157 
       
   158     if ( err != KErrNone )
       
   159         {
       
   160         User::Leave( KErrCorrupt );
       
   161         }
       
   162     
       
   163     TN_DEBUG1( "CThumbnailVideoProvider::GetThumbnailL() end" );
       
   164     OstTrace0( TRACE_NORMAL, DUP1_CTHUMBNAILVIDEOPROVIDER_GETTHUMBNAILL, "CThumbnailVideoProvider::GetThumbnailL - end" );
       
   165     }
       
   166 
       
   167 // ---------------------------------------------------------------------------
       
   168 // CThumbnailVideoProvider::GetThumbnailL()
       
   169 // ---------------------------------------------------------------------------
       
   170 //
       
   171 void CThumbnailVideoProvider::GetThumbnailL( RFs& /*aFs*/, 
       
   172     TDesC8* /* aBuffer */,
       
   173     const TDataType& /* aMimeType */, 
       
   174     const CThumbnailManager::TThumbnailFlags /*aFlags*/,
       
   175     const TDisplayMode /* aDisplayMode */, 
       
   176     const CThumbnailManager::TThumbnailQualityPreference /*aQualityPreference */)
       
   177     {
       
   178     TN_DEBUG1( "CThumbnailVideoProvider::GetThumbnailL() - nothing to do" );
       
   179     OstTrace0( TRACE_NORMAL, DUP2_CTHUMBNAILVIDEOPROVIDER_GETTHUMBNAILL, "CThumbnailVideoProvider::GetThumbnailL - nothing to do" );
       
   180     }
       
   181 
       
   182 // ---------------------------------------------------------------------------
       
   183 // CThumbnailVideoProvider::GetThumbnailL()
       
   184 // ---------------------------------------------------------------------------
       
   185 //
       
   186 void CThumbnailVideoProvider::GetThumbnailL( RFs& /*aFs*/, TDesC8& /*aBuffer*/)
       
   187     {
       
   188     TN_DEBUG1( "CThumbnailVideoProvider::GetThumbnailL() - nothing to do" );
       
   189     OstTrace0( TRACE_NORMAL, DUP3_CTHUMBNAILVIDEOPROVIDER_GETTHUMBNAILL, "CThumbnailVideoProvider::GetThumbnailL - nothing to do" );
       
   190     User::Leave( KErrNotSupported );
       
   191     }
       
   192 
       
   193 // ---------------------------------------------------------------------------
       
   194 // Cancel thumbnail request
       
   195 // ---------------------------------------------------------------------------
       
   196 //
       
   197 void CThumbnailVideoProvider::CancelGetThumbnail()
       
   198     {
       
   199     // run DoCancel even if not active
       
   200     if ( IsActive() )
       
   201         {
       
   202         Cancel();
       
   203         }
       
   204     else
       
   205         {
       
   206         DoCancel();
       
   207         }
       
   208     }
       
   209 
       
   210 // ---------------------------------------------------------------------------
       
   211 // CThumbnailVideoProvider::NotifyVideoClipThumbCompleted()
       
   212 // Used to notify when thumbnail image of video clip is ready
       
   213 // ---------------------------------------------------------------------------
       
   214 //
       
   215 void CThumbnailVideoProvider::NotifyVideoClipThumbCompleted( CTNEVideoClipInfo&
       
   216     /*aInfo*/, TInt aError, CFbsBitmap* aThumb )
       
   217     {
       
   218     TN_DEBUG2( "CThumbnailVideoProvider::NotifyVideoClipThumbCompleted(aError=%d)", aError );
       
   219     OstTrace1( TRACE_NORMAL, CTHUMBNAILVIDEOPROVIDER_NOTIFYVIDEOCLIPTHUMBCOMPLETED, "CThumbnailVideoProvider::NotifyVideoClipThumbCompleted;aError=%d", aError );
       
   220     
       
   221     iTimer.Cancel();
       
   222     iTimeout = EFalse;
       
   223     
       
   224     if (( aError == KErrNone ) && aThumb )
       
   225         {
       
   226         iOriginalSize = aThumb->SizeInPixels();
       
   227         }
       
   228     
       
   229     iObserver->ThumbnailProviderReady( aError, aThumb, iOriginalSize, EFalse, EFalse);
       
   230     }
       
   231 
       
   232 
       
   233 // ---------------------------------------------------------------------------
       
   234 // CThumbnailVideoProvider::NotifyVideoClipInfoReady()
       
   235 // Used to notify when information of video clip is available
       
   236 // ---------------------------------------------------------------------------
       
   237 //
       
   238 void CThumbnailVideoProvider::NotifyVideoClipInfoReady( CTNEVideoClipInfo&
       
   239     aInfo, TInt aError )
       
   240     {
       
   241     TN_DEBUG2( "CThumbnailVideoProvider::NotifyVideoClipInfoReady(aError=%d)", aError );
       
   242     OstTrace1( TRACE_NORMAL, CTHUMBNAILVIDEOPROVIDER_NOTIFYVIDEOCLIPINFOREADY, "CThumbnailVideoProvider::NotifyVideoClipInfoReady;aError=%d", aError );
       
   243     
       
   244     if ( aError == KErrNone )
       
   245         {
       
   246         TInt err( KErrNone );
       
   247 
       
   248         // cannot determine target size, aspect ratio scaling fails
       
   249         TRAP( err, aInfo.GetThumbL( *this, KBestThumbIndex, NULL, iDisplayMode, ETrue ));
       
   250   
       
   251         if ( err != KErrNone )
       
   252             {
       
   253             TN_DEBUG2( "CThumbnailVideoProvider::NotifyVideoClipInfoReady() -- GetThumbL() left with %d", err );
       
   254             OstTrace1( TRACE_NORMAL, DUP1_CTHUMBNAILVIDEOPROVIDER_NOTIFYVIDEOCLIPINFOREADY, "CThumbnailVideoProvider::NotifyVideoClipInfoReady - GetThumbL() left with;err=%d", err );
       
   255             
       
   256             iObserver->ThumbnailProviderReady( err, NULL, TSize(), EFalse, EFalse);
       
   257             
       
   258             SetActive();
       
   259             TRequestStatus* statusPtr = &iStatus;
       
   260             User::RequestComplete( statusPtr, KErrNone ); 
       
   261             }
       
   262         else
       
   263             {
       
   264             // request timeout
       
   265             iTimeout = ETrue;
       
   266             iTimer.After(iStatus, KVideoDecoderTimeout);
       
   267             SetActive();
       
   268             }
       
   269         }
       
   270     else
       
   271         {
       
   272         iObserver->ThumbnailProviderReady( aError, NULL, TSize(), EFalse, EFalse);
       
   273         
       
   274         SetActive();
       
   275         TRequestStatus* statusPtr = &iStatus;
       
   276         User::RequestComplete( statusPtr, KErrNone );
       
   277         }
       
   278     }
       
   279 
       
   280 
       
   281 // ======== GLOBAL FUNCTIONS ========
       
   282 
       
   283 // -----------------------------------------------------------------------------
       
   284 // ImplementationTable
       
   285 // Define the interface UIDs
       
   286 // -----------------------------------------------------------------------------
       
   287 //
       
   288 const TImplementationProxy ImplementationTable[] = 
       
   289     {
       
   290     IMPLEMENTATION_PROXY_ENTRY( THUMBNAIL_VIDEO_PROVIDER_IMP_UID,
       
   291         CThumbnailVideoProvider::NewL )
       
   292 };
       
   293 
       
   294 
       
   295 // -----------------------------------------------------------------------------
       
   296 // ImplementationGroupProxy
       
   297 // The one and only exported function that is the ECom entry point
       
   298 // -----------------------------------------------------------------------------
       
   299 //
       
   300 EXPORT_C const TImplementationProxy* ImplementationGroupProxy( TInt&
       
   301     aTableCount )
       
   302     {
       
   303     aTableCount = sizeof( ImplementationTable ) / sizeof( TImplementationProxy );
       
   304 
       
   305     return ImplementationTable;
       
   306     }
       
   307 
       
   308 // End of file