o developer checkin
o modified vrplayer to use threads
This commit is contained in:
@@ -0,0 +1,219 @@
|
||||
#include "ourinterface.h"
|
||||
|
||||
OurInterface::OurInterface(QObject *parent) :
|
||||
QObject(parent)
|
||||
{
|
||||
channel = NULL;
|
||||
savedGeometry.setX(0);
|
||||
savedGeometry.setY(0);
|
||||
savedGeometry.setWidth(0);
|
||||
savedGeometry.setHeight(0);
|
||||
stream_id = 101;
|
||||
demuxMedia = 0;
|
||||
//elapsedTime = 0;
|
||||
}
|
||||
|
||||
int OurInterface::oneTimeInit()
|
||||
{
|
||||
/* connect to remote client */
|
||||
if (openVirtualChannel())
|
||||
return -1;
|
||||
|
||||
/* register all formats/codecs */
|
||||
av_register_all();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void OurInterface::oneTimeDeinit()
|
||||
{
|
||||
/* clean up resources */
|
||||
closeVirtualChannel();
|
||||
}
|
||||
|
||||
void OurInterface::initRemoteClient()
|
||||
{
|
||||
int64_t start_time;
|
||||
int64_t duration;
|
||||
|
||||
//elapsedTime = 0;
|
||||
|
||||
if (sendMetadataFile())
|
||||
return;
|
||||
|
||||
if (sendVideoFormat())
|
||||
return;
|
||||
|
||||
if (sendAudioFormat())
|
||||
return;
|
||||
|
||||
if (sendGeometry(savedGeometry))
|
||||
return;
|
||||
|
||||
xrdpvr_play_media(channel, 101, filename.toAscii().data());
|
||||
|
||||
xrdpvr_get_media_duration(&start_time, &duration);
|
||||
qDebug() << "ourInterface:initRemoteClient: emit onMediaDurationInSecs: dur=" << duration;
|
||||
emit onMediaDurationInSeconds(duration);
|
||||
|
||||
/* LK_TODO this needs to be undone in deinitRemoteClient() */
|
||||
if (!demuxMedia)
|
||||
{
|
||||
demuxMedia = new DemuxMedia(NULL, &audioQueue, &videoQueue, channel, stream_id);
|
||||
demuxMediaThread = new QThread(this);
|
||||
connect(demuxMediaThread, SIGNAL(started()), demuxMedia, SLOT(startDemuxing()));
|
||||
demuxMedia->moveToThread(demuxMediaThread);
|
||||
playVideo = demuxMedia->getPlayVideoInstance();
|
||||
}
|
||||
}
|
||||
|
||||
void OurInterface::deInitRemoteClient()
|
||||
{
|
||||
/* perform clean up */
|
||||
xrdpvr_deinit_player(channel, 101);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Open a virtual connection to remote client
|
||||
*
|
||||
* @return 0 on success, -1 on failure
|
||||
******************************************************************************/
|
||||
int OurInterface::openVirtualChannel()
|
||||
{
|
||||
/* is channel already open? */
|
||||
if (channel)
|
||||
return -1;
|
||||
|
||||
/* open a virtual channel and connect to remote client */
|
||||
channel = WTSVirtualChannelOpenEx(WTS_CURRENT_SESSION, "xrdpvr", 0);
|
||||
if (channel == NULL)
|
||||
{
|
||||
|
||||
emit on_ErrorMsg("Connection failure",
|
||||
"Error connecting to remote client. Application will close now");
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int OurInterface::closeVirtualChannel()
|
||||
{
|
||||
/* channel must be opened first */
|
||||
if (!channel)
|
||||
return -1;
|
||||
|
||||
WTSVirtualChannelClose(channel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief this is a temp hack while we figure out how to set up the right
|
||||
* context for avcodec_decode_video2() on the server side; the workaround
|
||||
* is to send the first 1MB of the media file to the server end which
|
||||
* reads this file and sets up its context
|
||||
*
|
||||
* @return 0 on success, -1 on failure
|
||||
******************************************************************************/
|
||||
int OurInterface::sendMetadataFile()
|
||||
{
|
||||
if (xrdpvr_create_metadata_file(channel, filename.toAscii().data()))
|
||||
{
|
||||
emit on_ErrorMsg("I/O Error",
|
||||
"An error occurred while sending data to remote client");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int OurInterface::sendVideoFormat()
|
||||
{
|
||||
if (xrdpvr_set_video_format(channel, stream_id))
|
||||
{
|
||||
emit on_ErrorMsg("I/O Error",
|
||||
"Error sending video format to remote client");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int OurInterface::sendAudioFormat()
|
||||
{
|
||||
if (xrdpvr_set_audio_format(channel, stream_id))
|
||||
{
|
||||
emit on_ErrorMsg("I/O Error",
|
||||
"Error sending audio format to remote client");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int OurInterface::sendGeometry(QRect rect)
|
||||
{
|
||||
int rv;
|
||||
|
||||
savedGeometry.setX(rect.x());
|
||||
savedGeometry.setY(rect.y());
|
||||
savedGeometry.setWidth(rect.width());
|
||||
savedGeometry.setHeight(rect.height());
|
||||
|
||||
rv = xrdpvr_set_geometry(channel, stream_id, savedGeometry.x(),
|
||||
savedGeometry.y(), savedGeometry.width(),
|
||||
savedGeometry.height());
|
||||
|
||||
if (rv)
|
||||
{
|
||||
emit on_ErrorMsg("I/O Error",
|
||||
"Error sending screen geometry to remote client");
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void OurInterface::onGeometryChanged(int x, int y, int width, int height)
|
||||
{
|
||||
savedGeometry.setX(x);
|
||||
savedGeometry.setY(y);
|
||||
savedGeometry.setWidth(width);
|
||||
savedGeometry.setHeight(height);
|
||||
|
||||
#if 1
|
||||
qDebug() << "OurInterface:signal" <<
|
||||
"" << savedGeometry.x() <<
|
||||
"" << savedGeometry.y() <<
|
||||
"" << savedGeometry.width() <<
|
||||
"" << savedGeometry.height();
|
||||
#endif
|
||||
|
||||
qDebug() << "setting geometry:channel=" << channel;
|
||||
|
||||
if (channel)
|
||||
{
|
||||
xrdpvr_set_geometry(channel, 101, savedGeometry.x(), savedGeometry.y(),
|
||||
savedGeometry.width(), savedGeometry.height());
|
||||
}
|
||||
}
|
||||
|
||||
void OurInterface::setFilename(QString filename)
|
||||
{
|
||||
this->filename = filename;
|
||||
}
|
||||
|
||||
void OurInterface::playMedia()
|
||||
{
|
||||
demuxMediaThread->start();
|
||||
}
|
||||
|
||||
PlayVideo * OurInterface::getPlayVideoInstance()
|
||||
{
|
||||
return this->playVideo;
|
||||
}
|
||||
|
||||
void OurInterface::setVcrOp(int op)
|
||||
{
|
||||
if (demuxMedia)
|
||||
demuxMedia->setVcrOp(op);
|
||||
}
|
||||
Reference in New Issue
Block a user