Fix Android stream layout and show measured publisher bitrate

This commit is contained in:
evgeny committed 2026-10-18 18:24:30 +02:00
1 parent e246357f92
commit b8bc9b409a
7 files changed
+46 -24

No files matched your search

@@ -110,6 +110,9 @@ struct StreamPublishEngine::Impl {
std::atomic<int64_t> imageStageAt{monotonicUs()};
std::atomic<uint64_t> imageFrames{0};
std::atomic<uint64_t> convertedFrames{0}, encodedFrames{0}, deliveredFrames{0}, repeatedFrames{0};
std::atomic<uint64_t> encodedBytes{0}, lastKeyBytes{0}; // Видео до сетевой отправки, без повторов транспорта.
uint64_t bitrateBytes = 0, videoBitrate = 0;
int64_t bitrateAt = 0;
void videoProgress(const char* stage) {
videoStageAt.store(monotonicUs()); videoStage.store(stage);
}
@@ -236,6 +239,7 @@ bool StreamPublishEngine::active() const { return m->id != 0; }
bool StreamPublishEngine::running() const { return m->running.load(); }
uint64_t StreamPublishEngine::group() const { return m->group; }
StreamPublishConfig StreamPublishEngine::config() const { std::lock_guard<std::mutex> guard(m->lock); return m->wanted; }
uint64_t StreamPublishEngine::videoBitrate() const { return active() ? m->videoBitrate : 0; }
QVariant StreamPublishEngine::previewFrame() const {
#ifdef HAVE_STREAM_CAPTURE
std::lock_guard<std::mutex> guard(m->lock); return QVariant::fromValue(m->previewFrame);
@@ -585,6 +589,7 @@ bool StreamPublishEngine::start(uint64_t group, const StreamPublishConfig& confi
m->videoReady = false; m->softwareRequest = 0; m->softwareCodec = 0; m->lastAudioAt = 0;
m->origin = m->started = monotonicUs(); m->stats = {}; }
m->convertedFrames = m->encodedFrames = m->deliveredFrames = m->repeatedFrames = 0;
m->encodedBytes = m->lastKeyBytes = 0; m->bitrateBytes = m->videoBitrate = 0; m->bitrateAt = m->origin;
m->videoProgress("starting"); m->captureReport = 0;
m->captureReportRaw = m->captureReportConverted = m->captureReportEncoded = m->captureReportDelivered = 0;
m->id = QRandomGenerator::global()->generate64(); if (!m->id) m->id = 1;
@@ -966,6 +971,8 @@ void StreamPublishEngine::videoLoop(StreamPublishConfig initial) {
stream_media_format format{(uint16_t)config.video.width, (uint16_t)config.video.height, (uint16_t)config.video.rotation,
(uint8_t)config.video.codec, (uint8_t)(config.audio ? STREAM_MEDIA_OPUS_STEREO : 0), revision};
for (const auto& encoded : output) {
m->encodedBytes += encoded.data.size();
if (encoded.key) m->lastKeyBytes = encoded.data.size();
if (gui_stream_publish_feed(m->id, true, encoded.pts, encoded.key, encoded.data, &format) == 1) {
lastPts = encoded.pts; if (encoded.key) lastKey = encoded.pts; count++;
m->deliveredFrames++;
@@ -1014,6 +1021,17 @@ void StreamPublishEngine::tick() {
m_microphone.release(); m->id = m->group = 0; emit stateChanged(text("Chat service is stopped")); return;
}
{ std::lock_guard<std::mutex> guard(m->lock); m->stats = status; }
const int64_t bitrateNow = monotonicUs(), bitrateElapsed = bitrateNow - m->bitrateAt;
if (bitrateElapsed >= 1000000) {
const uint64_t encodedBytes = m->encodedBytes.load();
m->videoBitrate = (encodedBytes - m->bitrateBytes) * 8000000 / bitrateElapsed;
DEBUG_DEBUG(DEBUG_CATEGORY_VIDEO, "desktop video bitrate id=%llu actual_bps=%llu target_bps=%d bytes=%llu interval_us=%lld "
"last_key_bytes=%llu queue_bytes=%llu need_key=%d",
(unsigned long long)m->id, (unsigned long long)m->videoBitrate, config().video.bitrate,
(unsigned long long)(encodedBytes - m->bitrateBytes), (long long)bitrateElapsed,
(unsigned long long)m->lastKeyBytes.load(), (unsigned long long)status.video_bytes, status.need_key);
m->bitrateBytes = encodedBytes; m->bitrateAt = bitrateNow;
}
emit telemetryChanged(status);
if (status.state == STREAM_PUBLISHER_ENDED || status.state == STREAM_PUBLISHER_FAILED) {
stop();