[prev in list] [next in list] [prev in thread] [next in thread] 

List:       helix-datatype-cvs
Subject:    [Datatype-cvs] tools/symbian_mediatoolkit/tools/thumbnail
From:       rohitratri () helixcommunity ! org
Date:       2011-04-25 5:43:26
Message-ID: 201104250543.p3P5hNLa013277 () mailer ! progressive-comp ! com
[Download RAW message or body]

Update of /cvsroot/datatype/tools/symbian_mediatoolkit/tools/thumbnail
In directory cvs01.internal.helixcommunity.org:/tmp/cvs-serv25799/tools/thumbnail

Modified Files:
      Tag: hxclient_4_2_0_brizo
	mtktntoolsession.cpp mtktntoolsession.h 
Log Message:
 "Nokia submits this code under the terms of a commercial contribution agreement with \
Real Networks, and I am authorized to contribute this code under said agreement." 

Modified by
rohit.atri@nokia.com 

Reviewed by: girish.shetty@nokia.com, jgordon@real.com 

RC Id: 

Date: 20/04/2011 

Project: SymbianMmf_wm

Synopsis:  Adding Timer Utility to MTK engine and utilizing the same in thumbnail \
tool in symbian_mediatookit 

Overview:
Either the fileformat or the decoder can become unresponsive in some cases – this \
could be due to file corruption or the component’s implementation drawbacks. At the \
client level, these indefinite delays gives an illusion of ‘hanging’. Currently \
there’s no time limit for MTK to perform requested operations

Fix:
A timer utility is added. Tool clients can make use of this utility to specify \
timeout values for operation requested.

Files modified:
symbian_mediatoolkit/common/pub/mtkcmds.h
symbian_mediatoolkit/engine/mpengine.cpp
symbian_mediatoolkit/engine/pub/mpengine.h
symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.cpp
symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.h 

Note – member variable declarations are rearranged in \
symbian_mediatoolkit/engine/pub/mpengine.h for better readability.

Image Size and Heap Use impact: 

Module Release testing (STIF): Not run

Test case(s) Added: No 

Memory leak check performed: Passed, No additional leaks introduced. 

Platforms and Profiles Build Verified: helix-client-s60-52-mmf-mdf-dsp 

Platforms and Profiles Functionality verified: armv5 

Branch: 420Brizo

 Diff:
Index: common/pub/mtkcmds.h
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/common/pub/mtkcmds.h,v
retrieving revision 1.2.2.2
diff -u -w -r1.2.2.2 mtkcmds.h
--- common/pub/mtkcmds.h	19 Apr 2011 07:17:39 -0000	1.2.2.2
+++ common/pub/mtkcmds.h	25 Apr 2011 05:37:56 -0000
@@ -132,4 +132,10 @@
     virtual void EncodedPacketReady(TInt aError, CMtkMediaPkt* aPacket) = 0;
 };
 
+class MMTKTimerObserver
+    {
+public:
+    virtual void TimeOut()= 0;
+    };
+
 #endif /* NXTHUMBGENCMDS_H_ */
Index: engine/mpengine.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/engine/mpengine.cpp,v
retrieving revision 1.2.2.2
diff -u -w -r1.2.2.2 mpengine.cpp
--- engine/mpengine.cpp	19 Apr 2011 07:17:41 -0000	1.2.2.2
+++ engine/mpengine.cpp	25 Apr 2011 05:37:56 -0000
@@ -125,12 +125,16 @@
 ,m_bKeyFrameOnlyMode(ETrue)
 ,m_bNumberOfpacketsReceived(0)
 ,m_bProcessorKeyFrameSeekDone(FALSE)
+,m_pCBHandle(NULL)
+,m_pScheduler(NULL)
+,m_pTimerObserver(NULL)
 {
 
 }
 
 CMPEngine::~CMPEngine()
 {
+    StopTimeOutTimer();
     CloseSource();
     HX_DISABLE_LOGGING();
     HX_RELEASE(m_pPrefs);
@@ -545,6 +549,9 @@
         HX_DELETE(m_pMetadataHelper);
     }
 
+    HX_RELEASE(m_pScheduler);
+    HX_RELEASE(m_pCBHandle);
+        
     // Reset the engine mode
     m_eEngMode = EngineMode_Default;
 
@@ -1033,7 +1040,7 @@
     m_pObserver->EndOfEncodedPackets(ulStreamId);
     if (0 == m_bNumberOfpacketsReceived)
     {
-        MffoFatalError(KErrGeneral);            //calling error if no packets \
received (after seek request to m_pFFHandler), yet streamdone is received +        \
MffoFatalError(KErrGeneral);            //calling error if no encoded packets \
received (after seek request to m_pFFHandler), yet MffoStreamDone is received  }      \
  }
 
