android: for software encoding and screen size > 1200, display size reduced to half (#8167)
Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
		
							parent
							
								
									b0c21e927b
								
							
						
					
					
						commit
						036d10cfbe
					
				| @ -55,6 +55,8 @@ const val MIME_TYPE = MediaFormat.MIMETYPE_VIDEO_VP9 | |||||||
| 
 | 
 | ||||||
| // video const | // video const | ||||||
| 
 | 
 | ||||||
|  | const val MAX_SCREEN_SIZE = 1200 | ||||||
|  | 
 | ||||||
| const val VIDEO_KEY_BIT_RATE = 1024_000 | const val VIDEO_KEY_BIT_RATE = 1024_000 | ||||||
| const val VIDEO_KEY_FRAME_RATE = 30 | const val VIDEO_KEY_FRAME_RATE = 30 | ||||||
| 
 | 
 | ||||||
| @ -170,6 +172,14 @@ class MainService : Service() { | |||||||
|                 Log.d(logTag, "from rust:stop_capture") |                 Log.d(logTag, "from rust:stop_capture") | ||||||
|                 stopCapture() |                 stopCapture() | ||||||
|             } |             } | ||||||
|  |             "is_hardware_codec" -> { | ||||||
|  |                 val isHwCodec = arg1.toBoolean() | ||||||
|  |                 if (isHardwareCodec != isHwCodec) { | ||||||
|  |                     isHardwareCodec = isHwCodec | ||||||
|  |                     updateScreenInfo(resources.configuration.orientation) | ||||||
|  |                 } | ||||||
|  |                  | ||||||
|  |             } | ||||||
|             else -> { |             else -> { | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| @ -245,6 +255,7 @@ class MainService : Service() { | |||||||
|         super.onDestroy() |         super.onDestroy() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |     private var isHardwareCodec: Boolean? = null; | ||||||
|     private fun updateScreenInfo(orientation: Int) { |     private fun updateScreenInfo(orientation: Int) { | ||||||
|         var w: Int |         var w: Int | ||||||
|         var h: Int |         var h: Int | ||||||
| @ -277,6 +288,12 @@ class MainService : Service() { | |||||||
|         Log.d(logTag,"updateScreenInfo:w:$w,h:$h") |         Log.d(logTag,"updateScreenInfo:w:$w,h:$h") | ||||||
|         var scale = 1 |         var scale = 1 | ||||||
|         if (w != 0 && h != 0) { |         if (w != 0 && h != 0) { | ||||||
|  |             if (isHardwareCodec == false && (w > MAX_SCREEN_SIZE || h > MAX_SCREEN_SIZE)) { | ||||||
|  |                 scale = 2 | ||||||
|  |                 w /= scale | ||||||
|  |                 h /= scale | ||||||
|  |                 dpi /= scale | ||||||
|  |             } | ||||||
|             if (SCREEN_INFO.width != w) { |             if (SCREEN_INFO.width != w) { | ||||||
|                 SCREEN_INFO.width = w |                 SCREEN_INFO.width = w | ||||||
|                 SCREEN_INFO.height = h |                 SCREEN_INFO.height = h | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ use std::sync::Mutex; | |||||||
| use std::{io, time::Duration}; | use std::{io, time::Duration}; | ||||||
| 
 | 
 | ||||||
| lazy_static! { | lazy_static! { | ||||||
|     static ref SCREEN_SIZE: Mutex<(u16, u16, u16)> = Mutex::new((0, 0, 0)); // (width, height, scale)
 |    pub(crate)  static ref SCREEN_SIZE: Mutex<(u16, u16, u16)> = Mutex::new((0, 0, 0)); // (width, height, scale)
 | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct Capturer { | pub struct Capturer { | ||||||
|  | |||||||
| @ -304,6 +304,10 @@ impl EncoderApi for AomEncoder { | |||||||
|     fn latency_free(&self) -> bool { |     fn latency_free(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn is_hardware(&self) -> bool { | ||||||
|  |         false | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl AomEncoder { | impl AomEncoder { | ||||||
|  | |||||||
| @ -74,6 +74,8 @@ pub trait EncoderApi { | |||||||
|     fn support_changing_quality(&self) -> bool; |     fn support_changing_quality(&self) -> bool; | ||||||
| 
 | 
 | ||||||
|     fn latency_free(&self) -> bool; |     fn latency_free(&self) -> bool; | ||||||
|  | 
 | ||||||
|  |     fn is_hardware(&self) -> bool; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct Encoder { | pub struct Encoder { | ||||||
|  | |||||||
| @ -213,6 +213,14 @@ pub fn convert_to_yuv( | |||||||
|         ); |         ); | ||||||
|     } |     } | ||||||
|     if src_pixfmt == crate::Pixfmt::BGRA || src_pixfmt == crate::Pixfmt::RGBA { |     if src_pixfmt == crate::Pixfmt::BGRA || src_pixfmt == crate::Pixfmt::RGBA { | ||||||
|  |         // stride is calculated, not real, so we need to check it
 | ||||||
|  |         if src_stride[0] < src_width * 4 { | ||||||
|  |             bail!( | ||||||
|  |                 "src_stride[0] < src_width * 4: {} < {}", | ||||||
|  |                 src_stride[0], | ||||||
|  |                 src_width * 4 | ||||||
|  |             ); | ||||||
|  |         } | ||||||
|         if src.len() < src_stride[0] * src_height { |         if src.len() < src_stride[0] * src_height { | ||||||
|             bail!( |             bail!( | ||||||
|                 "wrong src len, {} < {} * {}", |                 "wrong src len, {} < {} * {}", | ||||||
|  | |||||||
| @ -198,6 +198,10 @@ impl EncoderApi for HwRamEncoder { | |||||||
|     fn latency_free(&self) -> bool { |     fn latency_free(&self) -> bool { | ||||||
|         !self.config.name.contains("mediacodec") |         !self.config.name.contains("mediacodec") | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn is_hardware(&self) -> bool { | ||||||
|  |         true | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl HwRamEncoder { | impl HwRamEncoder { | ||||||
|  | |||||||
| @ -481,3 +481,8 @@ pub trait GoogleImage { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #[cfg(target_os = "android")] | ||||||
|  | pub fn screen_size() -> (u16, u16, u16) { | ||||||
|  |     SCREEN_SIZE.lock().unwrap().clone() | ||||||
|  | } | ||||||
|  | |||||||
| @ -242,6 +242,10 @@ impl EncoderApi for VpxEncoder { | |||||||
|     fn latency_free(&self) -> bool { |     fn latency_free(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn is_hardware(&self) -> bool { | ||||||
|  |         false | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl VpxEncoder { | impl VpxEncoder { | ||||||
|  | |||||||
| @ -188,6 +188,10 @@ impl EncoderApi for VRamEncoder { | |||||||
|     fn latency_free(&self) -> bool { |     fn latency_free(&self) -> bool { | ||||||
|         true |         true | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|  |     fn is_hardware(&self) -> bool { | ||||||
|  |         true | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl VRamEncoder { | impl VRamEncoder { | ||||||
|  | |||||||
| @ -444,6 +444,8 @@ fn run(vs: VideoService) -> ResultType<()> { | |||||||
|     }; |     }; | ||||||
|     #[cfg(feature = "vram")] |     #[cfg(feature = "vram")] | ||||||
|     c.set_output_texture(encoder.input_texture()); |     c.set_output_texture(encoder.input_texture()); | ||||||
|  |     #[cfg(target_os = "android")] | ||||||
|  |     check_change_scale(encoder.is_hardware())?; | ||||||
|     VIDEO_QOS.lock().unwrap().store_bitrate(encoder.bitrate()); |     VIDEO_QOS.lock().unwrap().store_bitrate(encoder.bitrate()); | ||||||
|     VIDEO_QOS |     VIDEO_QOS | ||||||
|         .lock() |         .lock() | ||||||
| @ -493,22 +495,31 @@ fn run(vs: VideoService) -> ResultType<()> { | |||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         if client_record != video_qos.record() { |         if client_record != video_qos.record() { | ||||||
|  |             log::info!("switch due to record changed"); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         drop(video_qos); |         drop(video_qos); | ||||||
| 
 | 
 | ||||||
|         if sp.is_option_true(OPTION_REFRESH) { |         if sp.is_option_true(OPTION_REFRESH) { | ||||||
|             let _ = try_broadcast_display_changed(&sp, display_idx, &c); |             let _ = try_broadcast_display_changed(&sp, display_idx, &c); | ||||||
|  |             log::info!("switch to refresh"); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         if codec_format != Encoder::negotiated_codec() { |         if codec_format != Encoder::negotiated_codec() { | ||||||
|  |             log::info!( | ||||||
|  |                 "switch due to codec changed, {:?} -> {:?}", | ||||||
|  |                 codec_format, | ||||||
|  |                 Encoder::negotiated_codec() | ||||||
|  |             ); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         #[cfg(windows)] |         #[cfg(windows)] | ||||||
|         if last_portable_service_running != crate::portable_service::client::running() { |         if last_portable_service_running != crate::portable_service::client::running() { | ||||||
|  |             log::info!("switch due to portable service running changed"); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         if Encoder::use_i444(&encoder_cfg) != use_i444 { |         if Encoder::use_i444(&encoder_cfg) != use_i444 { | ||||||
|  |             log::info!("switch due to i444 changed"); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         #[cfg(all(windows, feature = "vram"))] |         #[cfg(all(windows, feature = "vram"))] | ||||||
| @ -811,6 +822,26 @@ fn get_recorder( | |||||||
|     recorder |     recorder | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[cfg(target_os = "android")] | ||||||
|  | fn check_change_scale(hardware: bool) -> ResultType<()> { | ||||||
|  |     let screen_size = scrap::screen_size(); | ||||||
|  |     log::info!("hardware: {hardware}, screen_size: {screen_size:?}",); | ||||||
|  |     scrap::android::call_main_service_set_by_name( | ||||||
|  |         "is_hardware_codec", | ||||||
|  |         Some(hardware.to_string().as_str()), | ||||||
|  |         None, | ||||||
|  |     ) | ||||||
|  |     .ok(); | ||||||
|  |     let old_scale = screen_size.2; | ||||||
|  |     let new_scale = scrap::screen_size().2; | ||||||
|  |     if old_scale != new_scale { | ||||||
|  |         log::info!("switch due to scale changed, {old_scale} -> {new_scale}"); | ||||||
|  |         // switch is not a must, but it is better to do so.
 | ||||||
|  |         bail!("SWITCH"); | ||||||
|  |     } | ||||||
|  |     Ok(()) | ||||||
|  | } | ||||||
|  | 
 | ||||||
| fn check_privacy_mode_changed(sp: &GenericService, privacy_mode_id: i32) -> ResultType<()> { | fn check_privacy_mode_changed(sp: &GenericService, privacy_mode_id: i32) -> ResultType<()> { | ||||||
|     let privacy_mode_id_2 = get_privacy_mode_conn_id().unwrap_or(INVALID_PRIVACY_MODE_CONN_ID); |     let privacy_mode_id_2 = get_privacy_mode_conn_id().unwrap_or(INVALID_PRIVACY_MODE_CONN_ID); | ||||||
|     if privacy_mode_id != privacy_mode_id_2 { |     if privacy_mode_id != privacy_mode_id_2 { | ||||||
| @ -821,6 +852,7 @@ fn check_privacy_mode_changed(sp: &GenericService, privacy_mode_id: i32) -> Resu | |||||||
|             ); |             ); | ||||||
|             sp.send_to_others(msg_out, privacy_mode_id_2); |             sp.send_to_others(msg_out, privacy_mode_id_2); | ||||||
|         } |         } | ||||||
|  |         log::info!("switch due to privacy mode changed"); | ||||||
|         bail!("SWITCH"); |         bail!("SWITCH"); | ||||||
|     } |     } | ||||||
|     Ok(()) |     Ok(()) | ||||||
| @ -838,6 +870,7 @@ fn handle_one_frame( | |||||||
|     sp.snapshot(|sps| { |     sp.snapshot(|sps| { | ||||||
|         // so that new sub and old sub share the same encoder after switch
 |         // so that new sub and old sub share the same encoder after switch
 | ||||||
|         if sps.has_subscribes() { |         if sps.has_subscribes() { | ||||||
|  |             log::info!("switch due to new subscriber"); | ||||||
|             bail!("SWITCH"); |             bail!("SWITCH"); | ||||||
|         } |         } | ||||||
|         Ok(()) |         Ok(()) | ||||||
| @ -858,6 +891,7 @@ fn handle_one_frame( | |||||||
|         } |         } | ||||||
|         Err(e) => match e.to_string().as_str() { |         Err(e) => match e.to_string().as_str() { | ||||||
|             scrap::codec::ENCODE_NEED_SWITCH => { |             scrap::codec::ENCODE_NEED_SWITCH => { | ||||||
|  |                 log::info!("switch due to encoder need switch"); | ||||||
|                 bail!("SWITCH"); |                 bail!("SWITCH"); | ||||||
|             } |             } | ||||||
|             _ => {} |             _ => {} | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user