use fullrange by default for yuv420p if supported (#6655)

1. Explicitly specify the color space as bt601
2. Use fullrange by default for yuv420p if supported
3. Use the pix_fmt space range format to identify codec capabilities, make i444 proto field deprecated, and cause the non-release version of 444 true color to fail.

Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
21pages
2023-12-11 22:31:01 +08:00
committed by GitHub
parent 2797a28c0d
commit 80afa98d66
15 changed files with 388 additions and 141 deletions

View File

@@ -252,8 +252,8 @@ impl<T: InvokeUiSession> Remote<T> {
}).collect::<HashMap<usize, i32>>();
let chroma = self.chroma.read().unwrap().clone();
let chroma = match chroma {
Some(Chroma::I444) => "4:4:4",
Some(Chroma::I420) => "4:2:0",
Some(Chroma::C444) => "4:4:4",
Some(Chroma::C420) => "4:2:0",
None => "-",
};
let chroma = Some(chroma.to_string());

View File

@@ -1416,6 +1416,15 @@ pub fn session_change_prefer_codec(session_id: SessionID) {
}
}
pub fn session_is_codec_support_444(session_id: SessionID, codec: String) -> SyncReturn<bool> {
let res = if let Some(session) = sessions::get_session_by_session_id(&session_id) {
session.is_codec_support_444(codec)
} else {
false
};
SyncReturn(res)
}
pub fn session_on_waiting_for_image_dialog_show(session_id: SessionID) {
super::flutter::session_on_waiting_for_image_dialog_show(session_id);
}

View File

@@ -400,8 +400,8 @@ fn run(vs: VideoService) -> ResultType<()> {
let encoder_cfg = get_encoder_config(&c, quality, last_recording);
let mut encoder;
let use_i444 = Encoder::use_i444(&encoder_cfg);
match Encoder::new(encoder_cfg.clone(), use_i444) {
let extra = Encoder::extra(&encoder_cfg);
match Encoder::new(encoder_cfg.clone(), extra) {
Ok(x) => encoder = x,
Err(err) => bail!("Failed to create encoder: {}", err),
}
@@ -456,7 +456,7 @@ fn run(vs: VideoService) -> ResultType<()> {
if last_portable_service_running != crate::portable_service::client::running() {
bail!("SWITCH");
}
if Encoder::use_i444(&encoder_cfg) != use_i444 {
if Encoder::extra(&encoder_cfg) != extra {
bail!("SWITCH");
}
check_privacy_mode_changed(&sp, c.privacy_mode_id)?;

View File

@@ -1230,6 +1230,17 @@ impl<T: InvokeUiSession> Session<T> {
pub fn close_voice_call(&self) {
self.send(Data::CloseVoiceCall);
}
pub fn is_codec_support_444(&self, codec: String) -> bool {
let codec = codec.to_uppercase();
let encoding = self.lc.read().unwrap().supported_encoding.clone();
// decoding support following
match codec.as_str() {
"VP9" => encoding.color_abilities.vp9.yuv444p_bt601_studio,
"AV1" => encoding.color_abilities.av1.yuv444p_bt601_studio,
_ => false,
}
}
}
pub trait InvokeUiSession: Send + Sync + Clone + 'static + Sized + Default {