@@ -1285,3 +1292,127 @@
     return bRetval;
 }
 
+TInt CMPEngine::StartTimeOutTimer(TUint ulTimeOutInMS)
+    {
+    HX_RESULT retVal = HXR_FAIL;
+
+    if(m_pTimerObserver)
+        {
+        retVal = HXR_OK;
+        if(!m_pScheduler)
+            {   
+            retVal = QueryInterface(IID_IHXScheduler,(void**)&m_pScheduler);  
+            if(retVal == HXR_OK)
+                {
+                m_pCBHandle = new CMPEngine::CTimerCallback(this, m_pTimerObserver); \
 +                if(!m_pCBHandle)
+                    {
+                    retVal = HXR_OUTOFMEMORY;
+                    }
+                else
+                    {
+                    m_pCBHandle->AddRef();
+                    }
+                }
+             }
+        }
+    if(retVal == HXR_OK)
+        {
+        if (m_pCBHandle->m_hCBId)
+            {
+            // If we already have a timer callback scheduled, remove it
+            m_pScheduler->Remove(m_pCBHandle->m_hCBId);
+            }
+        m_pCBHandle->m_hCBId = m_pScheduler->RelativeEnter(m_pCBHandle, (ULONG32) \
ulTimeOutInMS);         +        }
+    return MapToPlatformError(retVal);
+    }
+
+TInt CMPEngine::StopTimeOutTimer()
+    {
+    HX_RESULT retVal = HXR_OK;
+    if(m_pScheduler && m_pCBHandle->m_hCBId)
+        {        
+        retVal = m_pScheduler->Remove(m_pCBHandle->m_hCBId);
+        m_pCBHandle->m_hCBId = 0;
+        }
+    return MapToPlatformError(retVal);
+    }
+
+/****************************************************************************
+ * 
+ *  Class:
+ *
+ *  CMPEngine::CTimerCallback
+ *
+ *  Purpose:
+ *
+ *  Scheduled by the CMPEngine class to limit waiting time for receiving decoded \
packets + *
+ */
+CMPEngine::CTimerCallback::CTimerCallback(CMPEngine* pMPEngineContext, \
MMTKTimerObserver* pTimerObserver) +    : m_lRefCount(0)
+    , m_pTimerObserver(pTimerObserver)
+    , m_pMPEngineContext(pMPEngineContext)
+    , m_hCBId(0)
+    {
+    HX_ASSERT(m_pTimerObserver);
+    HX_ASSERT(m_pMPEngineContext);    
+    m_pMPEngineContext->AddRef();
+    }
+
+
+CMPEngine::CTimerCallback::~CTimerCallback()
+    {    
+    HX_RELEASE(m_pMPEngineContext);
+    }
+
+
+/*
+ *  IHXCallback methods
+ */
+STDMETHODIMP CMPEngine::CTimerCallback::Func()
+    {
+    m_pTimerObserver->TimeOut();    
+    return HXR_OK;
+    }
+
+/*
+ *  IUnknown methods
+ */
+STDMETHODIMP CMPEngine::CTimerCallback::QueryInterface(REFIID riid, void** ppvObj)
+    {
+    if (IsEqualIID(riid, IID_IUnknown))
+        {
+        AddRef();
+        *ppvObj = (IUnknown *) this;
+        return HXR_OK;
+        }
+    else if (IsEqualIID(riid, IID_IHXCallback))
+        {
+        AddRef();
+        *ppvObj = (IHXCallback *) this;
+        return HXR_OK;
+        }
+
+    *ppvObj = NULL;
+    return HXR_NOINTERFACE;
+    }
+
+
+STDMETHODIMP_(ULONG32) CMPEngine::CTimerCallback::AddRef()
+    {
+    return InterlockedIncrement(&m_lRefCount);
+    }
+
+
+STDMETHODIMP_(ULONG32) CMPEngine::CTimerCallback::Release()
+    {
+    if (InterlockedDecrement(&m_lRefCount) > 0)
+        {
+        return m_lRefCount;
+        }
+
+    delete this;
+    return 0;
+    }
Index: engine/pub/mpengine.h
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/engine/pub/mpengine.h,v
retrieving revision 1.2.2.2
diff -u -w -r1.2.2.2 mpengine.h
--- engine/pub/mpengine.h	19 Apr 2011 07:17:42 -0000	1.2.2.2
+++ engine/pub/mpengine.h	25 Apr 2011 05:37:57 -0000
@@ -125,6 +125,16 @@
     TInt PauseStreamProcessing(TUint ulStreamId);
     TInt ResumeStreamProcessing(TUint ulStreamId, ULONG32 aStartTime);    
     
