📄 qsdlwidget.cpp
字号:
#include <qdatetime.h>
#include <qtimer.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include "interfun.h"
#include "QSDLWidget.h"
extern void *_XLockMutex_fn;
extern void *_XUnlockMutex_fn;
extern void *_XCreateMutex_fn;
extern void *_XFreeMutex_fn;
extern void *_XInitDisplayLock_fn;
extern void *_XFreeDisplayLock_fn;
extern void *_Xthread_self_fn;
QSDLWidget::QSDLWidget(QWidget* parent, const char* name)
: QWidget( parent, name, 0)
{
SelectPort = 0;
sameSetting = 0;
fullArea = 0;
RunStream = 0; // 这个标志的作用是看是否有流媒体在运行
RunVideoOut = 0; // 这个标志的作用是看是否有VideoOut在运行
playSoundPort = -1;
#ifdef RAWSTREAM
rawFile = new QFile("./displayimagefile.yuv");
rawFile->open(IO_ReadWrite | IO_Truncate );
imagebuf = (unsigned char *)malloc(704*576*3/2 * sizeof(unsigned char));
memset(imagebuf, 0x0, 704*576*3/2 * sizeof(unsigned char));
#endif
#ifdef CIRCLE
pthread_mutex_init (&mutex,NULL);
#endif
}
void QSDLWidget::SetEnv()
{
int i, tempHandle;
int displayChannelCount;
int totalcard;
SDL_Surface *pOverlayScreen;
char SDL_windowhack[32];
QsStruct QsTemp;
QsTemp.qsclass = this;
QsTemp.pmf = &QSDLWidget::ReadDataCallBack;
#ifdef RAWSTREAM
QsTemp.ImageStreamCallbackpmf = &QSDLWidget::ImageStreamCallback;
#endif
SetsQstruct(&QsTemp);
if( !XInitThreads() ) // support multi-threads
OutputErrorString("X init error!\n");
sprintf(SDL_windowhack, "SDL_WINDOWID=%ld", winId());
OutputDebugString("%ld \n", winId());
putenv(SDL_windowhack);
putenv("SDL_VIDEO_YUV_HWACCEL=0");
OutputDebugString("Init the sdl...\n");
if(SDL_Init(SDL_INIT_VIDEO) < 0)
{
OutputErrorString("<sdk_error> init sdl failed!%s\n",SDL_GetError());
exit(0);
}
pOverlayScreen = SDL_SetVideoMode(WIN_W, WIN_H, 0, SDL_HWSURFACE); // here it is freed by SDL_Quit();
if(pOverlayScreen == NULL)
{
OutputErrorString("<sdk_error> create the sdl screen failed! for %s!\n", SDL_GetError());
SDL_Quit();
exit(0);
}
HW_InitDecDevice(&totalport);
totalcard = GetTotalDSPs();
OutputDebugString("total dsps = %d, total ports = %ld, Display Channel = %d\n", totalcard, totalport, GetDisplayChannelCount());
mddemoclass = (Dsclass **)malloc(totalport * sizeof(Dsclass *));
memset(mddemoclass, 0x0, totalport * sizeof(Dsclass *));
for(i=0; i<totalport; i++)
{
if(HW_ChannelOpen(i, &tempHandle)<0)
{
OutputErrorString("<demo_info> Open the decode channle failed!\n");
HW_ReleaseDecDevice();
}
else
{
mddemoclass[i] = new Dsclass(i, tempHandle, pOverlayScreen);
mddemoclass[i]->SetdstRect( GetChanNum() );
mddemoclass[i]->startDisplayThread();
}
}
displayChannelCount = GetDisplayChannelCount();
for(i=0; i<displayChannelCount; i++)
SetDisplayStandard(i, StandardPAL);
#ifdef RAWSTREAM
RegisterDisplayVideoCaptureCallback((IMAGE_STREAM_CALLBACK) InterImageStream, NULL);
#endif
timer = (QTimer **)malloc(totalport *sizeof(QTimer *));
time = (QTime **)malloc( totalport *sizeof(QTime *));
for (i = 0; i<totalport; i++ )
{
char temp[3];
sprintf(temp, "%2d", i);
temp[3] = '\0';
timer[i] = new QTimer(this, temp);
connect (timer[i], SIGNAL( timeout() ), SLOT(process_time()));
time[i] = new QTime();
time[i]->start();
}
}
void QSDLWidget::process_time()
{
int temp;
int Nowport = 0;
int timepassed;
int bitRate;
unsigned long framerate;
unsigned long totalDecFrame;
for (temp = 0; temp < totalport; temp++)
{
QTimer* Qtemp = (QTimer*)(this->sender());
if( atoi(Qtemp->name()) == temp)
{
Nowport = temp;
break;
}
}
timepassed = time[Nowport]->elapsed(); // ms
bitRate =(int)(((RetMDDEMO(Nowport)->datasum)*8)/((float)timepassed/1000));
emit BitRateChange(Nowport,bitRate);
HW_GetCurrentFrameRate(RetMDDEMO(Nowport)->ChannelHandle, &framerate);
emit RateChange(Nowport,framerate);
HW_GetPlayedFrames(RetMDDEMO(Nowport)->ChannelHandle, &totalDecFrame);
emit FrameChange(Nowport,totalDecFrame);
if ( mddemoclass[Nowport]->IsPlayOver() && (
!bitRate && !framerate))
{
erase(RetMDDEMO(Nowport)->dstRect.x, RetMDDEMO(Nowport)->dstRect.y,
RetMDDEMO(Nowport)->dstRect.w, RetMDDEMO(Nowport)->dstRect.h);
timer[Nowport]->stop();
#ifdef CIRCLE
usleep(1000);
pthread_mutex_lock (&mutex);
SelectPort = Nowport;
FileOpen(FileName);
pthread_mutex_unlock(&mutex);
#endif
}
}
long int QSDLWidget::RetTotalPort()
{
return totalport;
}
void QSDLWidget::SameSetting()
{
sameSetting = !sameSetting;
}
void QSDLWidget::ImageStreamCallback(unsigned int displayNum, void* context)
{
#ifdef RAWSTREAM
if (displayNum == 1)
{
rawFile->writeBlock((char *)imagebuf, 704*576*3/2);
OutputDebugString("have write stream into it\n");
}
#endif
}
void QSDLWidget::mousePressEvent ( QMouseEvent * e )
{
int i;
if(fullArea)
return;
QPoint pnt = e->pos();
if (e->button() == Qt::LeftButton)
{
for(i = 0; i< totalport; i++)
{
if(PtInRect( RetMDDEMO(i)->dstRect, pnt.x(), pnt.y()))
{
SelectPort = i;
break;
}
}
if (i == totalport)
return;
emit portchanged(SelectPort);
emit playStatus(RetMDDEMO(SelectPort)->playType);
//emit
emit BitRateChange(SelectPort, 0);
emit RateChange(SelectPort, 0);
emit FrameChange(SelectPort, 0);
}
}
void QSDLWidget::mouseDoubleClickEvent ( QMouseEvent * e )
{
int temp;
QPoint pnt = e->pos();
int chan = GetChanNum();
if (!fullArea)
{
int i;
for(i = 0; i< totalport; i++)
{
if(PtInRect(RetMDDEMO(i)->dstRect, pnt.x(), pnt.y()))
break;
}
if (i == totalport) return;
}
if ( e->button() == Qt::LeftButton )
{
if ( RetMDDEMO(SelectPort)-> bDisplayOpen )
{
if (!fullArea)
{
for(temp = 0; temp < totalport; temp++)
{
if( RetMDDEMO(temp)-> bDisplayOpen && RetMDDEMO(temp)->playType )
mddemoclass[temp]->stopDisplay();
}
//OutputErrorString("@@@@stop Display not or yes\n");
(RetMDDEMO(SelectPort)->dstRect).x = 0;
(RetMDDEMO(SelectPort)->dstRect).y = 0;
(RetMDDEMO(SelectPort)->dstRect).w = WIN_W;
(RetMDDEMO(SelectPort)->dstRect).h = WIN_H;
// 必须保证同步,即打开startDisplay的时候必须保证已经关闭了stopDisplay.
mddemoclass[SelectPort]->startDisplay();
fullArea = 1;
}
else
{
mddemoclass[SelectPort]->stopDisplay();
mddemoclass[SelectPort]->SetdstRect(chan);
erase();
for (temp = 0; temp < totalport; temp++)
{
if ( RetMDDEMO(temp)->playType && !(RetMDDEMO(temp)-> bDisplayOpen))
{
mddemoclass[temp]->startDisplay();
}
}
fullArea = 0;
}
}
}
}
char* QSDLWidget::RetIP()
{
return RetMDDEMO(SelectPort)->serverip;
}
int QSDLWidget::RetChan()
{
return RetMDDEMO(SelectPort)->serverchan;
}
char* QSDLWidget::RetFilePosition()
{
return RetMDDEMO(SelectPort)->filename;
}
int QSDLWidget::RetSoundPort()
{
return playSoundPort;
}
int QSDLWidget::PlaySound()
{
int ret = -1;
if(playSoundPort == SelectPort)
return 0;
if( playSoundPort == -1)
{
ret = HW_PlaySound(RetMDDEMO(SelectPort)->ChannelHandle);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
ret = HW_SetVolume(RetMDDEMO(SelectPort)->ChannelHandle, 0xffff);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
ret = HW_SetAudioPreview(RetMDDEMO(SelectPort)->ChannelHandle, 1);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
playSoundPort = SelectPort;
return 0;
}
ret = HW_SetAudioPreview(RetMDDEMO(playSoundPort)->ChannelHandle, 0);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
HW_StopSound(RetMDDEMO(playSoundPort)->ChannelHandle);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
HW_PlaySound(RetMDDEMO(SelectPort)->ChannelHandle);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
HW_SetAudioPreview(RetMDDEMO(SelectPort)->ChannelHandle, 1);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
playSoundPort = SelectPort;
return 0;
}
int QSDLWidget::StopSound()
{
int ret = -1;
ret = HW_SetAudioPreview(RetMDDEMO(playSoundPort)->ChannelHandle, 0);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
ret = HW_StopSound(RetMDDEMO(playSoundPort)->ChannelHandle);
if(ret < 0)
{
fprintf(stderr, "sorry, SetAudioPreview failed\n");
return -1;
}
playSoundPort = -1;
return 0;
}
void QSDLWidget::StringtoChar(const QString &aFile, char *cstr)
{
int m = aFile.length();
QChar da;
int k;
for(k = 0; k < m; k++)
{
da = aFile.at(k);
cstr[k] = da.latin1();
}
cstr[m] = '\0';
}
void QSDLWidget::IPChange(const QString &ipaddress)
{
int k;
if( sameSetting )
{
for(k=0; k<totalport; k++)
{
StringtoChar(ipaddress, RetMDDEMO(k)->serverip);
OutputDebugString( RetMDDEMO(k)->serverip );
OutputDebugString("\n");
}
}
else
{
StringtoChar(ipaddress, RetMDDEMO(SelectPort)->serverip);
OutputDebugString( RetMDDEMO(SelectPort)->serverip );
OutputDebugString("\n");
}
}
void QSDLWidget::ServerChanSet(int chan)
{
int k;
if( sameSetting )
{
for(k=0; k<totalport; k++)
{
RetMDDEMO(k)->serverchan = chan;
OutputDebugString("Channel %2d Change Serverchan to %d\n", k, RetMDDEMO(k)->serverchan);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -