1
0
Tweaked code so both high and low bit rate clips run fast. Significant performance improvement for high bit rate clips. Now works fast also when time stamp correction is disabled.
Time stamp correction is disabled by default.


git-svn-id: svn://svn.code.sf.net/p/qsdecoder/code/trunk/IntelQuickSyncDecoder@39 dfccccb7-dd81-40b7-a334-5a7ba89c2b1d
This commit is contained in:
egur 2012-02-13 18:36:24 +00:00
parent 57418caa5b
commit e8468d1ebf
7 changed files with 28 additions and 22 deletions

View File

@ -29,7 +29,7 @@
#pragma once
#define QS_DEC_DLL_NAME "IntelQuickSyncDecoder.dll"
#define QS_DEC_VERSION "v0.26 Beta"
#define QS_DEC_VERSION "v0.27 Beta"
// Forward declarations
struct IDirect3DDeviceManager9;

View File

@ -14,8 +14,8 @@ LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,26,0,0
PRODUCTVERSION 0,26,0,0
FILEVERSION 0,27,0,0
PRODUCTVERSION 0,27,0,0
FILEFLAGSMASK 0x17L
#ifdef _DEBUG
FILEFLAGS 0x1L
@ -32,13 +32,13 @@ BEGIN
BEGIN
VALUE "CompanyName", "Intel Corp."
VALUE "FileDescription", "IntelQuickSyncDecoder DLL"
VALUE "FileVersion", "0.26 Beta"
VALUE "FileVersion", "0.27 Beta"
VALUE "InternalName", "IntelQuickSyncDecoder"
VALUE "LegalCopyright", "BSD lisence. © 2012 Intel ® Corp. By Eric Gur"
VALUE "LegalTrademarks", "Intel QuickSync"
VALUE "OriginalFilename", "IntelQuickSyncDecoder.dll"
VALUE "ProductName", "IntelQuickSyncDecoder"
VALUE "ProductVersion", "0.26 Beta"
VALUE "ProductVersion", "0.27 Beta"
END
END
BLOCK "VarFileInfo"

View File

