#include "streamplayer_window.h" #include "videoplayer_window.h" #include "video_frame_image.h" #include "sound_manager.h" #include "../transport/stream_bridge.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include extern "C" { #include "../../../lib/debug_config.h" #include "../../../src/stream/stream.h" #include "../../../src/stream/stream_playback_clock.h" #include "../../../src/stream/stream_playback_audio.h" #ifdef HAVE_FFMPEG #include #include #endif } namespace { int64_t nowUs() { return std::chrono::duration_cast(std::chrono::steady_clock::now().time_since_epoch()).count(); } std::atomic nextId{0}; QString text(const char* value) { return QCoreApplication::translate("ChatGui", value); } } struct StreamPlayerWindow::Playback { struct Video { QImage image; int64_t pts; }; struct AudioGap { uint64_t count = 0, silentFrames = 0; unsigned requested = 0, received = 0; int64_t reserve = 0, feedAge = -1, workerAge = -1, audioPts = -1; size_t videoQueue = 0; bool held = false; } audioGap; uint64_t id = ++nextId, group = 0, source = 0, epoch = 0; int64_t createdAt = nowUs(), firstInputAt = 0; std::atomic running{true}, audioAvailable{false}; std::atomic complete{false}, failed{false}; std::atomic volume{1.0f}; float outputVolume = 0.0f; uint64_t audioGeneration = 0; std::thread worker; std::mutex lock; std::mutex wakeLock; std::condition_variable wake; uint64_t wakeVersion = 0, dataSignals = 0; std::deque