d3b6026bfd
- Filled empty libs/hbb_common/ submodule (cloned from rustdesk/hbb_common) - Patched Flutter 3.44 / Dart 3.12 compatibility: * flutter/lib/generated_bridge.dart: asTypedList with cast<>, DartPort=Int64 * flutter/lib/common.dart: DialogTheme->DialogThemeData, TabBarTheme->TabBarThemeData * flutter/pubspec.yaml: extended_text 14.0.0->15.0.2, google_fonts override 5.0.0 * flutter/macos/Runner/Configs/Release.xcconfig: EXCLUDED_ARCHS=x86_64 - Build verified: cargo check + cargo build --features flutter + cargo build --release --features flutter - Verified flutter build macos --debug and --release both produce working .app - Verified .dmg installer (27MB arm64) created via hdiutil - Build deps: Xcode 26.5, CocoaPods 1.16.2, Flutter 3.44, VCPKG arm64-osx
59 lines
1.5 KiB
Rust
59 lines
1.5 KiB
Rust
use std::time::Duration;
|
|
|
|
use scrap::{Frame, TraitPixelBuffer};
|
|
|
|
extern crate scrap;
|
|
|
|
fn main() {
|
|
use scrap::{Capturer, Display, TraitCapturer};
|
|
use std::io::ErrorKind::WouldBlock;
|
|
use std::io::Write;
|
|
use std::process::{Command, Stdio};
|
|
|
|
let d = Display::primary().unwrap();
|
|
let (w, h) = (d.width(), d.height());
|
|
|
|
let child = Command::new("ffplay")
|
|
.args(&[
|
|
"-f",
|
|
"rawvideo",
|
|
"-pixel_format",
|
|
"bgr0",
|
|
"-video_size",
|
|
&format!("{}x{}", w, h),
|
|
"-framerate",
|
|
"60",
|
|
"-",
|
|
])
|
|
.stdin(Stdio::piped())
|
|
.spawn()
|
|
.expect("This example requires ffplay.");
|
|
|
|
let mut capturer = Capturer::new(d).unwrap();
|
|
let mut out = child.stdin.unwrap();
|
|
|
|
loop {
|
|
match capturer.frame(Duration::from_millis(0)) {
|
|
Ok(frame) => {
|
|
// Write the frame, removing end-of-row padding.
|
|
let Frame::PixelBuffer(frame) = frame else {
|
|
return;
|
|
};
|
|
let stride = frame.stride()[0];
|
|
let rowlen = 4 * w;
|
|
for row in frame.data().chunks(stride) {
|
|
let row = &row[..rowlen];
|
|
out.write_all(row).unwrap();
|
|
}
|
|
}
|
|
Err(ref e) if e.kind() == WouldBlock => {
|
|
// Wait for the frame.
|
|
}
|
|
Err(_) => {
|
|
// We're done here.
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|