观察者模式
2011年12月19日
class JPDecoder : public ISDD_Decoder
{
public:
JPDecoder();
virtual ~JPDecoder();
public:
//实现ISDD_Decoder接口
virtual bool Init();
virtual void Fini();
virtual void Release();
virtual void Reflesh();//刷新窗体
//流操作
virtual bool Open(void * argument, long size, long pool);
virtual void Close();
virtual bool InputData(void * buffer, unsigned long size, unsigned long type);
//控制
virtual bool StartPlay(HWND hwnd);
virtual bool StartPlay(HWND hwnd, PlaybackRecordCallback lpcbPlayback, char *pContext);
virtual void StopPlay();
virtual void Slow();
virtual void Fast();
virtual void Normal();
virtual void Pause();
virtual void Resume();
virtual void Jump(int post);
virtual void Snap(const char * pFilePath, PictureFormat ePictureFormat);
virtual int Vendor();
public:
//属性
void Vendor(int value); //设置厂商类型
void* GetFrameRatePara();//获取帧率回调参数
PlaybackRecordCallback m_pFrameProgress;//帧率回调
FrameRate* GetFrameStruct();
void SetFrameRateCallback(void *pPara);
static DWORD WINAPI GetTimeThread(void *pPara);
protected:
long m_jpNumber; //金鹏SDK函数里面的Number
HWND m_hPlayWnd; //播放窗口句柄
int m_vendor; //厂商类型
void *m_pContext;//设置帧率回调指针
FrameRate m_FrameRate;//帧率结构
friend class JPDecoderFactory;
};
DECLARE_DECODER_MODULE()
#endif
#include "jpdecoder.h"
#include "Ice_Entity.h"
#include
#include
// 金鹏DVRSDK头文件
#include "JPPlayApi.h"
/************************************************************************/
static std::vector *s_JPDecoderVec=NULL;//所有解码器对象
static bool s_bTimerRuning= false;//线程状态
static HANDLE s_hTimerThread= NULL;//时间线程
static DWORD s_dwThreadId= 0;//新线程Id
static CRITICAL_SECTION s_Section;//临界区对象
static BOOL s_bJPInit= FALSE; //是否已经初始化了
//金鹏SDK初始化操作
static BOOL JP_Init();
//金鹏SDK清理操作
static void JP_Fini();
//金鹏解码器创建操作
static ISDD_Decoder* JP_Create();
BEGIN_DECODER_MODULE()
DC_INIT(JP_Init)
DC_FINI(JP_Fini)
DC_CREATE(JP_Create)
END_DECODER_MODULE()
/************************************************************************/
static BOOL JP_Init()
{
s_bJPInit= TRUE;
s_bTimerRuning= true;
s_JPDecoderVec= new std::vector;
InitializeCriticalSection(&s_Section);
s_hTimerThread= CreateThread(NULL, 0, JPDecoder::GetTimeThread, NULL, 0, &s_dwThreadId);
return s_bJPInit;
}
static void JP_Fini()
{
//停止线程
s_bTimerRuning= false;
if(s_hTimerThread!=NULL)
{
WaitForSingleObject(s_hTimerThread, INFINITE);
CloseHandle(s_hTimerThread);
s_hTimerThread= NULL;
}
////浪费大量CPU时间
//while(true)
//{
// DWORD dwExitCode= STILL_ACTIVE;
// // 判断线程的退出代码前要求线程对象还没有退出
// ::GetExitCodeThread(s_hTimerThread, &dwExitCode);
// if( dwExitCode != STILL_ACTIVE)
// {
// break;
// }
//}
DeleteCriticalSection(&s_Section);
//释放对象
for( std::vector::iterator it=s_JPDecoderVec->begin(); it!= s_JPDecoderVec->end(); ++it)
{
JPDecoder *pDecoder= dynamic_cast(*it);
if( pDecoder!=NULL)
{
pDecoder->m_pFrameProgress= NULL;
delete pDecoder;
pDecoder= NULL;
}
}
s_JPDecoderVec->clear();
delete s_JPDecoderVec;
s_JPDecoderVec= NULL;
}
static ISDD_Decoder* JP_Create()
{
JPDecoder *newDecoder= NULL;
if (!s_bJPInit)
{
return NULL;
}
newDecoder= new JPDecoder;
newDecoder->Vendor(cameraType_JP);
s_JPDecoderVec->push_back(newDecoder);
return newDecoder;
}
/************************************************************************/
JPDecoder::JPDecoder()
: m_hPlayWnd(NULL),
m_jpNumber(-1),
m_pFrameProgress(NULL),
m_pContext(NULL)
{
memset(&m_FrameRate, 0, sizeof(m_FrameRate));
}
JPDecoder::~JPDecoder()
{
}
void* JPDecoder::GetFrameRatePara()
{
return m_pContext;
}
FrameRate* JPDecoder::GetFrameStruct()
{
return &m_FrameRate;
}
bool JPDecoder::Init()
{
BOOL bRet= FALSE;
bRet= Player_InitialDirectDraw();
return (TRUE==bRet ) ;
}
void JPDecoder::Fini()
{
Player_ReleaseDirectDraw();
}
int JPDecoder::Vendor()
{
return m_vendor;
}
void JPDecoder::Vendor(int value)
{
m_vendor= value;
}
bool JPDecoder::Open(void * argument, long size, long pool)
{
if (TRUE != Player_OpenStreamEx(m_jpNumber, STREAMFILEMODE, 0))
{
return false;
}
// if (TRUE != Player_SetStreamOpenMode(m_jpNumber, STREAMFILEMODE))
// {
// return false;
// }
return true;
}
void JPDecoder::Close()
{
Player_CloseStream(m_jpNumber);
}
void JPDecoder::Release()
{
/*
由于换成了全局对象,要在Fini中释放
delete this;
*/
}
bool JPDecoder::InputData(void * buffer, unsigned long size, unsigned long type)
{
BOOL bRet= FALSE;
bRet= Player_InputData(m_jpNumber, (PBYTE)buffer, size) ;
return (TRUE==bRet);
}
bool JPDecoder::StartPlay(HWND hwnd)
{
BOOL bRet= FALSE;
bRet= Player_Play(m_jpNumber, hwnd) ;
if (bRet)
{
m_hPlayWnd= hwnd;
}
else
{
m_hPlayWnd= NULL;
}
return (TRUE==bRet);
}
bool JPDecoder::StartPlay(HWND hwnd, PlaybackRecordCallback lpcbPlayback, char *pContext)
{
//设置回调函数和回调函数参数
m_pFrameProgress= lpcbPlayback;
m_pContext= pContext;
BOOL bRet= FALSE;
bRet= Player_Play(m_jpNumber, hwnd);
if (bRet)
{
m_hPlayWnd= hwnd;
}
else
{
m_hPlayWnd= NULL;
}
return (TRUE==bRet);
}
void JPDecoder::StopPlay()
{
Player_Stop(m_jpNumber);
}
void JPDecoder::Reflesh()
{
Player_Refresh(m_jpNumber);
}
void JPDecoder::Slow()
{
Player_Slow(m_jpNumber);
}
void JPDecoder::Fast()
{
Player_Fast(m_jpNumber);
}
void JPDecoder::Normal()
{
if (m_hPlayWnd != NULL)
{
Player_Play(m_jpNumber, m_hPlayWnd);
}
}
void JPDecoder::Pause()
{
Player_Pause(m_jpNumber);
}
void JPDecoder::Resume()
{
Player_Play(m_jpNumber, m_hPlayWnd);
}
void JPDecoder::Jump(int pos)
{
}
void JPDecoder::Snap(const char * pFilePath, PictureFormat ePictureFormat)
{
char szFileName[256]= {0};
int nImgType= (int)ePictureFormat;
if( PF_JPG==nImgType )
{
sprintf(szFileName, "%s", pFilePath);
}
else if( PF_BMP==nImgType )
{
sprintf(szFileName, "%s", pFilePath);
}
Player_SnapPicture(m_jpNumber, szFileName );
}
/************************************************************************/
DWORD WINAPI JPDecoder::GetTimeThread(void *pPara)
{
while(s_bTimerRuning)
{
EnterCriticalSection(&s_Section);
Sleep(500);
for( std::vector::iterator it=s_JPDecoderVec->begin(); it!= s_JPDecoderVec->end(); ++it)
{
JPDecoder *pDecoder= dynamic_cast(*it);
if( pDecoder!=NULL)
{
pDecoder->SetFrameRateCallback(pDecoder);
}
}
LeaveCriticalSection(&s_Section);
}
return 0;
}
void JPDecoder::SetFrameRateCallback(void *pPara)
{
JPDecoder *pDecoder= (JPDecoder*)(pPara) ;
if(pDecoder==NULL)
{
return;
}
long lNumber= pDecoder->m_jpNumber;
static unsigned long lRenderTime= Player_GetPlayedTime(lNumber);
unsigned long lTimeStamp= Player_GetPlayedTime(lNumber)-lRenderTime;
unsigned long lFrameRate= Player_GetPlayedFrames(lNumber);
/*
static long lCircleCount= 0;
CString str;
lCircleCount++;
str.AppendFormat(L"%ld",ulFrameRate);
if( 0==(lCircleCount%20) )
OutputDebugString(str+ LPCTSTR("\n"));
else
OutputDebugString(str+ LPCTSTR(";"));
*/
if ( pDecoder->m_pFrameProgress!=NULL )
{
pDecoder->m_pFrameProgress( (char*)pDecoder->GetFrameRatePara(), lFrameRate ,lTimeStamp);
}
}
发表评论
-
HTML DOM架构研究
2012-01-20 10:12 544HTML DOM架构研究 2010年07 ... -
抠出淘宝的菜单树
2012-01-20 10:11 572抠出淘宝的菜单树 2010年08月17日 淘宝登陆用户的 ... -
再谈Iframe的问题
2012-01-20 10:11 554再谈Iframe的问题 2010年1 ... -
http中的request和session的关系。
2012-01-20 10:11 663http中的request和session的关系。 2010 ... -
今天继续完善自己写的跨域iframe自适应高
2012-01-20 10:11 676今天继续完善自己写的 ... -
大班下学期计划
2012-01-19 15:12 675大班下学期计划 2011年01月28日 大班下学期计划 ... -
大班下学期家长会发言稿
2012-01-19 15:12 1024大班下学期家长会发言 ... -
下学期个人工作计划
2012-01-19 15:12 648下学期个人工作计划 2010年06月26日 ... -
大班德育工作计划11
2012-01-19 15:12 720大班德育工作计划11 2011年02月18日 大班下学期 ... -
大班下学期家长会流程
2012-01-19 15:12 1367大班下学期家长会流程 2011年03月07日 家长会流程 ... -
请列出你在从事DBA生涯中,最难以忘怀的一次误操作(1)
2012-01-17 04:59 569请列出你在从事DBA生涯中,最难以忘怀的一次误操作(1) 2 ... -
javabook
2012-01-17 04:59 701javabook 2010年07月09日 ... -
(转) How To Ask Questions The Smart Way 提问的智慧
2012-01-17 04:59 546(转) How To Ask Questions The ... -
perl 经典入门(2)
2012-01-17 04:59 737perl 经典入门(2) 2010年06 ... -
flex连接数据库总结
2012-01-16 03:50 647flex连接数据库总结 2010年01月11日 首先,做 ... -
43个热门Flex和ActionScript 3.0 APIs,技巧和工具
2012-01-16 03:50 55143个热门Flex和ActionScript 3.0 APIs ... -
【转载】[东华艺宗]网页游戏开发之Flex SDK 4命名空间
2012-01-16 03:50 596【转载】[东华艺宗]网页游戏开发之Flex SDK 4命名空间 ... -
Flex超酷皮肤主题推荐
2012-01-16 03:50 1690Flex超酷皮肤主题推荐 2009年07月29日 当程序 ... -
FLEX 做的不错的网站
2012-01-16 03:50 670FLEX 做的不错的网站 200 ...
相关推荐
Qt设计模式之观察者模式
采用Java语言编写的一个观察者模式实例。观察者模式(有时又被称为模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件,...
java观察者模式观察者模式java观察者模式观察者模式java观察者模式观察者模式
观察者模式及实例,适合初学者阅读 。。。。。。。。。。。。。。。
观察者模式(有时又被称为发布(publish )-订阅(Subscribe)模式、模型-视图(View)模式、源-收听者(Listener)模式或从属者模式)是软件设计模式的一种。在此种模式中,一个目标物件管理所有相依于它的观察者物件...
Java 观察者模式的浅析 简单地说,观察者模式定义了一个一对多的依赖关系,让一个或多个观察者对象监察一个主题对象。这样一个主题对象在状态上的变化能够通知所有的依赖于此对象的那些观察者对象,使这些观察者...
观察者模式
java 设计模式 观察者模式 简单实例 包括测试test类
观察者模式:对象之间多对一依赖的一种设计方案,被依赖的对象为Subject,依赖的对象为Observer,Subject通知Observer变化,这个例子是java内置观察者模式
设计模式之观察者模式Java版本实现和UML类设计图
设计模式-观察者模式(讲解及其实现代码)
设计模式--观察者模式java例子
运用观察者模式及MVC模式的整合,是javaWeb的简单的实现了选民投票
观察者模式Demo,设计模式,观察者模式
观察者模式使用
iOS 设计模式 观察者模式
观察者模式小型框架
56丨观察者模式(上):详解各种应用场景下观察者模式的不同实现方式1
面向对象23种设计模式之观察者模式,简单明了。面向对象23种设计模式之观察者模式,简单明了。