v 0.27:
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:
parent
57418caa5b
commit
e8468d1ebf
@ -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;
|
||||
|
@ -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"
|
||||
|
@ -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;
|
||||
|
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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.
Loading…
Reference in New Issue
Block a user