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()); | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -20,7 +20,7 @@ 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