+    //Timer utility for tools
+    /*
+     * Note: Calling StartTimeOutTimer() twice without calling StopTimeOutTimer()
+     * causes the timer to forget the first request and reset itself to honour 
+     * the new request
+     */
+    TInt StartTimeOutTimer(TUint ulTimeOutInMS);
+    TInt StopTimeOutTimer();
+    void SetTimerObserver(MMTKTimerObserver* pObserver);
+    
     // static function
     static TInt MapToPlatformError(HX_RESULT status);
     
@@ -206,6 +216,33 @@
     HXBOOL AreStreamsReady();
     void CreatePrefIfNoExist(const char* pName, const char* pValue);
     
+protected:
+    class CTimerCallback : public IHXCallback
+    {
+    public:
+    CTimerCallback(CMPEngine* pMPEngineContext, MMTKTimerObserver* pTimerObserver);
+    ~CTimerCallback();
+    /*
+     *  IHXCallback methods
+     */
+    STDMETHOD(Func)     (THIS);
+        
+    /*
+     *  IUnknown methods
+     */
+    STDMETHOD(QueryInterface)   (THIS_ REFIID riid, void** ppvObj);
+    STDMETHOD_(ULONG32,AddRef)  (THIS);
+    STDMETHOD_(ULONG32,Release) (THIS);
+    
+    public:
+    CallbackHandle  m_hCBId;
+
+    private:
+    TInt                    m_lRefCount;
+    MMTKTimerObserver*      m_pTimerObserver;
+    CMPEngine*              m_pMPEngineContext;
+    };
+    
 
 protected:
     CHXLitePrefs*           m_pPrefs;
@@ -215,25 +252,34 @@
     CMPFFHandler*           m_pFFHandler;    
     SymbianTLCContext*      m_pTLCContext;
     CMPVideoProcessor**     m_pArrStreamProcessor;   
+    IHXScheduler*           m_pScheduler;
+    CTimerCallback*         m_pCBHandle;
+    MMTKTimerObserver*      m_pTimerObserver;
+    CMTKMetadataHelper*     m_pMetadataHelper;
+    MMTKClientObserver*     m_pObserver;
+    CHXString               m_strInstallDrive;
 
     UINT32                  m_ulRefCount;
+    UINT32                  m_ulSeekTime;
+    UINT32                  m_ulDuration;
+    
     HX_RESULT               m_LastError;
+    
     HXBOOL                  m_bFFHandlerStartPending;
     HXBOOL                  m_bInitialized;
     HXBOOL                  m_bProcessorKeyFrameSeekDone;
-    UINT32                  m_ulSeekTime;
-    UINT32                  m_ulDuration;
+            
     eEngineMode             m_eEngMode;
     TBool                   m_bKeyFrameOnlyMode;
     TUint                   m_bNumberOfpacketsReceived;    
    
-    CMTKMetadataHelper* m_pMetadataHelper;
-
-    MMTKClientObserver* m_pObserver;
-    
-    CHXString m_strInstallDrive;
 };
 
+void inline CMPEngine::SetTimerObserver(MMTKTimerObserver* pObserver)
+    {
+    m_pTimerObserver = pObserver;
+    }
+
 #endif // End of #ifdef _CMPENGINE_H_
 
 
Index: tools/thumbnail/mtktntoolsession.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.cpp,v
 retrieving revision 1.1.2.2
diff -u -w -r1.1.2.2 mtktntoolsession.cpp
--- tools/thumbnail/mtktntoolsession.cpp	19 Apr 2011 07:17:47 -0000	1.1.2.2
+++ tools/thumbnail/mtktntoolsession.cpp	25 Apr 2011 05:37:57 -0000
@@ -54,6 +54,8 @@
 #include "mtkmetadatahelper.h"
 #include "mtklog.h"
 
+#define KThumbReqTimeOutInMS 20*1000 //20 secs
+
 
 CMtkThumbnailToolSession::CMtkThumbnailToolSession()
 :m_ulStartTime(0)
@@ -64,6 +66,7 @@
 ,m_bIsEnginePrepared(NULL)
 ,m_bIsInClientPause(EFalse)
 ,m_pPacketQ (NULL)
+,m_bTimeOutTimerActive(EFalse)
 {
     
 }
@@ -86,6 +89,7 @@
         m_pOwner = pOwner;
         m_pMPEngine = pMPEngine;
         lRetval = m_pMPEngine->Init(this);