@ -47,7 +47,8 @@ EXTERN_GUID(WMMEDIASUBTYPE_WMV3,
DEFINE_GUID(WMMEDIASUBTYPE_WVC1_PDVD,
0xD979F77B, 0xDBEA, 0x4BF6, 0x9E, 0x6D, 0x1D, 0x7E, 0x57, 0xFB, 0xAD, 0x53);
#define QUEUE_LENGTH 2
#define DECODE_QUEUE_LENGTH 8
#define PROCESS_QUEUE_LENGTH 2
////////////////////////////////////////////////////////////////////
// CQuickSync
@ -62,9 +63,9 @@ CQuickSync::CQuickSync() :
m_bDvdDecoding(false),
m_hProcessorWorkerThread(NULL),
m_ProcessorWorkerThreadId(0),
m_DecodedFramesQueue(QUEUE_LENGTH),
m_ProcessedFramesQueue(QUEUE_LENGTH),
m_FreeFramesPool(QUEUE_LENGTH)
m_DecodedFramesQueue(DECODE_QUEUE_LENGTH),
m_ProcessedFramesQueue(PROCESS_QUEUE_LENGTH),
m_FreeFramesPool(PROCESS_QUEUE_LENGTH)
{
MSDK_TRACE("QSDcoder: Constructor\n");
@ -80,7 +81,7 @@ CQuickSync::CQuickSync() :
m_Config.bMod16Width = false;
// m_Config.bTimeStampCorrection = true;
m_Config.nOutputQueueLength = (m_Config.bTimeStampCorrection) ? 8 : 0;
m_Config.nOutputQueueLength = 16;
m_Config.bEnableH264 = true;
m_Config.bEnableMPEG2 = true;
m_Config.bEnableVC1 = true;
@ -96,6 +97,7 @@ CQuickSync::CQuickSync() :
// Currently not working well - menu decoding :(
//m_Config.bEnableDvdDecoding = true;
m_pDecoder->SetAuxFramesCount(m_Config.nOutputQueueLength + DECODE_QUEUE_LENGTH);
m_OK = (sts == MFX_ERR_NONE);
}
@ -1119,7 +1121,7 @@ HRESULT CQuickSync::ProcessDecodedFrame(mfxFrameSurface1* pSurface)
PushSurface(pSurface);
// Not enough surfaces for proper time stamp correction
size_t queueSize = (m_bDvdDecoding || !m_Config.bTimeStampCorrection) ? 0 : m_Config.nOutputQueueLength;
size_t queueSize = (m_bDvdDecoding) ? 0 : m_Config.nOutputQueueLength;
if (m_pDecoder->OutputQueueSize() < queueSize)
{
return S_OK;

View File

@ -62,6 +62,7 @@ CQuickSyncDecoder::CQuickSyncDecoder(mfxStatus& sts) :
m_pFrameSurfaces(NULL),
m_nRequiredFramesNum(0),
m_nLastSurfaceId(0),
m_nAuxFrameCount(0),
m_pRendererD3dDeviceManager(NULL),
m_pD3dDeviceManager(NULL),
m_pD3dDevice(NULL),
@ -183,7 +184,7 @@ mfxStatus CQuickSyncDecoder::InitFrameAllocator(mfxVideoParam* pVideoParams, mfx
MSDK_IGNORE_MFX_STS(sts, MFX_WRN_PARTIAL_ACCELERATION);
MSDK_IGNORE_MFX_STS(sts, MFX_WRN_INCOMPATIBLE_VIDEO_PARAM);
MSDK_CHECK_RESULT_P_RET(sts, MFX_ERR_NONE);
allocRequest.NumFrameSuggested = (mfxU16)m_Config.nOutputQueueLength + allocRequest.NumFrameSuggested + 1;
allocRequest.NumFrameSuggested = (mfxU16)m_nAuxFrameCount + allocRequest.NumFrameSuggested;
allocRequest.NumFrameMin = allocRequest.NumFrameSuggested;
// Decide memory type

View File

@ -163,6 +163,11 @@ public:
m_AsyncDecodeInfo.lock.Wait(INFINITE);
}
void SetAuxFramesCount(size_t count)
{
m_nAuxFrameCount = (mfxU16)count;
}
protected:
mfxStatus InternalReset(mfxVideoParam* pVideoParams, mfxU32 nPitch, bool bInited);
mfxFrameSurface1* FindFreeSurface();
@ -195,6 +200,7 @@ protected:
mfxU16 m_nRequiredFramesNum;
int m_nLastSurfaceId;
bool m_bUseD3DAlloc;
mfxU16 m_nAuxFrameCount;
// D3D/DXVA interfaces
IDirect3DDeviceManager9* m_pRendererD3dDeviceManager;

View File

@ -100,21 +100,18 @@ private:
class CQsEvent
{
public:
CQsEvent(bool bSignaled = true, bool bManual = true) : m_bManual(bManual)
CQsEvent(bool bSignaled = true, bool bManual = true)
{
m_hEvent = CreateEvent(NULL, (BOOL)bManual, (BOOL)bSignaled, NULL);
m_bLocked = (m_bManual) ? !bSignaled : true /* auto is always locked */;
}
__forceinline void Lock()
{
ResetEvent(m_hEvent);
m_bLocked = true;
}
__forceinline void Unlock()
{
SetEvent(m_hEvent);
m_bLocked = !m_bManual;
}
bool Wait(DWORD dwMilliseconds = INFINITE)
@ -126,8 +123,6 @@ public:
private:
HANDLE m_hEvent;
const bool m_bManual;
bool m_bLocked;
};
// Locks a critical section, and unlocks it automatically
@ -196,17 +191,19 @@ public:
CQsAutoLock lock(this);
}
bool PushBack(const T& item, DWORD dwMiliSecs)
inline bool PushBack(const T& item, DWORD dwMiliSecs)
{
if (dwMiliSecs > 0 && !WaitForCapacity(dwMiliSecs))
return false; // timeout
{
CQsAutoLock lock(this);
++m_Size;
// Not empty anymore
m_NotEmptyEvent.Unlock();
if (m_Size++ == 0)
{
m_NotEmptyEvent.Unlock();
}
m_Queue.push_back(item);
// Out of capacity

Binary file not shown.