commit
6e1f4cfeca
1
Cargo.lock
generated
1
Cargo.lock
generated
@ -4265,6 +4265,7 @@ dependencies = [
|
|||||||
"quest",
|
"quest",
|
||||||
"repng",
|
"repng",
|
||||||
"serde 1.0.136",
|
"serde 1.0.136",
|
||||||
|
"serde_json 1.0.79",
|
||||||
"target_build_utils",
|
"target_build_utils",
|
||||||
"tracing",
|
"tracing",
|
||||||
"webm",
|
"webm",
|
||||||
|
11
flutter/.gitignore
vendored
11
flutter/.gitignore
vendored
@ -45,3 +45,14 @@ jniLibs
|
|||||||
|
|
||||||
# flutter rust bridge
|
# flutter rust bridge
|
||||||
lib/generated_bridge.dart
|
lib/generated_bridge.dart
|
||||||
|
|
||||||
|
# Flutter Generated Files
|
||||||
|
linux/flutter/generated_plugin_registrant.cc
|
||||||
|
linux/flutter/generated_plugin_registrant.h
|
||||||
|
linux/flutter/generated_plugins.cmake
|
||||||
|
macos/Flutter/GeneratedPluginRegistrant.swift
|
||||||
|
windows/flutter/generated_plugin_registrant.cc
|
||||||
|
windows/flutter/generated_plugin_registrant.h
|
||||||
|
windows/flutter/generated_plugins.cmake
|
||||||
|
flutter_export_environment.sh
|
||||||
|
Flutter-Generated.xcconfig
|
@ -72,7 +72,13 @@ class MainService : Service() {
|
|||||||
@Keep
|
@Keep
|
||||||
fun rustGetByName(name: String): String {
|
fun rustGetByName(name: String): String {
|
||||||
return when (name) {
|
return when (name) {
|
||||||
"screen_size" -> "${SCREEN_INFO.width}:${SCREEN_INFO.height}"
|
"screen_size" -> {
|
||||||
|
JSONObject().apply {
|
||||||
|
put("width",SCREEN_INFO.width)
|
||||||
|
put("height",SCREEN_INFO.height)
|
||||||
|
put("scale",SCREEN_INFO.scale)
|
||||||
|
}.toString()
|
||||||
|
}
|
||||||
else -> ""
|
else -> ""
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -223,10 +223,10 @@ class AccessibilityListener extends StatelessWidget {
|
|||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Listener(
|
return Listener(
|
||||||
onPointerDown: (evt) {
|
onPointerDown: (evt) {
|
||||||
if (evt.size == 1 && GestureBinding.instance != null) {
|
if (evt.size == 1) {
|
||||||
GestureBinding.instance!.handlePointerEvent(PointerAddedEvent(
|
GestureBinding.instance.handlePointerEvent(PointerAddedEvent(
|
||||||
pointer: evt.pointer + offset, position: evt.position));
|
pointer: evt.pointer + offset, position: evt.position));
|
||||||
GestureBinding.instance!.handlePointerEvent(PointerDownEvent(
|
GestureBinding.instance.handlePointerEvent(PointerDownEvent(
|
||||||
pointer: evt.pointer + offset,
|
pointer: evt.pointer + offset,
|
||||||
size: 0.1,
|
size: 0.1,
|
||||||
position: evt.position));
|
position: evt.position));
|
||||||
@ -234,17 +234,17 @@ class AccessibilityListener extends StatelessWidget {
|
|||||||
},
|
},
|
||||||
onPointerUp: (evt) {
|
onPointerUp: (evt) {
|
||||||
if (evt.size == 1 && GestureBinding.instance != null) {
|
if (evt.size == 1 && GestureBinding.instance != null) {
|
||||||
GestureBinding.instance!.handlePointerEvent(PointerUpEvent(
|
GestureBinding.instance.handlePointerEvent(PointerUpEvent(
|
||||||
pointer: evt.pointer + offset,
|
pointer: evt.pointer + offset,
|
||||||
size: 0.1,
|
size: 0.1,
|
||||||
position: evt.position));
|
position: evt.position));
|
||||||
GestureBinding.instance!.handlePointerEvent(PointerRemovedEvent(
|
GestureBinding.instance.handlePointerEvent(PointerRemovedEvent(
|
||||||
pointer: evt.pointer + offset, position: evt.position));
|
pointer: evt.pointer + offset, position: evt.position));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onPointerMove: (evt) {
|
onPointerMove: (evt) {
|
||||||
if (evt.size == 1 && GestureBinding.instance != null) {
|
if (evt.size == 1 && GestureBinding.instance != null) {
|
||||||
GestureBinding.instance!.handlePointerEvent(PointerMoveEvent(
|
GestureBinding.instance.handlePointerEvent(PointerMoveEvent(
|
||||||
pointer: evt.pointer + offset,
|
pointer: evt.pointer + offset,
|
||||||
size: 0.1,
|
size: 0.1,
|
||||||
delta: evt.delta,
|
delta: evt.delta,
|
||||||
|
@ -45,7 +45,7 @@ class _RemotePageState extends State<RemotePage> {
|
|||||||
void initState() {
|
void initState() {
|
||||||
super.initState();
|
super.initState();
|
||||||
FFI.connect(widget.id);
|
FFI.connect(widget.id);
|
||||||
WidgetsBinding.instance!.addPostFrameCallback((_) {
|
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||||||
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, overlays: []);
|
||||||
showLoading(translate('Connecting...'));
|
showLoading(translate('Connecting...'));
|
||||||
_interval =
|
_interval =
|
||||||
|
@ -213,7 +213,7 @@ class HoldTapMoveGestureRecognizer extends GestureRecognizer {
|
|||||||
_stopSecondTapDownTimer();
|
_stopSecondTapDownTimer();
|
||||||
final _TapTracker tracker = _TapTracker(
|
final _TapTracker tracker = _TapTracker(
|
||||||
event: event,
|
event: event,
|
||||||
entry: GestureBinding.instance!.gestureArena.add(event.pointer, this),
|
entry: GestureBinding.instance.gestureArena.add(event.pointer, this),
|
||||||
doubleTapMinTime: kDoubleTapMinTime,
|
doubleTapMinTime: kDoubleTapMinTime,
|
||||||
gestureSettings: gestureSettings,
|
gestureSettings: gestureSettings,
|
||||||
);
|
);
|
||||||
@ -318,13 +318,13 @@ class HoldTapMoveGestureRecognizer extends GestureRecognizer {
|
|||||||
final _TapTracker tracker = _firstTap!;
|
final _TapTracker tracker = _firstTap!;
|
||||||
_firstTap = null;
|
_firstTap = null;
|
||||||
_reject(tracker);
|
_reject(tracker);
|
||||||
GestureBinding.instance!.gestureArena.release(tracker.pointer);
|
GestureBinding.instance.gestureArena.release(tracker.pointer);
|
||||||
|
|
||||||
if (_secondTap != null) {
|
if (_secondTap != null) {
|
||||||
final _TapTracker tracker = _secondTap!;
|
final _TapTracker tracker = _secondTap!;
|
||||||
_secondTap = null;
|
_secondTap = null;
|
||||||
_reject(tracker);
|
_reject(tracker);
|
||||||
GestureBinding.instance!.gestureArena.release(tracker.pointer);
|
GestureBinding.instance.gestureArena.release(tracker.pointer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
_firstTap = null;
|
_firstTap = null;
|
||||||
@ -334,7 +334,7 @@ class HoldTapMoveGestureRecognizer extends GestureRecognizer {
|
|||||||
|
|
||||||
void _registerFirstTap(_TapTracker tracker) {
|
void _registerFirstTap(_TapTracker tracker) {
|
||||||
_startFirstTapUpTimer();
|
_startFirstTapUpTimer();
|
||||||
GestureBinding.instance!.gestureArena.hold(tracker.pointer);
|
GestureBinding.instance.gestureArena.hold(tracker.pointer);
|
||||||
// Note, order is important below in order for the clear -> reject logic to
|
// Note, order is important below in order for the clear -> reject logic to
|
||||||
// work properly.
|
// work properly.
|
||||||
_freezeTracker(tracker);
|
_freezeTracker(tracker);
|
||||||
@ -350,7 +350,7 @@ class HoldTapMoveGestureRecognizer extends GestureRecognizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
_startSecondTapDownTimer();
|
_startSecondTapDownTimer();
|
||||||
GestureBinding.instance!.gestureArena.hold(tracker.pointer);
|
GestureBinding.instance.gestureArena.hold(tracker.pointer);
|
||||||
|
|
||||||
_secondTap = tracker;
|
_secondTap = tracker;
|
||||||
|
|
||||||
@ -463,7 +463,7 @@ class DoubleFinerTapGestureRecognizer extends GestureRecognizer {
|
|||||||
void _trackTap(PointerDownEvent event) {
|
void _trackTap(PointerDownEvent event) {
|
||||||
final _TapTracker tracker = _TapTracker(
|
final _TapTracker tracker = _TapTracker(
|
||||||
event: event,
|
event: event,
|
||||||
entry: GestureBinding.instance!.gestureArena.add(event.pointer, this),
|
entry: GestureBinding.instance.gestureArena.add(event.pointer, this),
|
||||||
doubleTapMinTime: kDoubleTapMinTime,
|
doubleTapMinTime: kDoubleTapMinTime,
|
||||||
gestureSettings: gestureSettings,
|
gestureSettings: gestureSettings,
|
||||||
);
|
);
|
||||||
@ -532,7 +532,7 @@ class DoubleFinerTapGestureRecognizer extends GestureRecognizer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _registerTap(_TapTracker tracker) {
|
void _registerTap(_TapTracker tracker) {
|
||||||
GestureBinding.instance!.gestureArena.hold(tracker.pointer);
|
GestureBinding.instance.gestureArena.hold(tracker.pointer);
|
||||||
// Note, order is important below in order for the clear -> reject logic to
|
// Note, order is important below in order for the clear -> reject logic to
|
||||||
// work properly.
|
// work properly.
|
||||||
}
|
}
|
||||||
@ -615,15 +615,14 @@ class _TapTracker {
|
|||||||
void startTrackingPointer(PointerRoute route, Matrix4? transform) {
|
void startTrackingPointer(PointerRoute route, Matrix4? transform) {
|
||||||
if (!_isTrackingPointer) {
|
if (!_isTrackingPointer) {
|
||||||
_isTrackingPointer = true;
|
_isTrackingPointer = true;
|
||||||
GestureBinding.instance!.pointerRouter
|
GestureBinding.instance.pointerRouter.addRoute(pointer, route, transform);
|
||||||
.addRoute(pointer, route, transform);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void stopTrackingPointer(PointerRoute route) {
|
void stopTrackingPointer(PointerRoute route) {
|
||||||
if (_isTrackingPointer) {
|
if (_isTrackingPointer) {
|
||||||
_isTrackingPointer = false;
|
_isTrackingPointer = false;
|
||||||
GestureBinding.instance!.pointerRouter.removeRoute(pointer, route);
|
GestureBinding.instance.pointerRouter.removeRoute(pointer, route);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,7 +56,7 @@ packages:
|
|||||||
name: collection
|
name: collection
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.15.0"
|
version: "1.16.0"
|
||||||
cross_file:
|
cross_file:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -126,7 +126,7 @@ packages:
|
|||||||
name: fake_async
|
name: fake_async
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.2.0"
|
version: "1.3.0"
|
||||||
ffi:
|
ffi:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -233,12 +233,10 @@ packages:
|
|||||||
flutter_smart_dialog:
|
flutter_smart_dialog:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
path: "."
|
name: flutter_smart_dialog
|
||||||
ref: HEAD
|
url: "https://pub.dartlang.org"
|
||||||
resolved-ref: c89ce60664cbc206cb98c1f407e86b8a766f4c0e
|
source: hosted
|
||||||
url: "https://github.com/Heap-Hop/flutter_smart_dialog.git"
|
version: "4.3.1"
|
||||||
source: git
|
|
||||||
version: "4.0.0"
|
|
||||||
flutter_test:
|
flutter_test:
|
||||||
dependency: "direct dev"
|
dependency: "direct dev"
|
||||||
description: flutter
|
description: flutter
|
||||||
@ -318,7 +316,7 @@ packages:
|
|||||||
name: js
|
name: js
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.6.3"
|
version: "0.6.4"
|
||||||
matcher:
|
matcher:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -332,7 +330,7 @@ packages:
|
|||||||
name: material_color_utilities
|
name: material_color_utilities
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.3"
|
version: "0.1.4"
|
||||||
meta:
|
meta:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -360,7 +358,7 @@ packages:
|
|||||||
name: path
|
name: path
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.0"
|
version: "1.8.1"
|
||||||
path_provider:
|
path_provider:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -455,9 +453,11 @@ packages:
|
|||||||
qr_code_scanner:
|
qr_code_scanner:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
name: qr_code_scanner
|
path: "."
|
||||||
url: "https://pub.dartlang.org"
|
ref: fix_break_changes_platform
|
||||||
source: hosted
|
resolved-ref: "0feca6f15042c279ff575c559a3430df917b623d"
|
||||||
|
url: "https://github.com/Heap-Hop/qr_code_scanner.git"
|
||||||
|
source: git
|
||||||
version: "0.7.0"
|
version: "0.7.0"
|
||||||
quiver:
|
quiver:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
@ -540,7 +540,7 @@ packages:
|
|||||||
name: source_span
|
name: source_span
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "1.8.1"
|
version: "1.8.2"
|
||||||
stack_trace:
|
stack_trace:
|
||||||
dependency: transitive
|
dependency: transitive
|
||||||
description:
|
description:
|
||||||
@ -575,7 +575,7 @@ packages:
|
|||||||
name: test_api
|
name: test_api
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "0.4.8"
|
version: "0.4.9"
|
||||||
toggle_switch:
|
toggle_switch:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -673,7 +673,7 @@ packages:
|
|||||||
name: vector_math
|
name: vector_math
|
||||||
url: "https://pub.dartlang.org"
|
url: "https://pub.dartlang.org"
|
||||||
source: hosted
|
source: hosted
|
||||||
version: "2.1.1"
|
version: "2.1.2"
|
||||||
wakelock:
|
wakelock:
|
||||||
dependency: "direct main"
|
dependency: "direct main"
|
||||||
description:
|
description:
|
||||||
@ -745,5 +745,5 @@ packages:
|
|||||||
source: hosted
|
source: hosted
|
||||||
version: "0.1.0"
|
version: "0.1.0"
|
||||||
sdks:
|
sdks:
|
||||||
dart: ">=2.16.1 <3.0.0"
|
dart: ">=2.17.0-0 <3.0.0"
|
||||||
flutter: ">=2.10.0"
|
flutter: ">=3.0.0"
|
||||||
|
@ -19,7 +19,7 @@ publish_to: 'none' # Remove this line if you wish to publish to pub.dev
|
|||||||
version: 1.1.10+27
|
version: 1.1.10+27
|
||||||
|
|
||||||
environment:
|
environment:
|
||||||
sdk: ">=2.16.1 <3.0.0"
|
sdk: ">=2.16.1"
|
||||||
|
|
||||||
dependencies:
|
dependencies:
|
||||||
flutter:
|
flutter:
|
||||||
@ -46,13 +46,14 @@ dependencies:
|
|||||||
settings_ui: ^2.0.2
|
settings_ui: ^2.0.2
|
||||||
flutter_breadcrumb: ^1.0.1
|
flutter_breadcrumb: ^1.0.1
|
||||||
http: ^0.13.4
|
http: ^0.13.4
|
||||||
qr_code_scanner: ^0.7.0
|
qr_code_scanner:
|
||||||
|
git:
|
||||||
|
url: https://github.com/Heap-Hop/qr_code_scanner.git
|
||||||
|
ref: fix_break_changes_platform
|
||||||
zxing2: ^0.1.0
|
zxing2: ^0.1.0
|
||||||
image_picker: ^0.8.5
|
image_picker: ^0.8.5
|
||||||
image: ^3.1.3
|
image: ^3.1.3
|
||||||
flutter_smart_dialog:
|
flutter_smart_dialog: ^4.3.1
|
||||||
git:
|
|
||||||
url: https://github.com/Heap-Hop/flutter_smart_dialog.git
|
|
||||||
flutter_rust_bridge: ^1.30.0
|
flutter_rust_bridge: ^1.30.0
|
||||||
|
|
||||||
dev_dependencies:
|
dev_dependencies:
|
||||||
|
@ -28,6 +28,7 @@ android_logger = "0.10"
|
|||||||
jni = "0.19"
|
jni = "0.19"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
|
serde_json = "1.0"
|
||||||
|
|
||||||
[target.'cfg(not(target_os = "android"))'.dev-dependencies]
|
[target.'cfg(not(target_os = "android"))'.dev-dependencies]
|
||||||
repng = "0.2"
|
repng = "0.2"
|
||||||
|
@ -1,11 +1,13 @@
|
|||||||
use crate::android::ffi::*;
|
use crate::android::ffi::*;
|
||||||
use crate::rgba_to_i420;
|
use crate::rgba_to_i420;
|
||||||
use lazy_static::lazy_static;
|
use lazy_static::lazy_static;
|
||||||
|
use serde_json::Value;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::io;
|
use std::io;
|
||||||
use std::sync::Mutex;
|
use std::sync::Mutex;
|
||||||
|
|
||||||
lazy_static! {
|
lazy_static! {
|
||||||
static ref SCREEN_SIZE: Mutex<(u16, u16)> = Mutex::new((0, 0));
|
static ref SCREEN_SIZE: Mutex<(u16, u16, u16)> = Mutex::new((0, 0, 0)); // (width, height, scale)
|
||||||
}
|
}
|
||||||
|
|
||||||
pub struct Capturer {
|
pub struct Capturer {
|
||||||
@ -65,9 +67,7 @@ impl Display {
|
|||||||
pub fn primary() -> io::Result<Display> {
|
pub fn primary() -> io::Result<Display> {
|
||||||
let mut size = SCREEN_SIZE.lock().unwrap();
|
let mut size = SCREEN_SIZE.lock().unwrap();
|
||||||
if size.0 == 0 || size.1 == 0 {
|
if size.0 == 0 || size.1 == 0 {
|
||||||
let (w, h) = get_size().unwrap_or((0, 0));
|
*size = get_size().unwrap_or_default();
|
||||||
size.0 = w;
|
|
||||||
size.1 = h;
|
|
||||||
}
|
}
|
||||||
Ok(Display {
|
Ok(Display {
|
||||||
default: true,
|
default: true,
|
||||||
@ -111,19 +111,33 @@ impl Display {
|
|||||||
|
|
||||||
pub fn refresh_size() {
|
pub fn refresh_size() {
|
||||||
let mut size = SCREEN_SIZE.lock().unwrap();
|
let mut size = SCREEN_SIZE.lock().unwrap();
|
||||||
let (w, h) = get_size().unwrap_or((0, 0));
|
*size = get_size().unwrap_or_default();
|
||||||
size.0 = w;
|
}
|
||||||
size.1 = h;
|
|
||||||
|
// Big android screen size will be shrinked, to improve performance when screen-capturing and encoding
|
||||||
|
// e.g 2280x1080 size will be set to 1140x540, and `scale` is 2
|
||||||
|
// need to multiply by `4` (2*2) when compute the bitrate
|
||||||
|
pub fn fix_quality() -> u16 {
|
||||||
|
let scale = SCREEN_SIZE.lock().unwrap().2;
|
||||||
|
if scale <= 0 {
|
||||||
|
1
|
||||||
|
} else {
|
||||||
|
scale * scale
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn get_size() -> Option<(u16, u16)> {
|
fn get_size() -> Option<(u16, u16, u16)> {
|
||||||
let res = call_main_service_get_by_name("screen_size").ok()?;
|
let res = call_main_service_get_by_name("screen_size").ok()?;
|
||||||
if res.len() > 0 {
|
if let Ok(json) = serde_json::from_str::<HashMap<String, Value>>(&res) {
|
||||||
let mut sp = res.split(":");
|
if let (Some(Value::Number(w)), Some(Value::Number(h)), Some(Value::Number(scale))) =
|
||||||
let w = sp.next()?.parse::<u16>().ok()?;
|
(json.get("width"), json.get("height"), json.get("scale"))
|
||||||
let h = sp.next()?.parse::<u16>().ok()?;
|
{
|
||||||
return Some((w, h));
|
let w = w.as_i64()? as _;
|
||||||
|
let h = h.as_i64()? as _;
|
||||||
|
let scale = scale.as_i64()? as _;
|
||||||
|
return Some((w, h, scale));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
|
@ -19,7 +19,7 @@ cfg_if! {
|
|||||||
} else if #[cfg(dxgi)] {
|
} else if #[cfg(dxgi)] {
|
||||||
mod dxgi;
|
mod dxgi;
|
||||||
pub use self::dxgi::*;
|
pub use self::dxgi::*;
|
||||||
} else if #[cfg(android)] {
|
} else if #[cfg(target_os = "android")] {
|
||||||
mod android;
|
mod android;
|
||||||
pub use self::android::*;
|
pub use self::android::*;
|
||||||
}else {
|
}else {
|
||||||
@ -36,9 +36,7 @@ mod vpx;
|
|||||||
|
|
||||||
#[inline]
|
#[inline]
|
||||||
pub fn would_block_if_equal(old: &mut Vec<u128>, b: &[u8]) -> std::io::Result<()> {
|
pub fn would_block_if_equal(old: &mut Vec<u128>, b: &[u8]) -> std::io::Result<()> {
|
||||||
let b = unsafe {
|
let b = unsafe { std::slice::from_raw_parts::<u128>(b.as_ptr() as _, b.len() / 16) };
|
||||||
std::slice::from_raw_parts::<u128>(b.as_ptr() as _, b.len() / 16)
|
|
||||||
};
|
|
||||||
if b == &old[..] {
|
if b == &old[..] {
|
||||||
return Err(std::io::ErrorKind::WouldBlock.into());
|
return Err(std::io::ErrorKind::WouldBlock.into());
|
||||||
}
|
}
|
||||||
|
@ -14,13 +14,13 @@ pub mod quartz;
|
|||||||
#[cfg(x11)]
|
#[cfg(x11)]
|
||||||
pub mod x11;
|
pub mod x11;
|
||||||
|
|
||||||
#[cfg(all(x11, feature="wayland"))]
|
#[cfg(all(x11, feature = "wayland"))]
|
||||||
pub mod wayland;
|
pub mod wayland;
|
||||||
|
|
||||||
#[cfg(dxgi)]
|
#[cfg(dxgi)]
|
||||||
pub mod dxgi;
|
pub mod dxgi;
|
||||||
|
|
||||||
#[cfg(android)]
|
#[cfg(target_os = "android")]
|
||||||
pub mod android;
|
pub mod android;
|
||||||
|
|
||||||
mod common;
|
mod common;
|
||||||
|
@ -567,5 +567,15 @@ fn get_quality(w: usize, h: usize, q: i32) -> (u32, u32, u32, i32) {
|
|||||||
let bitrate = q >> 8 & 0xFF;
|
let bitrate = q >> 8 & 0xFF;
|
||||||
let quantizer = q & 0xFF;
|
let quantizer = q & 0xFF;
|
||||||
let b = ((w * h) / 1000) as u32;
|
let b = ((w * h) / 1000) as u32;
|
||||||
|
|
||||||
|
#[cfg(target_os = "android")]
|
||||||
|
{
|
||||||
|
// fix when andorid screen shrinks
|
||||||
|
let fix = Display::fix_quality() as u32;
|
||||||
|
log::debug!("Android screen, fix quality:{}", fix);
|
||||||
|
let b = b * fix;
|
||||||
|
return (bitrate as u32 * b / 100, quantizer as _, 56, 7);
|
||||||
|
}
|
||||||
|
|
||||||
(bitrate as u32 * b / 100, quantizer as _, 56, 7)
|
(bitrate as u32 * b / 100, quantizer as _, 56, 7)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user