[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