videotoolbox ram codec (#8683)

* h265 encoding: the second frame always fails, use repeat encoding to achieve real-time encoding
* h264 encoding: Not supported because encoding fails too frequently, about 50%, with one failure followed by another success.
* h264/h265 decoding: No issues found.
* Does not support dynamically changing the bitrate and changing the quality by resetting the encoder.

Signed-off-by: 21pages <sunboeasy@gmail.com>
This commit is contained in:
21pages
2024-07-12 11:08:51 +08:00
committed by GitHub
parent 0ea88ce6ff
commit 821f7245b0
6 changed files with 22 additions and 21 deletions

View File

@@ -553,12 +553,12 @@ async fn handle(data: Data, stream: &mut Connection) {
);
}
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
Data::CheckHwcodec => {
scrap::hwcodec::start_check_process();
}
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
Data::HwCodecConfig(c) => {
match c {
None => {
@@ -1047,7 +1047,7 @@ pub async fn notify_server_to_check_hwcodec() -> ResultType<()> {
}
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
#[tokio::main(flavor = "current_thread")]
pub async fn get_hwcodec_config_from_server() -> ResultType<()> {
if !scrap::codec::enable_hwcodec_option() || scrap::hwcodec::HwCodecConfig::already_set() {
@@ -1070,7 +1070,7 @@ pub async fn get_hwcodec_config_from_server() -> ResultType<()> {
}
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
pub fn client_get_hwcodec_config_thread(wait_sec: u64) {
static ONCE: std::sync::Once = std::sync::Once::new();
if !crate::platform::is_installed()

View File

@@ -489,7 +489,7 @@ pub async fn start_server(is_server: bool) {
#[cfg(target_os = "windows")]
crate::platform::try_kill_broker();
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
scrap::hwcodec::start_check_process();
crate::RendezvousMediator::start_all().await;
} else {

View File

@@ -904,8 +904,7 @@ pub fn get_api_server() -> String {
#[inline]
pub fn has_hwcodec() -> bool {
// Has real hardware codec using gpu
(cfg!(feature = "hwcodec") && (cfg!(windows) || cfg!(target_os = "linux")))
|| cfg!(feature = "mediacodec")
(cfg!(feature = "hwcodec") && cfg!(not(target_os = "ios"))) || cfg!(feature = "mediacodec")
}
#[inline]
@@ -1408,7 +1407,7 @@ pub fn verify_bot(token: String) -> String {
pub fn check_hwcodec() {
#[cfg(feature = "hwcodec")]
#[cfg(any(target_os = "windows", target_os = "linux"))]
#[cfg(not(any(target_os = "android", target_os = "ios")))]
{
use std::sync::Once;
static ONCE: Once = Once::new();