mirror of
https://github.com/rustdesk/rustdesk.git
synced 2024-12-03 19:39:20 +08:00
av1 record, set zero codec private
Signed-off-by: 21pages <pages21@163.com>
This commit is contained in:
parent
c61fa71a70
commit
510cffb305
10
Cargo.lock
generated
10
Cargo.lock
generated
@ -6712,18 +6712,16 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webm"
|
name = "webm"
|
||||||
version = "1.0.2"
|
version = "1.1.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/21pages/rust-webm#d2c4d3ac133c7b0e4c0f656da710b48391981e64"
|
||||||
checksum = "ecb047148a12ef1fd8ab26302bca7e82036f005c3073b48e17cc1b44ec577136"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"webm-sys",
|
"webm-sys",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "webm-sys"
|
name = "webm-sys"
|
||||||
version = "1.0.3"
|
version = "1.0.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "git+https://github.com/21pages/rust-webm#d2c4d3ac133c7b0e4c0f656da710b48391981e64"
|
||||||
checksum = "0ded6ec82ccf51fe265b0b2b1579cac839574ed910c17baac58e807f8a9de7f3"
|
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"cc",
|
"cc",
|
||||||
]
|
]
|
||||||
|
@ -19,7 +19,7 @@ cfg-if = "1.0"
|
|||||||
num_cpus = "1.15"
|
num_cpus = "1.15"
|
||||||
lazy_static = "1.4"
|
lazy_static = "1.4"
|
||||||
hbb_common = { path = "../hbb_common" }
|
hbb_common = { path = "../hbb_common" }
|
||||||
webm = "1.0"
|
webm = { git = "https://github.com/21pages/rust-webm" }
|
||||||
|
|
||||||
[dependencies.winapi]
|
[dependencies.winapi]
|
||||||
version = "0.3"
|
version = "0.3"
|
||||||
|
@ -51,7 +51,10 @@ impl RecorderContext {
|
|||||||
+ &self.id.clone()
|
+ &self.id.clone()
|
||||||
+ &chrono::Local::now().format("_%Y%m%d%H%M%S_").to_string()
|
+ &chrono::Local::now().format("_%Y%m%d%H%M%S_").to_string()
|
||||||
+ &self.format.to_string()
|
+ &self.format.to_string()
|
||||||
+ if self.format == CodecFormat::VP9 || self.format == CodecFormat::VP8 {
|
+ if self.format == CodecFormat::VP9
|
||||||
|
|| self.format == CodecFormat::VP8
|
||||||
|
|| self.format == CodecFormat::AV1
|
||||||
|
{
|
||||||
".webm"
|
".webm"
|
||||||
} else {
|
} else {
|
||||||
".mp4"
|
".mp4"
|
||||||
@ -103,7 +106,7 @@ impl Recorder {
|
|||||||
pub fn new(mut ctx: RecorderContext) -> ResultType<Self> {
|
pub fn new(mut ctx: RecorderContext) -> ResultType<Self> {
|
||||||
ctx.set_filename()?;
|
ctx.set_filename()?;
|
||||||
let recorder = match ctx.format {
|
let recorder = match ctx.format {
|
||||||
CodecFormat::VP8 | CodecFormat::VP9 => Recorder {
|
CodecFormat::VP8 | CodecFormat::VP9 | CodecFormat::AV1 => Recorder {
|
||||||
inner: Box::new(WebmRecorder::new(ctx.clone())?),
|
inner: Box::new(WebmRecorder::new(ctx.clone())?),
|
||||||
ctx,
|
ctx,
|
||||||
},
|
},
|
||||||
@ -122,7 +125,9 @@ impl Recorder {
|
|||||||
fn change(&mut self, mut ctx: RecorderContext) -> ResultType<()> {
|
fn change(&mut self, mut ctx: RecorderContext) -> ResultType<()> {
|
||||||
ctx.set_filename()?;
|
ctx.set_filename()?;
|
||||||
self.inner = match ctx.format {
|
self.inner = match ctx.format {
|
||||||
CodecFormat::VP8 | CodecFormat::VP9 => Box::new(WebmRecorder::new(ctx.clone())?),
|
CodecFormat::VP8 | CodecFormat::VP9 | CodecFormat::AV1 => {
|
||||||
|
Box::new(WebmRecorder::new(ctx.clone())?)
|
||||||
|
}
|
||||||
#[cfg(feature = "hwcodec")]
|
#[cfg(feature = "hwcodec")]
|
||||||
_ => Box::new(HwRecorder::new(ctx.clone())?),
|
_ => Box::new(HwRecorder::new(ctx.clone())?),
|
||||||
#[cfg(not(feature = "hwcodec"))]
|
#[cfg(not(feature = "hwcodec"))]
|
||||||
@ -161,6 +166,15 @@ impl Recorder {
|
|||||||
}
|
}
|
||||||
vp9s.frames.iter().map(|f| self.write_video(f)).count();
|
vp9s.frames.iter().map(|f| self.write_video(f)).count();
|
||||||
}
|
}
|
||||||
|
video_frame::Union::Av1s(av1s) => {
|
||||||
|
if self.ctx.format != CodecFormat::AV1 {
|
||||||
|
self.change(RecorderContext {
|
||||||
|
format: CodecFormat::AV1,
|
||||||
|
..self.ctx.clone()
|
||||||
|
})?;
|
||||||
|
}
|
||||||
|
av1s.frames.iter().map(|f| self.write_video(f)).count();
|
||||||
|
}
|
||||||
#[cfg(feature = "hwcodec")]
|
#[cfg(feature = "hwcodec")]
|
||||||
video_frame::Union::H264s(h264s) => {
|
video_frame::Union::H264s(h264s) => {
|
||||||
if self.ctx.format != CodecFormat::H264 {
|
if self.ctx.format != CodecFormat::H264 {
|
||||||
@ -227,10 +241,17 @@ impl RecorderApi for WebmRecorder {
|
|||||||
None,
|
None,
|
||||||
if ctx.format == CodecFormat::VP9 {
|
if ctx.format == CodecFormat::VP9 {
|
||||||
mux::VideoCodecId::VP9
|
mux::VideoCodecId::VP9
|
||||||
} else {
|
} else if ctx.format == CodecFormat::VP8 {
|
||||||
mux::VideoCodecId::VP8
|
mux::VideoCodecId::VP8
|
||||||
|
} else {
|
||||||
|
mux::VideoCodecId::AV1
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
if ctx.format == CodecFormat::AV1 {
|
||||||
|
// [129, 8, 12, 0] in 3.6.0, but zero works
|
||||||
|
let codec_private = vec![0, 0, 0, 0];
|
||||||
|
webm.set_codec_private(vt.track_number(), &codec_private);
|
||||||
|
}
|
||||||
Ok(WebmRecorder {
|
Ok(WebmRecorder {
|
||||||
vt,
|
vt,
|
||||||
webm: Some(webm),
|
webm: Some(webm),
|
||||||
|
@ -436,8 +436,7 @@ fn run(vs: VideoService) -> ResultType<()> {
|
|||||||
log::info!("init quality={:?}, abr enabled:{}", quality, abr);
|
log::info!("init quality={:?}, abr enabled:{}", quality, abr);
|
||||||
let codec_name = Encoder::negotiated_codec();
|
let codec_name = Encoder::negotiated_codec();
|
||||||
let recorder = get_recorder(c.width, c.height, &codec_name);
|
let recorder = get_recorder(c.width, c.height, &codec_name);
|
||||||
let last_recording =
|
let last_recording = recorder.lock().unwrap().is_some() || video_qos.record();
|
||||||
(recorder.lock().unwrap().is_some() || video_qos.record()) && codec_name != CodecName::AV1;
|
|
||||||
drop(video_qos);
|
drop(video_qos);
|
||||||
let encoder_cfg = get_encoder_config(&c, quality, last_recording);
|
let encoder_cfg = get_encoder_config(&c, quality, last_recording);
|
||||||
|
|
||||||
@ -479,8 +478,7 @@ fn run(vs: VideoService) -> ResultType<()> {
|
|||||||
allow_err!(encoder.set_quality(quality));
|
allow_err!(encoder.set_quality(quality));
|
||||||
video_qos.store_bitrate(encoder.bitrate());
|
video_qos.store_bitrate(encoder.bitrate());
|
||||||
}
|
}
|
||||||
let recording = (recorder.lock().unwrap().is_some() || video_qos.record())
|
let recording = recorder.lock().unwrap().is_some() || video_qos.record();
|
||||||
&& codec_name != CodecName::AV1;
|
|
||||||
if recording != last_recording {
|
if recording != last_recording {
|
||||||
bail!("SWITCH");
|
bail!("SWITCH");
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user