summaryrefslogtreecommitdiffstats
path: root/vrplayer/ourinterface.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'vrplayer/ourinterface.cpp')
-rw-r--r--vrplayer/ourinterface.cpp219
1 files changed, 219 insertions, 0 deletions
diff --git a/vrplayer/ourinterface.cpp b/vrplayer/ourinterface.cpp
new file mode 100644
index 00000000..fb4ad3dc
--- /dev/null
+++ b/vrplayer/ourinterface.cpp
@@ -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);
+}