Skip to main content

tauri_plugin_video/
models.rs

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    /// Identifies the JavaScript controller that owns the singleton native surface.
17    /// Late cleanup from an older React render must not close a newer player.
18    #[serde(default)]
19    pub session_key: String,
20    pub uri: String,
21    /// Playback engine requested by the JavaScript controller. `auto` selects
22    /// the platform's primary native backend; alternatives must be explicit.
23    #[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}