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

@@ -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();

View File

@@ -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);
}