📄 mddemo.cpp
字号:
*/
bool Dsclass::IsPlayOver()
{
return !(mddemo->playThread->running());
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::startDisplay()
{
if(!(mddemo->bDisplayOpen))
{
mddemo->bDisplayOpen = 1;
sem_post(&(mddemo->beginSem));
usleep(USLEEPTIME);
OutputDebugString("Start the showing port %d\n", mddemo->SignPort);
}
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::stopDisplay()
{
if(mddemo->bDisplayOpen)
{
mddemo->bDisplayOpen = 0;
if(app)
{
app->unlock();
}
sem_post(&(mddemo->displaySem));
pthread_mutex_lock(&(mddemo->DisplayPrepare));
pthread_mutex_unlock(&(mddemo->DisplayPrepare));
OutputDebugString("Close the showing port %d\n", mddemo->SignPort);
if(app)
{
app->lock();
}
}
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::startDisplayThread()
{
mddemo->bDisplayThreadRun = 1;
mddemo->displayThread->start();
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::stopDisplayThread()
{
if(mddemo->bDisplayThreadRun)
{
stopDisplay();
mddemo->bDisplayThreadRun = 0;
sem_post(&(mddemo->beginSem));
usleep(USLEEPTIME);
}
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::stopPlayOverThread()
{
sem_post(&(mddemo->FileEndSem));
usleep(USLEEPTIME);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
Dsclass::~Dsclass()
{
stopDisplayThread();
if(mddemo->playType == DECODEFILE)
stopPlayOverThread();
OutputDebugString("in port %d, before playThread wait\n", mddemo->SignPort);
mddemo->playThread->wait();
sem_destroy(&(mddemo->FileEndSem));
delete mddemo->playThread;
OutputDebugString("in port %d, before displayThread wait\n", mddemo->SignPort);
mddemo->displayThread->wait();
delete mddemo->displayThread;
pthread_mutex_destroy(&(mddemo->DisplayPrepare));
sem_destroy(&(mddemo->beginSem));
sem_destroy(&(mddemo->displaySem));
sem_destroy(&(mddemo->changesem));
free(mddemo);
mddemo = NULL;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::StopPlay()
{
stopDisplay();
if(mddemo->playType == DECODEFILE)
{
stopPlayOverThread();
mddemo->playThread->wait();
/*
* mddemo->bDisplayOpen = 0;
*/
mddemo->playType = NODECODE;
HW_Stop(mddemo->ChannelHandle);
HW_CloseFile(mddemo->ChannelHandle);
}
else if(mddemo->playType == DECODESTREAM)
{
/*
* mddemo->bDisplayOpen = 0;
*/
mddemo->playType = NODECODE;
HW_Stop(mddemo->ChannelHandle);
HW_CloseStream(mddemo->ChannelHandle);
MP4_ClientStopCapture(mddemo->clienthandle);
OutputDebugString("&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&\n");
if(MP4_ClientStop(mddemo->clienthandle) == -1)
OutputErrorString("<demo_info> Client Stop error 0x%x\n", MP4_ClientGetLastErrorNum());
OutputDebugString("In function StopPlay, now the ChannelHandle is %d\n",
mddemo->ChannelHandle);
mddemo->clienthandle = -1;
}
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::StartFilePlay()
{
char* filename = mddemo->filename;
OutputDebugString(filename);
if(HW_OpenFile(mddemo->ChannelHandle, filename) < 0)
{
OutputErrorString("<demo_info> the md card open file failed, for 0x%x!\n", GetLastErrorNum());
return;
}
OutputErrorString("<demo_info> the md channel%2d open file ok!\n", mddemo->ChannelHandle);
if(HW_Play(mddemo->ChannelHandle) < 0)
OutputErrorString("<demo_info> play the file failed! error code 0x%x!\n", GetLastErrorNum());
else
{
OutputDebugString("<demo_info> play the file ok,the file end sem is 0x%px!\n",
&(mddemo->FileEndSem));
HW_SetFileEndMsg(mddemo->ChannelHandle, &(mddemo->FileEndSem));
mddemo->playThread->start();
sem_post(&(mddemo->beginSem));
}
mddemo->datasum = 0;
mddemo->playType = DECODEFILE;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::StartStreamPlay(char* pFileHead, int nHeadSize)
{
if(HW_OpenStream(mddemo->ChannelHandle, pFileHead, nHeadSize) < 0)
{
OutputErrorString("<demo_info> open stream failed for decode!\n");
return;
}
OutputDebugString("<demo_info> open stream successful for decode!\n");
if(HW_Play(mddemo->ChannelHandle) < 0)
OutputErrorString("<demo_info>in decode stream, play failed!\n");
sem_post(&(mddemo->beginSem));
mddemo->playType = DECODESTREAM;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetdstRect(const int chan)
{
int SignPort = mddemo->SignPort;
if(chan < 2)
{
OutputErrorString("<demo_info> chan setting error \n");
return;
}
(mddemo->dstRect).x = (SignPort % chan) * (WIN_W / chan);
(mddemo->dstRect).y = (SignPort / chan) * (WIN_H / chan);
(mddemo->dstRect).w = WIN_W / chan;
(mddemo->dstRect).h = WIN_H / chan;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -