Files
utun2/tools/chatgui/src/streamplayer_window.h
T
evgeny 0e17756e19 Show stream playback buffer chains on desktop and Android
Send coalesced per-hop telemetry every 200 ms ahead of video DATA using the shared ETCP transport. Measure pending frames before ETCP handoff, retain stale and unavailable node values, and display the worst path with playback tempo.

Bump stream wire protocol to v7. Validate with 187 core tests, 21 desktop player tests, two Android indicator tests, and an Android APK build.
2026-10-25 15:21:23 +01:00

46 lines
1.6 KiB
C++

/* Просмотр live: audio worker получает батчи и готовит PCM, отдельный worker владеет FFmpeg.
* GUI владеет окном; общий output смешивает PCM, callback сохраняет отдельные часы этой трансляции.
* Закрытие отсоединяет output, останавливает оба worker и снимает reader. */
#pragma once
#include <QWidget>
#include <QTimer>
#include <memory>
#include <cstdint>
class VideoRenderWidget;
class QLabel;
class QCloseEvent;
class QKeyEvent;
class StreamPlayerWindow : public QWidget {
Q_OBJECT
public:
explicit StreamPlayerWindow(uint64_t group, uint64_t source, uint64_t epoch, const QString& name,
QWidget* parent = nullptr, bool embedded = false);
~StreamPlayerWindow() override;
void stop();
bool finished() const;
bool failed() const;
int drainTimeoutMs() const; // Остаток готового media + 2s для FIN; максимум 30s при исчезновении источника.
signals:
void statusChanged(const QString& status);
void framePresented();
protected:
void closeEvent(QCloseEvent* event) override;
void keyPressEvent(QKeyEvent* event) override;
private:
struct Playback;
std::unique_ptr<Playback> m_playback;
bool m_audioAttached = false;
QTimer m_timer;
VideoRenderWidget* m_render = nullptr;
QLabel* m_status = nullptr;
QLabel* m_telemetry = nullptr;
int64_t m_telemetryAt = 0;
void attachAudio();
void tick();
void decode();
void decodeVideo();
};