Fix Android stream layout and show measured publisher bitrate
This commit is contained in:
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();
|
||||
|
||||
Reference in new issue
Block a user