xrdp/vrplayer/ourinterface.cpp

218 lines
5.1 KiB
C++
Raw Normal View History

#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 0
qDebug() << "OurInterface:signal" <<
"" << savedGeometry.x() <<
"" << savedGeometry.y() <<
"" << savedGeometry.width() <<
"" << savedGeometry.height();
#endif
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);
}