use nv_core::id::StageId;
use nv_core::timestamp::{Duration, MonotonicTs};
use nv_view::view_state::{ViewEpoch, ViewVersion};
use nv_view::{EpochDecision, MotionSource, TransitionPhase};
#[derive(Debug, Clone)]
pub struct Provenance {
pub stages: Vec<StageProvenance>,
pub view_provenance: ViewProvenance,
pub frame_receive_ts: MonotonicTs,
pub pipeline_complete_ts: MonotonicTs,
pub total_latency: Duration,
pub frame_age: Option<Duration>,
pub queue_hold_time: std::time::Duration,
pub frame_included: bool,
}
#[derive(Debug, Clone)]
pub struct StageProvenance {
pub stage_id: StageId,
pub start_ts: MonotonicTs,
pub end_ts: MonotonicTs,
pub latency: Duration,
pub result: StageResult,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StageResult {
Ok,
Error(StageOutcomeCategory),
Skipped,
}
#[derive(Debug, Clone, PartialEq)]
pub enum StageOutcomeCategory {
ProcessingFailed,
ResourceExhausted,
DependencyUnavailable,
Panic,
Other {
tag: &'static str,
},
}
#[derive(Debug, Clone)]
pub struct ViewProvenance {
pub motion_source: MotionSource,
pub epoch_decision: Option<EpochDecision>,
pub transition: TransitionPhase,
pub stability_score: f32,
pub epoch: ViewEpoch,
pub version: ViewVersion,
}