1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, Deserialize, Serialize, PartialEq, Eq)]
6#[serde(rename_all = "lowercase")]
7pub enum TrackKind {
8 Video,
9 Audio,
10 Subtitle,
11}
12
13#[derive(Debug, Clone, Deserialize, Serialize)]
14#[serde(rename_all = "camelCase")]
15pub struct NativeOpenRequest {
16 #[serde(default)]
19 pub session_key: String,
20 pub uri: String,
21 #[serde(default)]
24 pub backend: Option<String>,
25 #[serde(default)]
26 pub headers: BTreeMap<String, String>,
27 #[serde(default)]
28 pub cookies: Option<String>,
29 #[serde(default)]
30 pub user_agent: Option<String>,
31 #[serde(default)]
32 pub referrer: Option<String>,
33 #[serde(default)]
34 pub tls_ca_file: Option<String>,
35 pub x: f64,
36 pub y: f64,
37 #[serde(default)]
38 pub scroll_x: f64,
39 #[serde(default)]
40 pub scroll_y: f64,
41 pub width: f64,
42 pub height: f64,
43 #[serde(default = "default_true")]
44 pub autoplay: bool,
45 #[serde(default = "default_volume")]
46 pub volume: f64,
47 #[serde(default)]
48 pub muted: bool,
49 #[serde(default)]
50 pub min_buffer_ms: Option<u32>,
51 #[serde(default)]
52 pub max_buffer_ms: Option<u32>,
53 #[serde(default)]
54 pub playback_buffer_ms: Option<u32>,
55 #[serde(default)]
56 pub rebuffer_ms: Option<u32>,
57 #[serde(default)]
58 pub target_buffer_bytes: Option<u64>,
59 #[serde(default)]
60 pub decoder_fallback: Option<bool>,
61 #[serde(default)]
62 pub dolby_vision_mode: Option<String>,
63 #[serde(default)]
64 pub tunneling: Option<bool>,
65}
66
67const fn default_true() -> bool {
68 true
69}
70
71const fn default_volume() -> f64 {
72 1.0
73}
74
75#[derive(Debug, Clone, Deserialize, Serialize)]
76#[serde(rename_all = "camelCase")]
77pub struct NativeLayoutRequest {
78 #[serde(default)]
79 pub session_key: String,
80 pub x: f64,
81 pub y: f64,
82 #[serde(default)]
83 pub scroll_x: f64,
84 #[serde(default)]
85 pub scroll_y: f64,
86 pub width: f64,
87 pub height: f64,
88}
89
90#[derive(Debug, Clone, Deserialize, Serialize)]
91#[serde(rename_all = "camelCase")]
92pub struct NativeControlRequest {
93 #[serde(default)]
94 pub session_key: String,
95 pub action: String,
96 #[serde(default)]
97 pub value: f64,
98 #[serde(default = "default_native_track_index")]
99 pub index: i32,
100}
101
102#[derive(Debug, Clone, Default, Deserialize, Serialize)]
103#[serde(rename_all = "camelCase")]
104pub struct NativeSessionRequest {
105 #[serde(default)]
106 pub session_key: String,
107}
108
109const fn default_native_track_index() -> i32 {
110 -1
111}
112
113#[derive(Debug, Clone, Deserialize, Serialize)]
114#[serde(rename_all = "camelCase")]
115pub struct NativeTrackInfo {
116 pub id: String,
117 pub index: i32,
118 pub kind: TrackKind,
119 pub language: String,
120 pub label: String,
121 pub codec: String,
122 #[serde(default)]
123 pub selected: bool,
124}
125
126#[derive(Debug, Clone, Deserialize, Serialize)]
127#[serde(rename_all = "camelCase")]
128pub struct NativePlaybackSnapshot {
129 pub duration_seconds: f64,
130 pub current_time_seconds: f64,
131 pub buffered_seconds: f64,
132 pub playing: bool,
133 pub video_width: u32,
134 pub video_height: u32,
135 pub tracks: Vec<NativeTrackInfo>,
136 #[serde(default)]
137 pub presented_frames: u64,
138 #[serde(default)]
139 pub dropped_frames: u64,
140 #[serde(default)]
141 pub measured_fps: f64,
142 #[serde(default)]
143 pub hardware_backend: String,
144 #[serde(default)]
145 pub encoded_bytes_buffered: u64,
146 #[serde(default)]
147 pub average_frame_processing_us: f64,
148}