1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
//! Global constants for CrabCamera
//!
//! This file centralizes all hardcoded values to prevent "magic number" usage
//! and ensure consistency across the application.
/// Default camera resolution width (Full HD)
pub const DEFAULT_RESOLUTION_WIDTH: u32 = 1920;
/// Default camera resolution height (Full HD)
pub const DEFAULT_RESOLUTION_HEIGHT: u32 = 1080;
/// Fallback resolution width (HD Ready)
pub const FALLBACK_RESOLUTION_WIDTH: u32 = 1280;
/// Fallback resolution height (HD Ready)
pub const FALLBACK_RESOLUTION_HEIGHT: u32 = 720;
/// Minimal resolution width (VGA)
pub const MIN_RESOLUTION_WIDTH: u32 = 640;
/// Minimal resolution height (VGA)
pub const MIN_RESOLUTION_HEIGHT: u32 = 480;
/// Maximum resolution width (4K)
pub const MAX_RESOLUTION_WIDTH: u32 = 3840;
/// Maximum resolution height (4K)
pub const MAX_RESOLUTION_HEIGHT: u32 = 2160;
/// Default frame rate
pub const DEFAULT_FPS: f32 = 30.0;
/// High frame rate
pub const HIGH_FPS: f32 = 60.0;
/// Linux video device prefix
pub const LINUX_VIDEO_DEVICE_PREFIX: &str = "/dev/video";
/// Default ISO sensitivity
pub const DEFAULT_ISO: u32 = 400;
/// Minimum ISO sensitivity
pub const MIN_ISO: u32 = 50;
/// Maximum ISO sensitivity
pub const MAX_ISO: u32 = 12800;
/// Default video format type
pub const DEFAULT_FORMAT_TYPE: &str = "YUYV";
/// RGB format type
pub const FORMAT_RGB: &str = "RGB8";
/// MJPEG format type
pub const FORMAT_MJPEG: &str = "MJPEG";
/// Default frame pool size
pub const DEFAULT_POOL_SIZE: usize = 10;
/// Default bytes per pixel (RGB8)
pub const BYTES_PER_PIXEL_RGB: u32 = 3;
/// Default Reconnect Attempts
pub const DEFAULT_RECONNECT_ATTEMPTS: u32 = 3;
/// Default Reconnect Delay (ms)
pub const DEFAULT_RECONNECT_DELAY_MS: u64 = 1000;
/// Default Max Retry Attempts
pub const DEFAULT_MAX_RETRY_ATTEMPTS: u32 = 10;
/// Default Blur Threshold (0.0-1.0)
pub const DEFAULT_BLUR_THRESHOLD: f32 = 0.7;
/// Default Exposure Score Threshold (0.0-1.0)
pub const DEFAULT_EXPOSURE_THRESHOLD: f32 = 0.6;
/// Default Overall Quality Score Threshold (0.0-1.0)
pub const DEFAULT_OVERALL_THRESHOLD: f32 = 0.7;
/// Default Retry Delay (ms)
pub const DEFAULT_RETRY_DELAY_MS: u64 = 100;
/// Default Output Directory
pub const DEFAULT_OUTPUT_DIRECTORY: &str = "./captures";
/// Default Date Format
pub const DEFAULT_DATE_FORMAT: &str = "YYYY-MM-DD";
/// Default Image Format
pub const DEFAULT_IMAGE_FORMAT: &str = "jpeg";
/// Default JPEG Quality (0-100)
pub const DEFAULT_JPEG_QUALITY: u8 = 95;
/// Default Focus Stack Steps
pub const DEFAULT_FOCUS_STACK_STEPS: u32 = 10;
/// Default HDR Brackets
pub const DEFAULT_HDR_BRACKETS: u32 = 3;
/// Audio sample rate (Standard Opus requirement)
pub const AUDIO_SAMPLE_RATE: u32 = 48000;
/// Audio channels (Stereo)
pub const AUDIO_CHANNELS: u16 = 2;
/// Audio bitrate (Standard quality)
pub const AUDIO_BITRATE: u32 = 128_000;
/// Audio Capture
pub const AUDIO_SAMPLE_RATE_48K: u32 = 48000;
/// Audio Capture - 44.1kHz Sample Rate
pub const AUDIO_SAMPLE_RATE_44K: u32 = 44100;
/// Audio Capture - Buffer Size in Frames
pub const AUDIO_BUFFER_FRAMES: usize = 256;
/// Audio Capture - Default Device ID
pub const AUDIO_DEVICE_DEFAULT: &str = "default";
/// Audio Capture - Default Bitrate (128kbps)
pub const AUDIO_DEFAULT_BITRATE: u32 = 128_000;
/// CLI Defaults
/// Default timeout for capture operations in ms
pub const CLI_DEFAULT_TIMEOUT_MS: u64 = 1000;
/// Default number of frames to capture
pub const CLI_DEFAULT_FRAME_COUNT: usize = 1;
/// Identifier for file-based sources in CLI
pub const CLI_FILE_SOURCE_ID: &str = "cli-file-source";
/// Exit code for errors
pub const CLI_EXIT_CODE_ERROR: i32 = 1;
/// Headless Example Defaults
/// Capacity of frame buffer
pub const HEADLESS_BUFFER_CAPACITY: usize = 10;
/// Number of frames to capture in example
pub const HEADLESS_CAPTURE_COUNT: usize = 50;
/// Delay between captures
pub const HEADLESS_CAPTURE_DELAY_MS: u64 = 100;
/// Timeout for entire capture session
pub const HEADLESS_TIMEOUT_SECS: u64 = 10;
/// Timeout for frame polling
pub const HEADLESS_POLL_TIMEOUT_MS: u64 = 1000;
/// Timeout for audio packet polling
pub const HEADLESS_AUDIO_POLL_TIMEOUT_MS: u64 = 100;
/// Timeout for stopping session
pub const HEADLESS_STOP_TIMEOUT_MS: u64 = 10_000;
/// Output filename for video frame
pub const HEADLESS_FRAME_FILENAME: &str = "captured_frame.raw";
/// Output filename for audio data
pub const HEADLESS_AUDIO_FILENAME: &str = "captured_audio.raw";
/// Demo App Defaults
/// Default width
pub const DEMO_DEFAULT_WIDTH: u32 = 640;
/// Default height
pub const DEMO_DEFAULT_HEIGHT: u32 = 480;
/// Default FPS
pub const DEMO_DEFAULT_FPS: f32 = 30.0;
/// Audio Encoding (Opus)
pub const OPUS_SAMPLE_RATE: u32 = 48000;
/// Opus Encoding - Frame Duration (20ms)
pub const OPUS_FRAME_DURATION_MS: u32 = 20;
/// Opus Encoding - Samples per Frame (960 for 20ms at 48kHz)
pub const OPUS_FRAME_SAMPLES: usize = 960; // 20ms at 48kHz
/// Opus Encoding - Audio Application Profile
pub const OPUS_APPLICATION_AUDIO: i32 = 2049;
/// Opus Encoding - `VoIP` Application Profile
pub const OPUS_APPLICATION_VOIP: i32 = 2048;
/// Opus Encoding - Low Delay Application Profile
pub const OPUS_APPLICATION_LOW_DELAY: i32 = 2051;
/// Blur Detection - Variance Thresholds
/// Threshold for extremely sharp images
pub const BLUR_VARIANCE_SHARP: f64 = 1000.0;
/// Threshold for good quality images
pub const BLUR_VARIANCE_GOOD: f64 = 500.0;
/// Threshold for moderately sharp images
pub const BLUR_VARIANCE_MODERATE: f64 = 200.0;
/// Threshold for blurry images
pub const BLUR_VARIANCE_BLURRY: f64 = 50.0;
/// Blur Detection - Quality Scores
/// Score for sharp images (1.0)
pub const QUALITY_SCORE_SHARP: f32 = 1.0;
/// Score for good images (0.8)
pub const QUALITY_SCORE_GOOD: f32 = 0.8;
/// Score for moderately sharp images (0.6)
pub const QUALITY_SCORE_MODERATE: f32 = 0.6;
/// Score for blurry images (0.3)
pub const QUALITY_SCORE_BLURRY: f32 = 0.3;
/// Score for very blurry images (0.1)
pub const QUALITY_SCORE_VERY_BLURRY: f32 = 0.1;
/// Blur Detection - Default Thresholds
/// Default variance threshold
pub const DEFAULT_VARIANCE_THRESHOLD: f64 = 200.0;
/// Default gradient threshold
pub const DEFAULT_GRADIENT_THRESHOLD: f64 = 50.0;
/// Image Processing - Luminance (Rec. 601)
/// Red channel weight
pub const LUMA_R: f32 = 0.299;
/// Green channel weight
pub const LUMA_G: f32 = 0.587;
/// Blue channel weight
pub const LUMA_B: f32 = 0.114;
/// Image Processing - Pyramids
/// Size of pooling window
pub const PYRAMID_POOLING_SIZE: usize = 2;
/// Area of pooling window
// usizeāu32: product is always 4, well within u32 range
pub const PYRAMID_POOLING_AREA: u32 = as u32;
/// Image Processing - Alignment
/// Rotation threshold considered significant
pub const ALIGNMENT_SIGNIFICANT_ROTATION: f32 = 0.01;
/// Scale threshold considered significant
pub const ALIGNMENT_SIGNIFICANT_SCALE: f32 = 0.01;
/// Sampling step for alignment
pub const ALIGNMENT_SAMPLING_STEP: usize = 4;
/// Focus Stacking - Bracket Limits
/// Minimum number of brackets (2)
pub const FOCUS_STACK_MIN_BRACKETS: u32 = 2;
/// Maximum number of brackets (10)
pub const FOCUS_STACK_MAX_BRACKETS: u32 = 10;
/// Minimum number of shots per bracket (1)
pub const FOCUS_STACK_MIN_SHOTS: u32 = 1;
/// Maximum number of shots per bracket (10)
pub const FOCUS_STACK_MAX_SHOTS: u32 = 10;
/// Minimum number of focus steps (2)
pub const FOCUS_STACK_MIN_STEPS: u32 = 2;
/// Maximum number of focus steps (100)
pub const FOCUS_STACK_MAX_STEPS: u32 = 100;
/// Minimum sharpness threshold (0.0)
pub const FOCUS_STACK_MIN_SHARPNESS: f32 = 0.0;
/// Maximum sharpness threshold (1.0)
pub const FOCUS_STACK_MAX_SHARPNESS: f32 = 1.0;
/// Focus Stacking - Focus Distance
/// Minimum focus distance (macro)
pub const FOCUS_STACK_MIN_DIST: f32 = 0.0;
/// Maximum focus distance (infinity)
pub const FOCUS_STACK_MAX_DIST: f32 = 1.0;
/// Capture Settings
/// Default retry count for capture operations
pub const CAPTURE_RETRY_COUNT: u32 = 3;
/// Number of warmup frames to discard
pub const CAPTURE_WARMUP_FRAMES: u32 = 5;
/// Delay between warmup frames in ms
pub const CAPTURE_WARMUP_DELAY_MS: u64 = 30;
/// Warmup frames after reconnection
pub const CAPTURE_RECONNECT_WARMUP_FRAMES: u32 = 10;
/// Delay between reconnection warmup frames in ms
pub const CAPTURE_RECONNECT_WARMUP_DELAY_MS: u64 = 50;
/// Maximum number of frames in a sequence
pub const CAPTURE_SEQUENCE_MAX_COUNT: u32 = 20;
/// Maximum number of frames in a burst
pub const BURST_MAX_COUNT: u32 = 50;
/// Platform - Connection
/// Initial backoff delay for connection retry
pub const CONNECTION_BACKOFF_INITIAL_MS: u64 = 100;
/// Maximum backoff delay for connection retry
pub const CONNECTION_BACKOFF_MAX_MS: u64 = 2000;
/// Default number of connection retries
pub const CONNECTION_RETRY_DEFAULT: u32 = 3;
/// Interval for device monitor polling
pub const DEVICE_MONITOR_POLL_INTERVAL_MS: u64 = 2000;
/// Platform - Mock Camera
/// Simulated capture latency (16.7ms for 60fps)
pub const MOCK_CAPTURE_LATENCY_MS: f32 = 16.7; // 60 FPS
/// Simulated processing time
pub const MOCK_PROCESSING_TIME_MS: f32 = 5.0;
/// Simulated memory usage
pub const MOCK_MEMORY_USAGE_MB: f32 = 32.0;
/// Simulated FPS
pub const MOCK_FPS: f32 = 60.0;
/// Simulated quality score
pub const MOCK_QUALITY_SCORE: f32 = 0.95;
/// Simulated slow capture delay
pub const MOCK_SLOW_CAPTURE_DELAY_MS: u64 = 100;
/// Platform - Windows Metadata
/// MJPEG Header Signature
pub const MJPEG_SIGNATURE: = ;
/// Percentage of non-zero bytes required to consider a frame valid
pub const VALID_FRAME_NONZERO_PERCENT: f64 = 1.0;
/// Focus Stacking - Defaults
/// Default delay between focus steps in ms
pub const FOCUS_STACK_DEFAULT_DELAY_MS: u32 = 200;
/// Default sharpness threshold
pub const FOCUS_STACK_DEFAULT_SHARPNESS: f32 = 0.5;
/// Default number of blend levels
pub const FOCUS_STACK_DEFAULT_BLEND_LEVELS: u32 = 5;
/// Default bracket overlap factor
pub const FOCUS_STACK_BRACKET_OVERLAP: f32 = 1.2;
/// Exposure Analysis - Brightness Thresholds
/// Threshold for low brightness
pub const EXPOSURE_BRIGHTNESS_LOW: f32 = 0.2;
/// Threshold for dark images
pub const EXPOSURE_BRIGHTNESS_DARK: f32 = 0.35;
/// Threshold for good brightness
pub const EXPOSURE_BRIGHTNESS_GOOD: f32 = 0.65;
/// Threshold for high brightness
pub const EXPOSURE_BRIGHTNESS_HIGH: f32 = 0.8;
/// Exposure Analysis - Pixel Thresholds
/// Pixel value considered dark (0-255)
pub const EXPOSURE_PIXEL_DARK: u8 = 30;
/// Pixel value considered bright (0-255)
pub const EXPOSURE_PIXEL_BRIGHT: u8 = 225;
/// Smart Trigger Defaults
/// Minimum quality score to trigger
pub const TRIGGER_MIN_QUALITY: f32 = 0.75;
/// Stability duration required to trigger in ms
pub const TRIGGER_STABILITY_MS: u64 = 200;
/// Timeout for trigger in seconds
pub const TRIGGER_TIMEOUT_SECS: u64 = 5;
/// Consecutive frames required to trigger
pub const TRIGGER_CONSECUTIVE_FRAMES: usize = 3;
/// Size of trigger history buffer
pub const TRIGGER_HISTORY_SIZE: usize = 10;
/// Video bitrate (Standard HD quality)
pub const VIDEO_BITRATE_HD: u32 = 5_000_000;
/// Recording - Audio Channel Capacity
pub const RECORDING_AUDIO_CHANNEL_CAPACITY: usize = 256;
/// Recording - Audio Thread Sleep Duration (ms)
pub const RECORDING_AUDIO_SLEEP_MS: u64 = 1;
/// Defaults
/// Default camera ID
pub const DEFAULT_CAMERA_ID: &str = "0";
/// Recording Quality Presets
/// Low quality preset ("low")
pub const RECORDING_QUALITY_PRESET_LOW: &str = "low";
/// 720p quality preset ("720p")
pub const RECORDING_QUALITY_PRESET_720P: &str = "720p";
/// Medium quality preset ("medium")
pub const RECORDING_QUALITY_PRESET_MEDIUM: &str = "medium";
/// 1080p quality preset ("1080p")
pub const RECORDING_QUALITY_PRESET_1080P: &str = "1080p";
/// High quality preset ("high")
pub const RECORDING_QUALITY_PRESET_HIGH: &str = "high";
/// 4K quality preset ("4k")
pub const RECORDING_QUALITY_PRESET_4K: &str = "4k";
/// Recording session ID prefix
pub const RECORDING_SESSION_PREFIX: &str = "rec_";
/// Permissions
/// Permission request timeout
pub const PERMISSION_REQUEST_TIMEOUT_SECS: u64 = 60;
/// macOS `AVMediaTypeVideo`
pub const AV_MEDIA_TYPE_VIDEO: &str = "vide";
/// Recording - Frame Drop Log Interval
pub const RECORDING_DROP_LOG_INTERVAL: u64 = 10;
/// Recording - Frame Jitter Tolerance (0.0-1.0)
/// Allows frames to be up to 20% early
pub const RECORDING_JITTER_TOLERANCE: f64 = 0.8;
/// Video bitrate (High quality/4K)
pub const VIDEO_BITRATE_4K: u32 = 10_000_000;
/// Video bitrate (Low quality/720p)
pub const VIDEO_BITRATE_SD: u32 = 2_500_000;