📄 avipsnrfilter.cpp
字号:
// TTLAviWrite.cpp: implementation of the CAviPsnrFilter class.
//
//////////////////////////////////////////////////////////////////////
#include <windows.h>
#include <streams.h>
#include <initguid.h>
#include <olectl.h>
#if (1100 > _MSC_VER)
#include <olectlid.h>
#endif
#include <math.h>
#include "IPsnr.h"
#include "AviPsnrFilter.h"
#include "AviPsnrFilterUIDs.h"
#include "sourcepin.h"
#include "compedpin.h"
#include "DelegateFilter.h"
extern double diff_y,diff_u,diff_v;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CAviPsnrFilter::CAviPsnrFilter(CDelegatorFilter *pDelegateWriter,
LPUNKNOWN pUnk,
CCritSec *pLock,
HRESULT *phr):
CBaseFilter(NAME("CAviFilter"), pUnk, pLock, CLSID_AVIPSNRFilter),
m_pDelegator(pDelegateWriter)
{
}
CAviPsnrFilter::~CAviPsnrFilter()
{
}
CBasePin * CAviPsnrFilter::GetPin(int n)
{
if (n < 0)
return NULL ;
else if (n == 0)
return m_pDelegator->m_SourcePin;
else if(n == 1)
return m_pDelegator->m_CompedPin ;
else
return NULL;
}
int CAviPsnrFilter::GetPinCount()
{
return 2;
}
STDMETHODIMP CAviPsnrFilter::Stop()
{
CAutoLock cObjectLock(m_pLock);
m_pDelegator->m_bStopped = TRUE;
m_pDelegator->ReleaseAviRs();
return CBaseFilter::Stop();
}
STDMETHODIMP CAviPsnrFilter::Pause()
{
CAutoLock cObjectLock(m_pLock);
return CBaseFilter::Pause();
}
STDMETHODIMP CAviPsnrFilter::Run(REFERENCE_TIME tStart)
{
CAutoLock cObjectLock(m_pLock);
diff_y = 0;
diff_u = 0;
diff_v = 0;
return CBaseFilter::Run(tStart);
}
STDMETHODIMP CAviPsnrFilter::get_PSNR (double *pdb_Y, double *pdb_U, double *pdb_V)
{
if (diff_y<0.001)
*pdb_Y = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight) * (float) m_pDelegator->m_nSrcCount)); // luma snr for current frame
else
*pdb_Y = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight) * (float) m_pDelegator->m_nSrcCount / diff_y)); // luma snr for current frame
if (diff_u<0.001)
*pdb_U = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight/4) * (float) m_pDelegator->m_nSrcCount)); // u croma snr for current frame, 1/4 of luma samples
else
*pdb_U = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight/4) * (float) m_pDelegator->m_nSrcCount / diff_u)); // u croma snr for current frame, 1/4 of luma samples
if (diff_v<0.001)
*pdb_V = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight/4) * (float) m_pDelegator->m_nSrcCount)); // v croma snr for current frame, 1/4 of luma samples
else
*pdb_V = (float) (10 * log10 (65025 * (float) (m_pDelegator->m_nWidth*m_pDelegator->m_nHeight/4) * (float) m_pDelegator->m_nSrcCount / diff_v)); // v croma snr for current frame, 1/4 of luma samples
return S_OK;
}
STDMETHODIMP CAviPsnrFilter::get_Progress (DWORD *pdwFrame)
{
*pdwFrame = m_pDelegator->m_nSrcCount;
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -