wl-webrtc.log 全会话统计:
wl-webrtc.log
filler_frames_sent
skipping duplicate frame
即:停滞期间,portal 端把上一帧的 NV12 数据复制塞进 encode 通道 → 编码端算 Y 平面 hash → 发现完全相同 → 丢弃。两端都在做无用功。
[state_portal.rs maybe_send_filler_frame] clone() y_data/uv_data ←── 复制上一帧的 NV12 缓冲 try_send(input_tx) ←── 跨线程通道 ↓ [avhw.rs encode_cpu_frame] hash_sampled_y_plane() ←── 算 hash current_hash == last_frame_hash? → yes → "skipping duplicate frame" → return Ok
src/state_portal.rs:379-427 的 filler 策略假设"重复帧编码后客户端看到画面继续动",但没考虑:
src/state_portal.rs:379-427
src/avhw.rs:1131-1137
encoded_fps
方案 A(推荐):filler 入队前自己比较 hash,相同就不发
fn maybe_send_filler_frame(&mut self) { // ... existing checks ... let current_hash = hash_sampled_y_plane(&cached.y_data, ...); if current_hash == self.last_filler_hash { return; } // 跳过 self.last_filler_hash = current_hash; // ... send ... }
方案 B:删除整个 filler 机制。让合成器主导帧率(KWin 在画面变化时自然会送帧),WebRTC 层依赖 PLI/FIR 触发真实关键帧(依赖 #16 修复)。
方案 C:filler 退化为 RTP 层的 padding/keep-alive(如果担心 NAT/UDP 超时),不要走完整编码路径。
output_bps=0
Blocked by: #17 — 需要 stats 量化 filler 浪费程度(3245 filler vs 3209 dedup) Blocks: #15 — stall 缓解依赖本 issue 的 filler 策略改进
No dependencies set.
The note is not visible to the blocked user.
现象
wl-webrtc.log全会话统计:filler_frames_sent(末值)skipping duplicate frame即:停滞期间,portal 端把上一帧的 NV12 数据复制塞进 encode 通道 → 编码端算 Y 平面 hash → 发现完全相同 → 丢弃。两端都在做无用功。
流程图
根因
src/state_portal.rs:379-427的 filler 策略假设"重复帧编码后客户端看到画面继续动",但没考虑:src/avhw.rs:1131-1137),相同 hash 的帧根本不会编码产出encoded_fps数字好看"——这反而掩盖了真实质量(见 #21)影响
修复方向
方案 A(推荐):filler 入队前自己比较 hash,相同就不发
方案 B:删除整个 filler 机制。让合成器主导帧率(KWin 在画面变化时自然会送帧),WebRTC 层依赖 PLI/FIR 触发真实关键帧(依赖 #16 修复)。
方案 C:filler 退化为 RTP 层的 padding/keep-alive(如果担心 NAT/UDP 超时),不要走完整编码路径。
关联
output_bps=0无法判断)Dependencies
Blocked by: #17 — 需要 stats 量化 filler 浪费程度(3245 filler vs 3209 dedup)
Blocks: #15 — stall 缓解依赖本 issue 的 filler 策略改进