📄 mddemo.cpp
字号:
#include "mddemo.h"
#include <qapplication.h>
extern QApplication* app;
#define USLEEPTIME (20 * 1000)
/*
=======================================================================================================================
*
=======================================================================================================================
*/
QPlayOverThread::QPlayOverThread(MDDEMO* demo) :
mdOver(demo)
{
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void QPlayOverThread::run()
{
OutputDebugString("<demo_info> .............. in play over for port %d!\n", mdOver->SignPort);
sem_wait(&(mdOver->FileEndSem));
mdOver->bDisplayOpen = 0; /* to stop the display */
sem_post(&(mdOver->displaySem));
pthread_mutex_lock(&(mdOver->DisplayPrepare));
pthread_mutex_unlock(&(mdOver->DisplayPrepare));
HW_Stop(mdOver->ChannelHandle);
HW_CloseFile(mdOver->ChannelHandle);
mdOver->bDisplayOpen = 0;
mdOver->playType = 0;
OutputDebugString("<demo_info> in play over thread, close file port: %d!\n", mdOver->SignPort);
/* here should add some code for paint the port map */
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
QDisplayThread::QDisplayThread(MDDEMO* demo, SDL_Surface* display)
{
mdPlay = demo;
pOverlayScreen = display;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void QDisplayThread::run()
{
UINT useSyncSem = 1;
unsigned long int WSize = 0;
unsigned long int HSize = 0;
int i;
while(1)
{
OutputDebugString("before sem_wait beginSem in Displaythread \n");
sem_wait(&(mdPlay->beginSem));
if(!(mdPlay->bDisplayThreadRun))
break;
pthread_mutex_lock(&(mdPlay->DisplayPrepare));
memset(&(mdPlay->displayconf), 0x0, sizeof(PREVIEWCONFIG));
/* 以下赋值有没有必要 */
(mdPlay->displayconf).w = (mdPlay->dstRect).w;
(mdPlay->displayconf).h = (mdPlay->dstRect).h;
(mdPlay->displayconf).SyncSem = &(mdPlay->displaySem);
/*
* OutputDebugString("<demo_info> .............. start display for port %d!\n", mdPlay->SignPort);
* *OutputDebugString("<demo_info>w,h,ChangeSem %ld,%ld,%p\n",
* (mdPlay->displayconf).w , (mdPlay->displayconf).h, (mdPlay->displayconf).ChangeSem);
*/
if(HW_StartDecVgaDisplay(mdPlay->ChannelHandle, &(mdPlay->displayconf), useSyncSem) < 0)
{
OutputErrorString("<demo_info> start video display (port %d) failed, for 0x%x\n",
mdPlay->SignPort, GetLastErrorNum());
goto DISPLAYEXIT;
}
mdPlay->bDisplayOpen = 1;
if(!(mdPlay->OverLayPrepare))
{
mdPlay->pOverLay[0] = SDL_CreateYUVOverlay(352 / 2, 288 / 2, SDL_YV12_OVERLAY,
pOverlayScreen);
mdPlay->pOverLay[1] = SDL_CreateYUVOverlay(352, 288, SDL_YV12_OVERLAY, pOverlayScreen);
mdPlay->pOverLay[2] = SDL_CreateYUVOverlay(352 * 2, 288, SDL_YV12_OVERLAY,
pOverlayScreen);
mdPlay->pOverLay[3] = SDL_CreateYUVOverlay(352 * 3 / 2, 288 * 4 / 3, SDL_YV12_OVERLAY,
pOverlayScreen);
mdPlay->pOverLay[4] = SDL_CreateYUVOverlay(352 * 2, 288 * 2, SDL_YV12_OVERLAY,
pOverlayScreen);
if(!(mdPlay->pOverLay[0] && mdPlay->pOverLay[1] && mdPlay->pOverLay[2] &&
mdPlay->pOverLay[3] && mdPlay->pOverLay[4]))
{
OutputErrorString("port %d the SDL overlay surface create failed!\n",
mdPlay->SignPort);
goto DISPLAYEXIT;
}
mdPlay->OverLayPrepare = 1;
}
while(mdPlay->bDisplayOpen)
{
usleep(USLEEPTIME);
if(sem_wait(&(mdPlay->displaySem)) == 0)
/*
* everytime mdPlay->displaySem discreases, for it has been added in function ;
* HW_StartDecVgaDisplay, so when the data coming , it will be add to 1
*/
{
if((WSize != (mdPlay->displayconf).w) || (HSize != (mdPlay->displayconf).h))
{
WSize = (mdPlay->displayconf).w;
HSize = (mdPlay->displayconf).h;
if(!(WSize > 0 && HSize > 0))
OutputErrorString("WSize and HSize stand error\n");
for(i = 0; i < 5; i++)
{
if(((int)WSize == (mdPlay->pOverLay[i])->w) &&
((int)HSize == (mdPlay->pOverLay[i])->h))
{
mdPlay->pOverlaySurface = mdPlay->pOverLay[i];
OutputDebugString("Port/OverlayPort/WSize/HSize = %d, %d, %ld, %ld\n",
mdPlay->SignPort, i, WSize, HSize);
break;
}
}
}
if(app)
{
app->lock();
}
SDL_LockYUVOverlay(mdPlay->pOverlaySurface);
memcpy(*((mdPlay->pOverlaySurface)->pixels), (mdPlay->displayconf).dataAddr,
(mdPlay->displayconf).imageSize);
SDL_UnlockYUVOverlay(mdPlay->pOverlaySurface);
SDL_DisplayYUVOverlay(mdPlay->pOverlaySurface, &(mdPlay->dstRect));
OutputDebugString("222222222222222222222222222\n");
if(app)
{
app->unlock();
}
}
}
OutputDebugString("after sem_wait displaySem in Displaythread here ChannelNum%2d \n",
mdPlay->ChannelHandle);
if(HW_StopDecChanVgaDisplay(mdPlay->ChannelHandle) < 0) /* here mdPlay->displaySem discreases */
{
OutputErrorString("<demo_info> stop the video display failed!error: 0x%x!\n",
GetLastErrorNum());
goto DISPLAYEXIT;
}
WSize = 0; /* 因为每次重新display画面的时候要关闭pOverlaySurface, 所以WSize 和 HSize 必须重新置为0 */
HSize = 0;
OutputDebugString("<demo_info>........................... stop display for port%d!\n",
mdPlay->SignPort);
mdPlay->pOverlaySurface = NULL;
pthread_mutex_unlock(&(mdPlay->DisplayPrepare));
}
DISPLAYEXIT:
OutputDebugString("<demo_info> exit the video display thread for chan%d!\n", mdPlay->SignPort);
for(i = 0; i < 4; i++)
{
if(mdPlay->pOverLay[i])
SDL_FreeYUVOverlay(mdPlay->pOverLay[i]);
mdPlay->pOverLay[i] = NULL;
mdPlay->OverLayPrepare = 0;
}
/*
* sem_destroy(&(mdPlay->displaySem));
*/
return;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
Dsclass::Dsclass(int port, int ChannelHandle, SDL_Surface* Screen)
{
pOverlayScreen = Screen;
mddemo = (MDDEMO*)malloc(sizeof(MDDEMO));
memset(mddemo, 0x0, sizeof(MDDEMO));
mddemo->SignPort = port;
mddemo->ChannelHandle = ChannelHandle;
mddemo->clienthandle = -1;
pthread_mutex_init(&(mddemo->DisplayPrepare), NULL);
sem_init(&(mddemo->beginSem), 0, 0);
sem_init(&(mddemo->displaySem), 0, 0);
sem_init(&(mddemo->FileEndSem), 0, 0);
sem_init(&(mddemo->changesem), 0, 0);
(mddemo->displayconf).SyncSem = &(mddemo->displaySem);
(mddemo->displayconf).ChangeSem = &(mddemo->changesem);
OutputDebugString("******port, SyncSem, ChangeSem %d, %p,%p\n", port,
(mddemo->displayconf).SyncSem, (mddemo->displayconf).ChangeSem);
mddemo->serverchan = 0;
sprintf(mddemo->serverip, "%d.%d.%d.%d", address[0], address[1], address[2], address[3]);
mddemo->playThread = new QPlayOverThread(mddemo);
mddemo->displayThread = new QDisplayThread(mddemo, pOverlayScreen);
}
/*
=======================================================================================================================
*
=======================================================================================================================
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -