diff --git a/libs/scrap/src/common/codec.rs b/libs/scrap/src/common/codec.rs index d729342d6..9535e9f3a 100644 --- a/libs/scrap/src/common/codec.rs +++ b/libs/scrap/src/common/codec.rs @@ -218,7 +218,7 @@ impl Encoder { #[inline] pub fn current_hw_encoder_name() -> Option { #[cfg(feature = "hwcodec")] - if check_hwcodec_config() { + if enable_hwcodec_option() { return HwEncoder::current_name().lock().unwrap().clone(); } else { return None; @@ -229,7 +229,7 @@ impl Encoder { pub fn supported_encoding() -> (bool, bool) { #[cfg(feature = "hwcodec")] - if check_hwcodec_config() { + if enable_hwcodec_option() { let best = HwEncoder::best(); ( best.h264.as_ref().map_or(false, |c| c.score > 0), @@ -246,7 +246,7 @@ impl Encoder { impl Decoder { pub fn video_codec_state(_id: &str) -> VideoCodecState { #[cfg(feature = "hwcodec")] - if check_hwcodec_config() { + if enable_hwcodec_option() { let best = HwDecoder::best(); return VideoCodecState { score_vpx: SCORE_VPX, @@ -257,7 +257,7 @@ impl Decoder { }; } #[cfg(feature = "mediacodec")] - if check_hwcodec_config() { + if enable_hwcodec_option() { let score_h264 = if H264_DECODER_SUPPORT.load(std::sync::atomic::Ordering::SeqCst) { 92 } else { @@ -287,11 +287,19 @@ impl Decoder { Decoder { vpx, #[cfg(feature = "hwcodec")] - hw: HwDecoder::new_decoders(), + hw: if enable_hwcodec_option() { + HwDecoder::new_decoders() + } else { + HwDecoders::default() + }, #[cfg(feature = "hwcodec")] i420: vec![], #[cfg(feature = "mediacodec")] - media_codec: MediaCodecDecoder::new_decoders(), + media_codec: if enable_hwcodec_option() { + MediaCodecDecoder::new_decoders() + } else { + MediaCodecDecoders::default() + }, } } @@ -415,7 +423,7 @@ impl Decoder { } #[cfg(any(feature = "hwcodec", feature = "mediacodec"))] -fn check_hwcodec_config() -> bool { +fn enable_hwcodec_option() -> bool { if let Some(v) = Config2::get().options.get("enable-hwcodec") { return v != "N"; } diff --git a/libs/scrap/src/common/hwcodec.rs b/libs/scrap/src/common/hwcodec.rs index 166f7516c..55c2309b5 100644 --- a/libs/scrap/src/common/hwcodec.rs +++ b/libs/scrap/src/common/hwcodec.rs @@ -94,7 +94,7 @@ impl EncoderApi for HwEncoder { frames.push(EncodedVideoFrame { data: Bytes::from(frame.data), pts: frame.pts as _, - key:frame.key == 1, + key: frame.key == 1, ..Default::default() }); } @@ -175,6 +175,7 @@ pub struct HwDecoder { pub info: CodecInfo, } +#[derive(Default)] pub struct HwDecoders { pub h264: Option, pub h265: Option, @@ -189,22 +190,28 @@ impl HwDecoder { } pub fn new_decoders() -> HwDecoders { + flog("enter new_decoders"); let best = HwDecoder::best(); + flog(&format!("best:${:?}", best)); let mut h264: Option = None; let mut h265: Option = None; let mut fail = false; if let Some(info) = best.h264 { + flog(&format!("before new h264 codec")); h264 = HwDecoder::new(info).ok(); if h264.is_none() { fail = true; } + flog(&format!("new h264 codec result:{:}", h264.is_some())); } if let Some(info) = best.h265 { + flog(&format!("before new h265 codec")); h265 = HwDecoder::new(info).ok(); if h265.is_none() { fail = true; } + flog(&format!("new h265 codec result:{:}", h265.is_some())); } if fail { check_config_process(true); @@ -321,11 +328,21 @@ pub fn check_config_process(force_reset: bool) { } if let Ok(exe) = std::env::current_exe() { std::thread::spawn(move || { - std::process::Command::new(exe) + let result = std::process::Command::new(exe) .arg("--check-hwcodec-config") .status() .ok(); + flog(&format!("check codec process run result:{:?}", result)); HwCodecConfig::refresh(); }); }; } + +pub fn flog(s: &str) { + use hbb_common::chrono::prelude::*; + use std::io::Write; + let mut option = std::fs::OpenOptions::new(); + if let Ok(mut f) = option.append(true).create(true).open("/tmp/log.txt") { + write!(&mut f, "{:?} {}\n", Local::now(), s).ok(); + } +} diff --git a/libs/scrap/src/common/mediacodec.rs b/libs/scrap/src/common/mediacodec.rs index fa821246c..406baecb5 100644 --- a/libs/scrap/src/common/mediacodec.rs +++ b/libs/scrap/src/common/mediacodec.rs @@ -37,6 +37,7 @@ impl Deref for MediaCodecDecoder { } } +#[derive(Default)] pub struct MediaCodecDecoders { pub h264: Option, pub h265: Option,