diff --git a/Cargo.lock b/Cargo.lock index 6e17784ce..b07495ad3 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2236,7 +2236,7 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hwcodec" version = "0.1.0" -source = "git+https://github.com/21pages/hwcodec#1cfe82f08f254e88f18cea1ad7c332f1c28dc1b9" +source = "git+https://github.com/21pages/hwcodec#888af61b3e960d30ef1f2e49eb0bcf9f6f7a14ee" dependencies = [ "bindgen", "cc", diff --git a/libs/scrap/src/common/codec.rs b/libs/scrap/src/common/codec.rs index a0961d0e6..66e8963f3 100644 --- a/libs/scrap/src/common/codec.rs +++ b/libs/scrap/src/common/codec.rs @@ -12,7 +12,7 @@ use crate::vpxcodec::*; use hbb_common::{ anyhow::anyhow, log, - message_proto::{video_frame, ImageQuality, Message, VP9s, VideoCodecState}, + message_proto::{video_frame, Message, VP9s, VideoCodecState}, ResultType, }; #[cfg(feature = "hwcodec")] @@ -31,7 +31,7 @@ pub struct HwEncoderConfig { pub codec_name: String, pub width: usize, pub height: usize, - pub quallity: ImageQuality, + pub bitrate_ratio: i32, } #[derive(Debug, Clone)] diff --git a/libs/scrap/src/common/hwcodec.rs b/libs/scrap/src/common/hwcodec.rs index 338045526..6393be3eb 100644 --- a/libs/scrap/src/common/hwcodec.rs +++ b/libs/scrap/src/common/hwcodec.rs @@ -5,7 +5,7 @@ use crate::{ use hbb_common::{ anyhow::{anyhow, Context}, lazy_static, log, - message_proto::{H264s, H265s, ImageQuality, Message, VideoFrame, H264, H265}, + message_proto::{H264s, H265s, Message, VideoFrame, H264, H265}, ResultType, }; use hwcodec::{ @@ -47,7 +47,7 @@ impl EncoderApi for HwEncoder { match cfg { EncoderCfg::HW(config) => { let (bitrate, timebase, gop, quality, rc) = - HwEncoder::convert_quality(&config.codec_name, config.quallity); + HwEncoder::convert_quality(&config.codec_name, config.bitrate_ratio); let ctx = EncodeContext { name: config.codec_name.clone(), width: config.width as _, @@ -192,36 +192,26 @@ impl HwEncoder { } } - fn convert_quality(name: &str, q: ImageQuality) -> (i32, [i32; 2], i32, Quality, RateContorl) { + fn convert_quality( + name: &str, + bitrate_ratio: i32, + ) -> (i32, [i32; 2], i32, Quality, RateContorl) { // TODO - let bitrate = if name.contains("qsv") { + let mut bitrate = if name.contains("qsv") { 1_000_000 } else { 2_000_000 }; - match q { - ImageQuality::Low => ( - bitrate / 2, - DEFAULT_TIME_BASE, - DEFAULT_GOP, - DEFAULT_HW_QUALITY, - DEFAULT_RC, - ), - ImageQuality::Best => ( - bitrate * 2, - DEFAULT_TIME_BASE, - DEFAULT_GOP, - DEFAULT_HW_QUALITY, - DEFAULT_RC, - ), - ImageQuality::NotSet | ImageQuality::Balanced => ( - 0, - DEFAULT_TIME_BASE, - DEFAULT_GOP, - DEFAULT_HW_QUALITY, - DEFAULT_RC, - ), - } + if bitrate_ratio > 0 && bitrate_ratio <= 200 { + bitrate = bitrate * bitrate_ratio / 100; + }; + ( + bitrate, + DEFAULT_TIME_BASE, + DEFAULT_GOP, + DEFAULT_HW_QUALITY, + DEFAULT_RC, + ) } } diff --git a/src/server/video_service.rs b/src/server/video_service.rs index 46716b228..f3da166db 100644 --- a/src/server/video_service.rs +++ b/src/server/video_service.rs @@ -186,7 +186,7 @@ fn run(sp: GenericService) -> ResultType<()> { codec_name, width, height, - quallity: convert_quality_back(q), + bitrate_ratio: q >> 8, }), None => EncoderCfg::VPX(VpxEncoderConfig { width: width as _, @@ -516,20 +516,6 @@ fn convert_quality(q: i32) -> i32 { } } -fn convert_quality_back(q: i32) -> ImageQuality { - let q = q >> 8; - if q == 100 * 2 / 3 { - ImageQuality::Balanced - } else if q == 100 / 2 { - ImageQuality::Low - } else if q == 100 { - ImageQuality::Best - } else { - log::error!("Error convert quality:{}", q); - ImageQuality::Balanced - } -} - pub fn update_image_quality(id: i32, q: Option) { match q { Some(q) => {