feat(clients/android): OnFrameRendered display stage — HUD headline becomes capture→displayed
The long-deferred Android display stage (design/stats-unification.md; plan 4.1 of design/client-parity-and-network-resilience.md): AMediaCodec_setOnFrameRenderedCallback (API 26, under the minSdk-28 floor ⇒ hard-linked via ndk-sys) reports SurfaceFlinger's per-frame render timestamp, giving the HUD the spec's `display` = decoded→displayed term and the directly-measured capture→displayed end-to-end headline on both decode loops. Falls back per spec to the v1 capture→decoded endpoint on any window without render callbacks (the platform may drop them under load), and to it permanently if registration is refused. - The render timestamp arrives on CLOCK_MONOTONIC; it's re-based onto CLOCK_REALTIME against monotonic-now at callback time, which also cancels the (batchable) callback delivery lag. - The `ndk` crate exposes neither the callback nor the codec pointer needed to bind it raw, so the workspace pins `ndk` 0.9.0 to a vendored copy (clients/android/native/ vendor/ndk) whose ONLY change makes MediaCodec::as_ptr public — the "as_ptr patch". Workspace-excluded so host builds never compile it; drop when upstream exposes either. - nativeVideoStats grows to 26 doubles (22–25: dispValid, displayP50, e2eDispP50/P95; 0–21 unchanged for older readers); StatsOverlay moves headline endpoint + equation together so the equation always tiles the headline interval. Verified: host cargo check/test/clippy, aarch64-linux-android check/clippy, Kotlin app+kit+tests compile, roborazzi HUD render shows the full 4-term equation. Device verification rides plan 4.2's phone A/B. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
+125
@@ -0,0 +1,125 @@
|
||||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g., crates.io) dependencies.
|
||||
#
|
||||
# If you are reading this file be aware that the original Cargo.toml
|
||||
# will likely look very different (and much more reasonable).
|
||||
# See Cargo.toml.orig for the original contents.
|
||||
|
||||
[package]
|
||||
edition = "2021"
|
||||
rust-version = "1.66"
|
||||
name = "ndk"
|
||||
version = "0.9.0"
|
||||
authors = ["The Rust Mobile contributors"]
|
||||
description = "Safe Rust bindings to the Android NDK"
|
||||
homepage = "https://github.com/rust-mobile/ndk"
|
||||
documentation = "https://docs.rs/ndk"
|
||||
readme = "README.md"
|
||||
keywords = [
|
||||
"android",
|
||||
"ndk",
|
||||
]
|
||||
license = "MIT OR Apache-2.0"
|
||||
repository = "https://github.com/rust-mobile/ndk"
|
||||
|
||||
[package.metadata.docs.rs]
|
||||
features = [
|
||||
"jni",
|
||||
"all",
|
||||
]
|
||||
rustdoc-args = [
|
||||
"--cfg",
|
||||
"docsrs",
|
||||
]
|
||||
targets = [
|
||||
"aarch64-linux-android",
|
||||
"armv7-linux-androideabi",
|
||||
"i686-linux-android",
|
||||
"x86_64-linux-android",
|
||||
]
|
||||
|
||||
[dependencies.bitflags]
|
||||
version = "2.4"
|
||||
|
||||
[dependencies.ffi]
|
||||
version = "0.6.0"
|
||||
package = "ndk-sys"
|
||||
|
||||
[dependencies.jni]
|
||||
version = "0.21"
|
||||
optional = true
|
||||
|
||||
[dependencies.jni-sys]
|
||||
version = "0.3"
|
||||
|
||||
[dependencies.log]
|
||||
version = "0.4.6"
|
||||
|
||||
[dependencies.num_enum]
|
||||
version = "0.7"
|
||||
|
||||
[dependencies.rwh_04]
|
||||
version = "0.4"
|
||||
optional = true
|
||||
package = "raw-window-handle"
|
||||
|
||||
[dependencies.rwh_05]
|
||||
version = "0.5"
|
||||
optional = true
|
||||
package = "raw-window-handle"
|
||||
|
||||
[dependencies.rwh_06]
|
||||
version = "0.6"
|
||||
optional = true
|
||||
package = "raw-window-handle"
|
||||
|
||||
[dependencies.thiserror]
|
||||
version = "1.0.23"
|
||||
|
||||
[dev-dependencies.libc]
|
||||
version = "0.2.3"
|
||||
|
||||
[features]
|
||||
all = [
|
||||
"audio",
|
||||
"bitmap",
|
||||
"media",
|
||||
"nativewindow",
|
||||
"sync",
|
||||
"api-level-33",
|
||||
"rwh_04",
|
||||
"rwh_05",
|
||||
"rwh_06",
|
||||
]
|
||||
api-level-23 = []
|
||||
api-level-24 = ["api-level-23"]
|
||||
api-level-25 = ["api-level-24"]
|
||||
api-level-26 = ["api-level-25"]
|
||||
api-level-27 = ["api-level-26"]
|
||||
api-level-28 = ["api-level-27"]
|
||||
api-level-29 = ["api-level-28"]
|
||||
api-level-30 = ["api-level-29"]
|
||||
api-level-31 = ["api-level-30"]
|
||||
api-level-32 = ["api-level-31"]
|
||||
api-level-33 = ["api-level-32"]
|
||||
audio = [
|
||||
"ffi/audio",
|
||||
"api-level-26",
|
||||
]
|
||||
bitmap = ["ffi/bitmap"]
|
||||
default = ["rwh_06"]
|
||||
media = ["ffi/media"]
|
||||
nativewindow = ["ffi/nativewindow"]
|
||||
sync = [
|
||||
"ffi/sync",
|
||||
"api-level-26",
|
||||
]
|
||||
test = [
|
||||
"ffi/test",
|
||||
"jni",
|
||||
"all",
|
||||
]
|
||||
Reference in New Issue
Block a user