From 87deab83234505bbc78ca71dac0ceed8df9ecc5d Mon Sep 17 00:00:00 2001 From: silas <s.developer@4-dc.de> Date: Fri, 15 Jan 2021 11:59:43 +0100 Subject: [PATCH] transfer snapshot --- res/gui/fragments/PageStreaming.qml | 2 ++ res/gui/main.qml | 2 ++ src/API/NetworkAPI.cpp | 7 +++--- src/API/NetworkAPI.h | 1 + src/MediaProcessing/VideoTranscoder.cpp | 1 - src/Networking/NetworkSinkHandler.cpp | 10 ++++---- src/Networking/StreamThread.cpp | 33 ++++++++++++++++--------- src/Networking/StreamThread.h | 4 +-- 8 files changed, 38 insertions(+), 22 deletions(-) diff --git a/res/gui/fragments/PageStreaming.qml b/res/gui/fragments/PageStreaming.qml index 68e84e5..877a344 100644 --- a/res/gui/fragments/PageStreaming.qml +++ b/res/gui/fragments/PageStreaming.qml @@ -5,6 +5,8 @@ Page { width: 772 height: 460 + property alias togglePlayPauseBtn: playPauseBtn + header: Label { font.pixelSize: Qt.application.font.pixelSize * 2 text: qsTr("Streaming Control Panel") diff --git a/res/gui/main.qml b/res/gui/main.qml index fa02f0d..5c5ca02 100644 --- a/res/gui/main.qml +++ b/res/gui/main.qml @@ -143,6 +143,8 @@ ApplicationWindow { function onStreamStarted() { pageStreaming.enabled = true pageStreamingBtn.enabled = true + pageStreaming.togglePlayPauseBtn.icon.name = "media-playback-pause" + pageStreaming.togglePlayPauseBtn.icon.source = "qrc:/gui/icons/pause.svg" swipeView.setCurrentIndex(2) } diff --git a/src/API/NetworkAPI.cpp b/src/API/NetworkAPI.cpp index 400eb73..631c840 100644 --- a/src/API/NetworkAPI.cpp +++ b/src/API/NetworkAPI.cpp @@ -125,8 +125,8 @@ bool NetworkAPI::startSource(QUrl inputFileUrl, QString address) { << QDir::toNativeSeparators(inputFileUrl.toLocalFile()); streamThread = new StreamThread(target, QDir::toNativeSeparators(inputFileUrl.toLocalFile()).toStdString()); streamConnecting(); - connect(streamThread, &StreamThread::stopped, this, &NetworkAPI::streamThreadFinished, Qt::QueuedConnection); - connect(streamThread, &StreamThread::connected, [&]() { + streamThreadCon1 = connect(streamThread, &StreamThread::stopped, this, &NetworkAPI::streamThreadFinished, Qt::QueuedConnection); + streamThreadCon2 = connect(streamThread, &StreamThread::connected, [&]() { streamStarted(); }); streamThread->start(); @@ -212,7 +212,8 @@ qint64 NetworkAPI::getPlaybackPosition() { void NetworkAPI::streamThreadFinished() { streamEnded(); - QThread::msleep(5); + disconnect(streamThreadCon1); + disconnect(streamThreadCon2); delete streamThread; streamThread = nullptr; } diff --git a/src/API/NetworkAPI.h b/src/API/NetworkAPI.h index 884638e..c265797 100644 --- a/src/API/NetworkAPI.h +++ b/src/API/NetworkAPI.h @@ -108,6 +108,7 @@ private: NetworkDeviceDirectory *deviceDirectory; NetworkInput *sinkInput = nullptr; NetworkSinkHandler *sinkHandler; + QMetaObject::Connection streamThreadCon1, streamThreadCon2; }; #endif //_NETWORKAPI_H diff --git a/src/MediaProcessing/VideoTranscoder.cpp b/src/MediaProcessing/VideoTranscoder.cpp index 3b0ac64..370eca4 100644 --- a/src/MediaProcessing/VideoTranscoder.cpp +++ b/src/MediaProcessing/VideoTranscoder.cpp @@ -99,7 +99,6 @@ void VideoTranscoder::startTranscoding() { void VideoTranscoder::stopTranscoding() { avPlayer.stop(); - avTranscoder.stop(); disconnect(bufferCon1); disconnect(bufferCon2); } diff --git a/src/Networking/NetworkSinkHandler.cpp b/src/Networking/NetworkSinkHandler.cpp index 46e6abe..d645386 100644 --- a/src/Networking/NetworkSinkHandler.cpp +++ b/src/Networking/NetworkSinkHandler.cpp @@ -80,17 +80,17 @@ void NetworkSinkHandler::run() { disconnect(controlConnection, &QTcpSocket::readyRead, this, &NetworkSinkHandler::handleControl); - if (!quitFromNetworkRequest) { + if (quitFromNetworkRequest) { + controlConnection->write(Command::OK); + dataConnection->disconnectFromHost(); + } else { controlConnection->write(Command::CLOSEDATA); - if (controlConnection->waitForReadyRead(5000) && controlConnection->readAll() == Command::OK) { + if (controlConnection->waitForReadyRead(5000) && controlConnection->read(1) == Command::OK) { dataConnection->disconnectFromHost(); } else { // TODO: Fix crash if stream playback paused dataConnection->close(); } - } else { - controlConnection->write(Command::OK); - dataConnection->disconnectFromHost(); } delete dataConnection; } diff --git a/src/Networking/StreamThread.cpp b/src/Networking/StreamThread.cpp index 7c957aa..9116c50 100644 --- a/src/Networking/StreamThread.cpp +++ b/src/Networking/StreamThread.cpp @@ -53,8 +53,10 @@ void StreamThread::run() { running = false; } else { controlConnection->write(Command::CLOSEDATA); - if (controlConnection->waitForReadyRead(2000) && controlConnection->readAll() == Command::OK) { + if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) { dataConnection->disconnectFromHost(); + } else { + dataConnection->close(); } } delete dataConnection; @@ -71,10 +73,12 @@ void StreamThread::run() { controlConnection->disconnectFromHost(); delete controlConnection; + running = false; stopped(); } void StreamThread::writeToOutput() { + qDebug() << "[StreamThread] writeToOutput()"; QByteArray buf = cachedOutput->getEnd1()->readAll(); // qDebug() << "writeToOutput():" << buf.size(); if (!buf.isEmpty() && dataConnection->isOpen()) { @@ -82,6 +86,14 @@ void StreamThread::writeToOutput() { dataConnection->write(buf); dataConnection->flush(); } + qDebug() << "[StreamThread] Transcoder" << (transcoder->isPaused() ? "paused" : "not paused") << "checking for incoming control messages"; + if (transcoder->isPaused() && controlConnection->waitForReadyRead(1)) { + if (controlConnection->read(1) == Command::CLOSEDATA) { + QtConcurrent::run([&]() { + stop(); + }); + } + } // while (!commandQueue.isEmpty()) { // QByteArray command = commandQueue.takeLast(); // controlConnection->write(command); @@ -146,9 +158,8 @@ void StreamThread::stop() { running = false; quit(); while (isRunning()) { - QThread::msleep(10); + QThread::msleep(1); } - deleteLater(); } } @@ -170,10 +181,10 @@ PlaybackController *StreamThread::getPlaybackController() { return playbackController; } -PlaybackController::PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *parent) : +PlaybackController::PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *streamThread) : controlConnection(controlConn), transcoder(transcoder), - parent(parent) { + streamThread(streamThread) { } @@ -185,24 +196,24 @@ void PlaybackController::togglePlayPause() { qDebug() << "[PlaybackController] toggling play/pause"; if (transcoder->isPaused()) { transcoder->resume(); - parent->suspendControlHandling(); + streamThread->suspendControlHandling(); controlConnection->write(Command::RESUME); if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) { - parent->resumeControlHandling(); + streamThread->resumeControlHandling(); return; } else { - parent->resumeControlHandling(); + streamThread->resumeControlHandling(); return; } } else { transcoder->pause(); - parent->suspendControlHandling(); + streamThread->suspendControlHandling(); controlConnection->write(Command::PAUSE); if (controlConnection->waitForReadyRead(2000) && controlConnection->read(1) == Command::OK) { - parent->resumeControlHandling(); + streamThread->resumeControlHandling(); return; } else { - parent->resumeControlHandling(); + streamThread->resumeControlHandling(); return; } } diff --git a/src/Networking/StreamThread.h b/src/Networking/StreamThread.h index 34eff77..da3a849 100644 --- a/src/Networking/StreamThread.h +++ b/src/Networking/StreamThread.h @@ -65,7 +65,7 @@ private: class PlaybackController : public QObject { Q_OBJECT public: - PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *parent); + PlaybackController(QTcpSocket *controlConn, VideoTranscoder *transcoder, StreamThread *streamThread); Q_INVOKABLE qint64 getPlaybackPosition(); @@ -88,7 +88,7 @@ signals: private: VideoTranscoder *transcoder; QTcpSocket *controlConnection; - StreamThread *parent; + StreamThread *streamThread; }; -- GitLab