⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 avipsnrfilter.cpp

📁 对比两个AVI文件的psnr值的VC源代码
💻 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 + -