From ffc3fb7dd7e76e47cfcbac08e9360b83c75efe3c Mon Sep 17 00:00:00 2001 From: IgorA100 Date: Tue, 21 Jul 2026 20:08:12 +0300 Subject: [PATCH] Don't use startup_keyframe_packet Restore the decoder_requires_next_packet flag to be set immediately after decoder_queue.pop_front(), rather than at the end of phase 5. --- src/zm_monitor.cpp | 13 ++++++------- src/zm_monitor.h | 4 ---- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/src/zm_monitor.cpp b/src/zm_monitor.cpp index ac7f4e22d..0aeaa9316 100644 --- a/src/zm_monitor.cpp +++ b/src/zm_monitor.cpp @@ -3157,6 +3157,7 @@ bool Monitor::Decode() { AVCodecContext *context = camera->getVideoCodecContext(); ZMPacketLock packet_lock; std::shared_ptr packet; + const bool waiting_for_followup = decoder_requires_next_packet; // =========================================================================== // PHASE 1: Try to receive a decoded frame from the decoder @@ -3198,6 +3199,9 @@ bool Monitor::Decode() { packet_lock = std::move(decoder_queue.front()); decoder_queue.pop_front(); packet = front_packet; + if (decoder_requires_next_packet ) { + decoder_requires_next_packet = false; + } Debug(2, "Received frame for packet %d, decoder queue pop size=%zu", packet->image_index, decoder_queue.size()); // Continue to PHASE 3 (frame processing) } else if (ret < 0) { @@ -3289,7 +3293,7 @@ bool Monitor::Decode() { // Warn if send_packet is taking too long int fps = static_cast(get_capture_fps()); Milliseconds warning_threshold; - if (startup_keyframe_packet != -1) { + if (waiting_for_followup) { // Decoder may legitimately require additional packets // before producing the first decoded frame. warning_threshold = Milliseconds(500); @@ -3305,7 +3309,7 @@ bool Monitor::Decode() { "Capture fps=%d, queue size=%zu, keyframe interval=%d, ret=%d", packet->image_index, FPSeconds(endtime - starttime).count(), - startup_keyframe_packet != -1 + waiting_for_followup ? " (keyframe startup / decoder latency)" : "", fps, @@ -3331,7 +3335,6 @@ bool Monitor::Decode() { decoder_queue.push_back(std::move(packet_lock)); if (packet->keyframe) { decoder_requires_next_packet = true; - startup_keyframe_packet = packet->image_index; Debug(2, "Decoder requires follow-up packets after keyframe %d, decoder queue push size=%zu", packet->image_index, decoder_queue.size()); } packetqueue.increment_it(decoder_it, false); @@ -3501,10 +3504,6 @@ bool Monitor::Decode() { } packet->decoded = true; - if (decoder_requires_next_packet ) { - decoder_requires_next_packet = false; - startup_keyframe_packet = -1; - } packet->notify_all(); packetqueue.notify_all(); // Wake up analysis thread waiting for decoded packets return true; diff --git a/src/zm_monitor.h b/src/zm_monitor.h index 1a8bdb4f6..bab9c4af4 100644 --- a/src/zm_monitor.h +++ b/src/zm_monitor.h @@ -1091,10 +1091,6 @@ class Monitor : public std::enable_shared_from_this { // A future improvement could eliminate mode-specific checks by relying solely // on this flag to track the decoder state. bool decoder_requires_next_packet = false; - - // Image index of the keyframe that started the current decoder startup. - // -1 means the decoder is not currently in keyframe startup. - int startup_keyframe_packet = -1; }; #define MOD_ADD( var, delta, limit ) (((var)+(limit)+(delta))%(limit))