+        m_pMPEngine->SetTimerObserver(this);
     }
     MTK_LOG("MTK:SESS ThumbSess[%x]::Init() lRetval:%d\n", this, lRetval);
     return lRetval;
@@ -95,6 +99,12 @@
 {
     MTK_LOG("MTK:SESS ThumbSess[%x]::Close() 11\n", this);
 
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
+
     if(m_pPacketQ != NULL)
     {
         m_pPacketQ->CleanupFreeList();
@@ -148,11 +158,18 @@
     case MtkCmd_SyncPause:
         {
             m_bIsInClientPause = ETrue;
+            if(m_bTimeOutTimerActive)
+                {
+                m_bTimeOutTimerActive = EFalse;
+                m_pMPEngine->StopTimeOutTimer();
+                }
             m_pMPEngine->Pause();
             break;
         }
     case MtkCmd_SyncResume:
         {
+            lRetval = m_pMPEngine->StartTimeOutTimer(KThumbReqTimeOutInMS);
+            m_bTimeOutTimerActive = ETrue;
             m_bIsInClientPause = EFalse;
             m_pMPEngine->Resume();
             break;
@@ -223,6 +240,12 @@
     TInt lRetval = KErrGeneral;
     TUint32 ulPktTS= aPacket->Timestamp();
 
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
+
     if( !m_msgEndOfDecodedStream.IsNull())
     {
         m_pPacketQ->Enqueue((TAny*) aPacket);
@@ -268,6 +291,11 @@
 void CMtkThumbnailToolSession::EndOfDecodedPackets()
 {
     MTK_LOG("MTK:SESS ThumbSess[%x]::EndOfDecodedPackets()", this);
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
     if (!m_msgEndOfDecodedStream.IsNull())
     {
         m_msgEndOfDecodedStream.Complete(KErrNone);
@@ -378,7 +406,22 @@
             m_ulSeekTime = aPositionInMsec;
             lRetval = m_pMPEngine->Start(m_ulSeekTime);
         }
+        if(lRetval == KErrNone)
+            {
+            lRetval = m_pMPEngine->StartTimeOutTimer(KThumbReqTimeOutInMS);
+            m_bTimeOutTimerActive = ETrue; 
+            }
     }
     MTK_LOG("MTK:SESS ThumbSess[%x]::HandleStart() lRetval:%d", this, lRetval);
     return lRetval;
 }
+
+void CMtkThumbnailToolSession::TimeOut()
+    {
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->Stop();
+        FatalError(KErrTimedOut);
+        }
+    }
Index: tools/thumbnail/mtktntoolsession.h
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.h,v
 retrieving revision 1.1.2.2
diff -u -w -r1.1.2.2 mtktntoolsession.h
--- tools/thumbnail/mtktntoolsession.h	19 Apr 2011 07:17:47 -0000	1.1.2.2
+++ tools/thumbnail/mtktntoolsession.h	25 Apr 2011 05:37:57 -0000
@@ -60,6 +60,7 @@
 :public CMTKToolSessionHandler
 ,public MQWriterObserver
 ,public MMTKClientObserver
+,public MMTKTimerObserver
 {
 public:
     CMtkThumbnailToolSession();
@@ -80,6 +81,9 @@
     virtual void DecodedPacketReady(TInt aError, CMtkMediaPkt* aPacket);
     virtual void EncodedPacketReady(TInt aError, CMtkMediaPkt* aPacket);
 
+    //MMTKTimerObserver
+    virtual void TimeOut();
+
 protected:
     TInt PrepareEngine();
     TInt HandleOpenMediaSource(const RMessage2& mesg);
@@ -104,6 +108,7 @@
 
     TBool              m_bIsEnginePrepared;
     TBool              m_bIsInClientPause;
+    TBool              m_bTimeOutTimerActive;
 };
 
 #endif // End of #ifndef _MTKATTOOLSESSION_H_


Index: mtktntoolsession.h
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.h,v
 retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -d -r1.1.2.2 -r1.1.2.3
--- mtktntoolsession.h	19 Apr 2011 07:17:47 -0000	1.1.2.2
+++ mtktntoolsession.h	25 Apr 2011 05:43:23 -0000	1.1.2.3
@@ -60,6 +60,7 @@
 :public CMTKToolSessionHandler
 ,public MQWriterObserver
 ,public MMTKClientObserver
+,public MMTKTimerObserver
 {
 public:
     CMtkThumbnailToolSession();
@@ -79,6 +80,9 @@
     virtual void EndOfDecodedPackets();
     virtual void DecodedPacketReady(TInt aError, CMtkMediaPkt* aPacket);
     virtual void EncodedPacketReady(TInt aError, CMtkMediaPkt* aPacket);
+    
+    //MMTKTimerObserver
+    virtual void TimeOut();
 
 protected:
     TInt PrepareEngine();
@@ -104,6 +108,7 @@
 
     TBool              m_bIsEnginePrepared;
     TBool              m_bIsInClientPause;
+    TBool              m_bTimeOutTimerActive;
 };
 
 #endif // End of #ifndef _MTKATTOOLSESSION_H_

Index: mtktntoolsession.cpp
===================================================================
RCS file: /cvsroot/datatype/tools/symbian_mediatoolkit/tools/thumbnail/mtktntoolsession.cpp,v
 retrieving revision 1.1.2.2
retrieving revision 1.1.2.3
diff -u -d -r1.1.2.2 -r1.1.2.3
--- mtktntoolsession.cpp	19 Apr 2011 07:17:47 -0000	1.1.2.2
+++ mtktntoolsession.cpp	25 Apr 2011 05:43:23 -0000	1.1.2.3
@@ -54,6 +54,8 @@
 #include "mtkmetadatahelper.h"
 #include "mtklog.h"
 
+#define KThumbReqTimeOutInMS 20*1000 //20 secs
+
 
 CMtkThumbnailToolSession::CMtkThumbnailToolSession()
 :m_ulStartTime(0)
@@ -64,6 +66,7 @@
 ,m_bIsEnginePrepared(NULL)
 ,m_bIsInClientPause(EFalse)
 ,m_pPacketQ (NULL)
+,m_bTimeOutTimerActive(EFalse)
 {
     
 }
@@ -86,6 +89,7 @@
         m_pOwner = pOwner;
         m_pMPEngine = pMPEngine;
         lRetval = m_pMPEngine->Init(this);
+        m_pMPEngine->SetTimerObserver(this);
     }
     MTK_LOG("MTK:SESS ThumbSess[%x]::Init() lRetval:%d\n", this, lRetval);
     return lRetval;
@@ -94,6 +98,12 @@
 void CMtkThumbnailToolSession::Close()
 {
     MTK_LOG("MTK:SESS ThumbSess[%x]::Close() 11\n", this);
+    
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
 
     if(m_pPacketQ != NULL)
     {
@@ -148,11 +158,18 @@
     case MtkCmd_SyncPause:
         {
             m_bIsInClientPause = ETrue;
+            if(m_bTimeOutTimerActive)
+                {
+                m_bTimeOutTimerActive = EFalse;
+                m_pMPEngine->StopTimeOutTimer();
+                }
             m_pMPEngine->Pause();
             break;
         }
     case MtkCmd_SyncResume:
         {
+            lRetval = m_pMPEngine->StartTimeOutTimer(KThumbReqTimeOutInMS);
+            m_bTimeOutTimerActive = ETrue;
             m_bIsInClientPause = EFalse;
             m_pMPEngine->Resume();
             break;
@@ -222,6 +239,12 @@
 {
     TInt lRetval = KErrGeneral;
     TUint32 ulPktTS= aPacket->Timestamp();
+    
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
 
     if( !m_msgEndOfDecodedStream.IsNull())
     {
@@ -268,6 +291,11 @@
 void CMtkThumbnailToolSession::EndOfDecodedPackets()
 {
     MTK_LOG("MTK:SESS ThumbSess[%x]::EndOfDecodedPackets()", this);
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->StopTimeOutTimer();
+        }
     if (!m_msgEndOfDecodedStream.IsNull())
     {
         m_msgEndOfDecodedStream.Complete(KErrNone);
@@ -378,7 +406,22 @@
             m_ulSeekTime = aPositionInMsec;
             lRetval = m_pMPEngine->Start(m_ulSeekTime);
         }
+        if(lRetval == KErrNone)
+            {
+            lRetval = m_pMPEngine->StartTimeOutTimer(KThumbReqTimeOutInMS);
+            m_bTimeOutTimerActive = ETrue; 
+            }
     }
     MTK_LOG("MTK:SESS ThumbSess[%x]::HandleStart() lRetval:%d", this, lRetval);
     return lRetval;
 }
+
+void CMtkThumbnailToolSession::TimeOut()
+    {
+    if(m_bTimeOutTimerActive)
+        {
+        m_bTimeOutTimerActive = EFalse;
+        m_pMPEngine->Stop();
+        FatalError(KErrTimedOut);
+        }
+    }


_______________________________________________
Datatype-cvs mailing list
Datatype-cvs@helixcommunity.org
http://lists.helixcommunity.org/mailman/listinfo/datatype-cvs


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic