📄 dsdemo.cpp
字号:
#include <SDL/SDL.h>
#include "exvideo.h"
#include "dsdemo.h"
#include <qapplication.h>
extern QApplication* app;
#define USLEEPTIME (20 * 1000)
/*
=======================================================================================================================
*
=======================================================================================================================
*/
Dsclass::Dsclass(int port, int ChannelHandle, SDL_Surface* Screen)
{
pOverlayScreen = Screen;
logoptr = NULL;
SignPort = port;
dsdemo = (DSDEMO*)malloc(sizeof(DSDEMO));
memset(dsdemo, 0, sizeof(DSDEMO));
dsdemo->maskRect = (RECT*)malloc(5 * sizeof(RECT));
memset(dsdemo->maskRect, 0, 5 * sizeof(RECT));
sem_init(&(dsdemo->previewSem), 0, 0);
dsdemo->previewconf.SyncSem = &(dsdemo->previewSem);
logoptr = (unsigned char*)malloc(128 * 128 * 2);
memset(logoptr, 0x0, 128 * 128 * 2 * sizeof(unsigned char));
pthread_mutex_init(&(dsdemo->major_start), NULL);
pthread_mutex_init(&(dsdemo->minor_start), NULL);
pthread_mutex_init(&(dsdemo->imagefile_fd_start), NULL);
dsdemo->ChannelHandle = ChannelHandle;
GetVideoPara(dsdemo->ChannelHandle, &(dsdemo->videostandard), &((dsdemo->v_info).Brightness),
&((dsdemo->v_info).Contrast), &((dsdemo->v_info).Saturation),
&((dsdemo->v_info).Hue));
memcpy(&(dsdemo->videoDefault), &(dsdemo->v_info), sizeof(video_info));
GetCardInfo();
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetMotion(const int chan)
{
dsdemo->motion_list.RectLeft = (SignPort % chan) * (WIN_W / chan);
dsdemo->motion_list.RectTop = (SignPort / chan) * (WIN_H / chan);
dsdemo->motion_list.RectRight = (SignPort % chan + 1) * (WIN_W / chan);
dsdemo->motion_list.RectBottom = (SignPort / chan + 1) * (WIN_H / chan);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::MotionEnable()
{
dsdemo->motion_rect.RectLeft = 0;
dsdemo->motion_rect.RectTop = 0;
dsdemo->motion_rect.RectRight = 704 - 1;
dsdemo->motion_rect.RectBottom = GetVideoHeight() - 1;
if(SetupMotionDetection(dsdemo->ChannelHandle, &(dsdemo->motion_rect), 1) < 0)
OutputErrorString("<demo_info> setup motion detect(port %d) failed\n", SignPort);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetupMotion()
{
OutputDebugString("in Dsclass::SetupMotion function\n");
AdjustMotionDetectPrecision(dsdemo->ChannelHandle, dsdemo->motionSens, 2, 0);
StartMotionDetection(dsdemo->ChannelHandle);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::DestoryMotion()
{
StopMotionDetection(dsdemo->ChannelHandle);
memset(dsdemo->motion_data, 0, sizeof(dsdemo->motion_data));
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetdstRect(const int chan)
{
if(chan < 2)
{
OutputErrorString("<demo_info> chan setting error \n");
return;
}
(dsdemo->dstRect).x = (SignPort % chan) * (WIN_W / chan);
(dsdemo->dstRect).y = (SignPort / chan) * (WIN_H / chan);
(dsdemo->dstRect).w = WIN_W / chan;
(dsdemo->dstRect).h = WIN_H / chan;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetEncoderByFlag()
{
Frame_info* infoFrame = &(dsdemo->frameinfo);
SetIBPMode(dsdemo->ChannelHandle, infoFrame->KeyFrameIntervals, infoFrame->BFrames,
infoFrame->PFrames, infoFrame->FrameRate);
SetDefaultQuant(dsdemo->ChannelHandle, infoFrame->IQuantVal, infoFrame->PQuantVal,
infoFrame->BQuantVal);
SetEncoderPictureFormat(dsdemo->ChannelHandle, dsdemo->pictureFormat);
if(dsdemo->cifqcif_flag)
{
SetupSubChannel(dsdemo->ChannelHandle, 1);
SetIBPMode(dsdemo->ChannelHandle, infoFrame->KeyFrameIntervals, infoFrame->BFrames,
infoFrame->PFrames, infoFrame->FrameRate);
SetDefaultQuant(dsdemo->ChannelHandle, infoFrame->IQuantVal, infoFrame->PQuantVal,
infoFrame->BQuantVal);
SetSubEncoderPictureFormat(dsdemo->ChannelHandle, dsdemo->subpictureFormat);
SetupSubChannel(dsdemo->ChannelHandle, 0);
}
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetMaxBpsMode()
{
int MaxBps = dsdemo->MaxBps;
BitrateControlType_t brc = dsdemo->brc;
SetupBitrateControl(dsdemo->ChannelHandle, MaxBps);
SetBitrateControlMode(dsdemo->ChannelHandle, brc);
SetupSubChannel(dsdemo->ChannelHandle, 1);
SetupBitrateControl(dsdemo->ChannelHandle, MaxBps);
SetBitrateControlMode(dsdemo->ChannelHandle, brc);
SetupSubChannel(dsdemo->ChannelHandle, 0);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetOsddemo()
{
unsigned short Translucent = (dsdemo->osdinfo).Translucent;
int Brightness = (dsdemo->osdinfo).Brightness;
int PosX = (dsdemo->osdinfo).PosX;
int PosY = (dsdemo->osdinfo).PosY;
unsigned short* p[2];
unsigned short format1[] = { PosX, PosY, '办', '公', '点', '\0' };
unsigned short format2[] =
{
PosX + 64,
PosY,
_OSD_YEAR4,
'-',
_OSD_MONTH2,
'-',
_OSD_DAY,
' ',
_OSD_HOUR24,
':',
_OSD_MINUTE,
':',
_OSD_SECOND,
'\0'
};
p[0] = format1;
p[1] = format2;
SetOsdDisplayModeEx(dsdemo->ChannelHandle, Brightness, Translucent, 0x2020000, 2, p);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::SetDsLogo()
{
int Translucent = (dsdemo->logoinfo).Translucent;
int PosX = (dsdemo->logoinfo).PosX;
int PosY = (dsdemo->logoinfo).PosY;
int logo_w, logo_h;
if(LoadYUVFromBmpFile("logo.bmp", logoptr, 128 * 128 * 2, &logo_w, &logo_h) < 0)
{
OutputErrorString("<demo_info> load bmp file error! error code is 0x%x!\n",
GetLastErrorNum());
return;
}
if(dsdemo->videostandard == StandardNTSC)
{
if(SetLogo(dsdemo->ChannelHandle, PosX, PosY, logo_w, logo_h, logoptr) == 0)
OutputErrorString("<demo_info> set the logo ok! chan%d\n", SignPort);
else
{
OutputErrorString("<demo_info> set the logo failed!chan%d,w*h: %d*%d,error:0x%x\n",
SignPort, logo_w, logo_h, GetLastErrorNum());
}
}
else
{
if(SetLogo(dsdemo->ChannelHandle, PosX, PosY, logo_w, logo_h, logoptr) == 0)
OutputErrorString("<demo_info> set the logo ok! chan%d\n", SignPort);
else
{
OutputErrorString("<demo_info> set the logo failed!chan%d,w*h: %d*%d,error:0x%x\n",
SignPort, logo_w, logo_h, GetLastErrorNum());
}
}
SetLogoDisplayMode(dsdemo->ChannelHandle, 0xff, 0x0, 0x0, Translucent, 0);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void Dsclass::GetCardInfo()
{
int j;
unsigned int boardtype;
char serialno[20], serialno_str[20];
GetBoardInfo(dsdemo->ChannelHandle, &boardtype, serialno);
for(j = 0; j < 12; j++)
{
serialno_str[j] = serialno[j] + 0x30;
}
serialno_str[j] = '\0';
OutputDebugString("card[%d]'s serialno = %s\n", SignPort, serialno_str);
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
int Dsclass::GetVideoHeight()
{
if(dsdemo->videostandard == StandardNTSC)
return 480;
else
return 576;
}
/*
=======================================================================================================================
*
=======================================================================================================================
*/
void* Dsclass::videopreview()
{
while(dsdemo->bPreviewThreadRun)
{
dsdemo->bPreviewThreadRun = 2;
usleep(USLEEPTIME);
if(!(dsdemo->bPreviewOpen))
continue;
if(sem_wait(dsdemo->previewconf.SyncSem) == 0)
{
if(app)
{
app->lock();
}
SDL_LockYUVOverlay(dsdemo->pOverlaySurface);
memcpy(*((dsdemo->pOverlaySurface)->pixels), dsdemo->previewconf.dataAddr,
dsdemo->previewconf.imageSize);
SDL_UnlockYUVOverlay(dsdemo->pOverlaySurface);
SDL_DisplayYUVOverlay(dsdemo->pOverlaySurface, &(dsdemo->dstRect));
if(app)
{
app->unlock();
}
}
else
{
usleep(USLEEPTIME);
}
}
OutputDebugString(">>>>exit thread %d exit<<<<<<< \n", SignPort);
}
/*
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -