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

📄 fframeextractfilter_op.cpp

📁 SAMSUNG S3C6410 CPU BSP for winmobile6
💻 CPP
字号:
//------------------------------------------------------------------------------
// File: fFrameExtractFilter_op.cpp
//
// Desc: implement CFrameExtractFilterStream class
//
// Author : JiyoungShin(idon.shin@samsung.com)
//
// Copyright 2007 Samsung System LSI, All rights reserved.
//------------------------------------------------------------------------------
#include "stdafx.h"
#include "fFrameExtractFilter.h"
#include "fFrameExtractFilter_op.h"

//
// Constructor
//
CFrameExtractFilterStream::CFrameExtractFilterStream(HRESULT *phr, CFrameExtractFilter *pParent, LPCWSTR pPinName)
	: CSourceStream(NAME("CFrameExtractFilterStream"), phr, pParent, pPinName)
{
    CAutoLock cAutoLock(m_pFilter->pStateLock());
}


//
// Destructor
//
CFrameExtractFilterStream::~CFrameExtractFilterStream()
{
}


//
// GetMediaType
//
HRESULT CFrameExtractFilterStream::GetMediaType(CMediaType *pMediaType)
{
	CAutoLock lock(m_pFilter->pStateLock());

	ZeroMemory(pMediaType, sizeof(CMediaType));

	*pMediaType = ((CFrameExtractFilter *)m_pFilter)->m_mt;

	return S_OK;
}

//
// DecideBufferSize
//
HRESULT CFrameExtractFilterStream::DecideBufferSize(IMemAllocator *pMemAlloc, ALLOCATOR_PROPERTIES *pProperties)
{
	CAutoLock cAutoLock(m_pFilter->pStateLock());
	ASSERT(pMemAlloc);
	ASSERT(pProperties);

	HRESULT hr;

	pProperties->cbBuffer = 256*1024;	// 256 KB
	pProperties->cBuffers = 3;
	pProperties->cbAlign  = 1;
	pProperties->cbPrefix = 0;


	// Ask the allocator to reserve us some sample memory, NOTE the function
	// can succeed (that is return NOERROR) but still not have allocated the
	// memory that we requested, so we must check we got whatever we wanted

	ALLOCATOR_PROPERTIES Actual;
	hr = pMemAlloc->SetProperties(pProperties, &Actual);
	if (FAILED(hr)) 
	{
		return hr;
	}

	// Is this allocator unsuitable
	if (Actual.cbBuffer < pProperties->cbBuffer) 
	{
		return E_FAIL;
	}

	return S_OK;
}


//
// FillBuffer
//
HRESULT CFrameExtractFilterStream::FillBuffer(IMediaSample *pSample)
{
	static INT32	m_FrameTime, m_FrameTimePrev, m_FrameTimeTotal;
	static INT32	m_FrameCounter = 0;
	static INT32	m_FrameSyncCounter = 0;
	INT32			fps;

	CAutoLock lock(m_pFilter->pStateLock());

	HRESULT hr;
	BYTE *pBuffer;
	long lSize;
	int nRead = 0;

	// Get the pointer for output buffer
	hr = pSample->GetPointer(&pBuffer);
	if (FAILED(hr))
		return S_FALSE;

	// Get the size of input sample
	lSize = pSample->GetSize();

	CFrameExtractFilter *pFilter = (CFrameExtractFilter *)m_pFilter;
	if ((nRead = pFilter->GetNextFrame(pBuffer, (unsigned int *) &lSize)) <= 0)
		return S_FALSE;
	
	pSample->SetActualDataLength(nRead);

	if(m_FrameCounter == 0){
		m_FrameTimeTotal = 0;
		m_FrameTimePrev = GetTickCount();
	}
	else{
		m_FrameTime = GetTickCount();
		m_FrameTimeTotal += m_FrameTime - m_FrameTimePrev;
		m_FrameTimePrev = m_FrameTime;
	}



	if(m_FrameCounter >= 100){
		fps = m_FrameTimeTotal/m_FrameCounter;
		printf("AvgFps per 100 frames : %d FPS\n",1000/fps);
		m_FrameTimeTotal = 0;
		m_FrameCounter = 0;
	}

	REFERENCE_TIME m_rtFrameLength = UNITS/5;
	REFERENCE_TIME rtStart = m_FrameSyncCounter*m_rtFrameLength;
	REFERENCE_TIME rtStop = rtStart + m_rtFrameLength;

	//pSample->SetTime(&rtStart, &rtStop);
	//pSample->SetSyncPoint(TRUE);

	m_FrameCounter++;
	m_FrameSyncCounter++;
	
	return S_OK;
}



HRESULT CFrameExtractFilterStream::Stop(void)
{
	CFrameExtractFilter *pFilter = (CFrameExtractFilter *)m_pFilter;

//	pFilter->CloseFile();

	return CSourceStream::Stop();
}

//
// OnThreadCreate
//
HRESULT CFrameExtractFilterStream::OnThreadCreate(void)
{
	RETAILMSG(1, (L"[FrameExtractFilter] OnThreadCreate\n"));

	return CSourceStream::OnThreadCreate();
}


//
// OnThreadDestroy
//
HRESULT CFrameExtractFilterStream::OnThreadDestroy(void)
{
	RETAILMSG(1, (L"[FrameExtractFilter] OnThreadDestroy\n"));

	return CSourceStream::OnThreadDestroy();
}


//
// OnThreadStartPlay
//
HRESULT CFrameExtractFilterStream::OnThreadStartPlay(void)
{
	RETAILMSG(1, (L"[FrameExtractFilter] OnThreadStartPlay\n"));

	return CSourceStream::OnThreadStartPlay();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -