mirror of
https://github.com/weyne85/rustdesk.git
synced 2025-10-29 17:00:05 +00:00
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:
@@ -5,9 +5,9 @@ use hbb_common::{
|
||||
};
|
||||
use scrap::{
|
||||
aom::{AomDecoder, AomEncoder, AomEncoderConfig},
|
||||
codec::{EncoderApi, EncoderCfg, Quality as Q},
|
||||
convert_to_yuv, Capturer, Display, TraitCapturer, VpxDecoder, VpxDecoderConfig, VpxEncoder,
|
||||
VpxEncoderConfig,
|
||||
codec::{EncoderApi, EncoderCfg, ExtraEncoderCfg, Quality as Q},
|
||||
convert_to_yuv, Capturer, ColorRange, Display, TraitCapturer, VpxDecoder, VpxDecoderConfig,
|
||||
VpxEncoder, VpxEncoderConfig,
|
||||
VpxVideoCodecId::{self, *},
|
||||
STRIDE_ALIGN,
|
||||
};
|
||||
@@ -110,7 +110,15 @@ fn test_vpx(
|
||||
codec: codec_id,
|
||||
keyframe_interval: None,
|
||||
});
|
||||
let mut encoder = VpxEncoder::new(config, i444).unwrap();
|
||||
let extra = ExtraEncoderCfg {
|
||||
pixfmt: if i444 {
|
||||
scrap::Pixfmt::YUV444P
|
||||
} else {
|
||||
scrap::Pixfmt::YUV420P
|
||||
},
|
||||
range: ColorRange::Studio,
|
||||
};
|
||||
let mut encoder = VpxEncoder::new(config, extra).unwrap();
|
||||
let mut vpxs = vec![];
|
||||
let start = Instant::now();
|
||||
let mut size = 0;
|
||||
@@ -122,7 +130,7 @@ fn test_vpx(
|
||||
match c.frame(std::time::Duration::from_millis(30)) {
|
||||
Ok(frame) => {
|
||||
let tmp_timer = Instant::now();
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data);
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data).unwrap();
|
||||
for ref frame in encoder
|
||||
.encode(start.elapsed().as_millis() as _, &yuv, STRIDE_ALIGN)
|
||||
.unwrap()
|
||||
@@ -187,7 +195,15 @@ fn test_av1(
|
||||
quality,
|
||||
keyframe_interval: None,
|
||||
});
|
||||
let mut encoder = AomEncoder::new(config, i444).unwrap();
|
||||
let extra = ExtraEncoderCfg {
|
||||
pixfmt: if i444 {
|
||||
scrap::Pixfmt::YUV444P
|
||||
} else {
|
||||
scrap::Pixfmt::YUV420P
|
||||
},
|
||||
range: ColorRange::Studio,
|
||||
};
|
||||
let mut encoder = AomEncoder::new(config, extra).unwrap();
|
||||
let start = Instant::now();
|
||||
let mut size = 0;
|
||||
let mut av1s: Vec<Vec<u8>> = vec![];
|
||||
@@ -199,7 +215,7 @@ fn test_av1(
|
||||
match c.frame(std::time::Duration::from_millis(30)) {
|
||||
Ok(frame) => {
|
||||
let tmp_timer = Instant::now();
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data);
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data).unwrap();
|
||||
for ref frame in encoder
|
||||
.encode(start.elapsed().as_millis() as _, &yuv, STRIDE_ALIGN)
|
||||
.unwrap()
|
||||
@@ -274,6 +290,10 @@ mod hw {
|
||||
yuv_count: usize,
|
||||
h26xs: &mut Vec<Vec<u8>>,
|
||||
) {
|
||||
let extra = ExtraEncoderCfg {
|
||||
pixfmt: scrap::Pixfmt::NV12,
|
||||
range: ColorRange::Studio,
|
||||
};
|
||||
let mut encoder = HwEncoder::new(
|
||||
EncoderCfg::HW(HwEncoderConfig {
|
||||
name: info.name.clone(),
|
||||
@@ -282,7 +302,7 @@ mod hw {
|
||||
quality,
|
||||
keyframe_interval: None,
|
||||
}),
|
||||
false,
|
||||
extra,
|
||||
)
|
||||
.unwrap();
|
||||
let mut size = 0;
|
||||
@@ -295,7 +315,7 @@ mod hw {
|
||||
match c.frame(std::time::Duration::from_millis(30)) {
|
||||
Ok(frame) => {
|
||||
let tmp_timer = Instant::now();
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data);
|
||||
convert_to_yuv(&frame, encoder.yuvfmt(), &mut yuv, &mut mid_data).unwrap();
|
||||
for ref frame in encoder.encode(&yuv).unwrap() {
|
||||
size += frame.data.len();
|
||||
|
||||
|
||||
@@ -13,12 +13,12 @@ use std::time::{Duration, Instant};
|
||||
use std::{io, thread};
|
||||
|
||||
use docopt::Docopt;
|
||||
use scrap::codec::{EncoderApi, EncoderCfg, Quality as Q};
|
||||
use scrap::codec::{EncoderApi, EncoderCfg, ExtraEncoderCfg, Quality as Q};
|
||||
use webm::mux;
|
||||
use webm::mux::Track;
|
||||
|
||||
use scrap::{convert_to_yuv, vpxcodec as vpx_encode};
|
||||
use scrap::{Capturer, Display, TraitCapturer, STRIDE_ALIGN};
|
||||
use scrap::{Capturer, ColorRange, Display, TraitCapturer, STRIDE_ALIGN};
|
||||
|
||||
const USAGE: &'static str = "
|
||||
Simple WebM screen capture.
|
||||
@@ -110,6 +110,10 @@ fn main() -> io::Result<()> {
|
||||
Quality::Balanced => Q::Balanced,
|
||||
Quality::Low => Q::Low,
|
||||
};
|
||||
let extra = ExtraEncoderCfg {
|
||||
pixfmt: scrap::Pixfmt::YUV420P,
|
||||
range: ColorRange::Studio,
|
||||
};
|
||||
let mut vpx = vpx_encode::VpxEncoder::new(
|
||||
EncoderCfg::VPX(vpx_encode::VpxEncoderConfig {
|
||||
width,
|
||||
@@ -118,7 +122,7 @@ fn main() -> io::Result<()> {
|
||||
codec: vpx_codec,
|
||||
keyframe_interval: None,
|
||||
}),
|
||||
false,
|
||||
extra,
|
||||
)
|
||||
.unwrap();
|
||||
|
||||
@@ -152,7 +156,7 @@ fn main() -> io::Result<()> {
|
||||
|
||||
if let Ok(frame) = c.frame(Duration::from_millis(0)) {
|
||||
let ms = time.as_secs() * 1000 + time.subsec_millis() as u64;
|
||||
convert_to_yuv(&frame, vpx.yuvfmt(), &mut yuv, &mut mid_data);
|
||||
convert_to_yuv(&frame, vpx.yuvfmt(), &mut yuv, &mut mid_data).unwrap();
|
||||
for frame in vpx.encode(ms as i64, &yuv, STRIDE_ALIGN).unwrap() {
|
||||
vt.add_frame(frame.data, frame.pts as u64 * 1_000_000, frame.key);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user