feat(stats): wire real scale/transfer/encode timing from EncState
Oracle step 4 (option A) — give the scale_*, transfer_*, encode_* stats
fields real producers instead of misleading zeros. The fields existed in
FrameTimings and PipelineStats already; producers just weren't passing
non-zero values.
- avhw.rs: new EncodeStages { scale_us, transfer_us, encode_us } struct.
EncState::encode_frame (HW VAAPI path) now times the filter graph
separately from avcodec_send_frame, returning EncodeStages. transfer_us
is honestly 0 because the HW path never reads back to CPU.
SwEncState::encode_frame (SW fallback path) returns EncodeStages too;
there import_and_scale bundles GPU scale + GPU→CPU readback into one
call, so scale_us includes transfer for SW. Documented inline.
- state.rs: StreamingEncoder::encode_frame return type bumps from
Result<()> to Result<EncodeStages>; wlr-screencopy path now feeds
real per-stage timings into FrameTimings instead of just total_us.
- state_portal.rs: HW portal path (enc.encode_frame) now extracts
stages.scale_us / stages.transfer_us / stages.encode_us into
FrameTimings. Removed the now-unused t_encode_start binding.
Deferred (documented):
- state_portal.rs SW portal path (line 525) calls import_and_scale +
enc_thread separately and bypasses SwEncState::encode_frame. To wire
scale/transfer timing there too, either route through SwEncState or
thread timing out of import_and_scale. Out of scope for this commit.
- SW path lumps transfer into scale_us. Splitting requires extending
import_and_scale's return type — left as a follow-up if operational
need arises (current default is HW VAAPI).
Oracle audit 2026-06-28 step 4 (option A: integrate, not delete).
All 79 unit tests + 3 integration tests pass. clippy: 0 errors.
This commit is contained in:
+5
-4
@@ -494,7 +494,6 @@ impl StatePortal {
|
||||
}?;
|
||||
|
||||
let import_us = t_import_start.elapsed().as_micros() as u64;
|
||||
let t_encode_start = Instant::now();
|
||||
|
||||
// 设置帧的显示时间戳(PTS),基于已编码帧序号
|
||||
// SAFETY: vaapi_frame is the freshly-imported valid AVFrame returned by
|
||||
@@ -504,15 +503,17 @@ impl StatePortal {
|
||||
}
|
||||
|
||||
// 送入编码器完成:缩放 → 回读 → 格式转换 → H.264 编码
|
||||
enc.encode_frame(&vaapi_frame)?;
|
||||
let stages = enc.encode_frame(&vaapi_frame)?;
|
||||
let total_us = t_import_start.elapsed().as_micros() as u64;
|
||||
let encode_us = t_encode_start.elapsed().as_micros() as u64;
|
||||
let encode_us = stages.encode_us;
|
||||
|
||||
self.frames_encoded += 1;
|
||||
|
||||
// 记录帧计时到管道统计(import + encode 内部各阶段暂不可分离,用 total 覆盖)
|
||||
// 记录帧计时到管道统计(scale 来自 filter graph;transfer 在 HW 路径恒为 0)
|
||||
let timings = FrameTimings {
|
||||
import_us,
|
||||
scale_us: stages.scale_us,
|
||||
transfer_us: stages.transfer_us,
|
||||
encode_us,
|
||||
total_us,
|
||||
..Default::default()
|
||||
|
||||
Reference in New Issue
Block a user