mirror of
https://github.com/mofeng-git/One-KVM.git
synced 2026-01-28 16:41:52 +08:00
init
This commit is contained in:
78
libs/hwcodec/examples/pipeline_vram.rs
Normal file
78
libs/hwcodec/examples/pipeline_vram.rs
Normal file
@@ -0,0 +1,78 @@
|
||||
use capture::dxgi;
|
||||
use env_logger::{init_from_env, Env, DEFAULT_FILTER_ENV};
|
||||
use hwcodec::common::{DataFormat, Driver, MAX_GOP};
|
||||
use hwcodec::vram::{
|
||||
decode::Decoder, encode::Encoder, DecodeContext, DynamicContext, EncodeContext, FeatureContext,
|
||||
};
|
||||
use render::Render;
|
||||
use std::{
|
||||
io::Write,
|
||||
path::PathBuf,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
|
||||
fn main() {
|
||||
init_from_env(Env::default().filter_or(DEFAULT_FILTER_ENV, "trace"));
|
||||
let luid = 69524; // 63444; // 59677
|
||||
unsafe {
|
||||
// one luid create render failed on my pc, wouldn't happen in rustdesk
|
||||
let data_format = DataFormat::H265;
|
||||
let mut capturer = dxgi::Capturer::new(luid).unwrap();
|
||||
let mut render = Render::new(luid, false).unwrap();
|
||||
|
||||
let en_ctx = EncodeContext {
|
||||
f: FeatureContext {
|
||||
driver: Driver::FFMPEG,
|
||||
vendor: Driver::NV,
|
||||
data_format,
|
||||
luid,
|
||||
},
|
||||
d: DynamicContext {
|
||||
device: Some(capturer.device()),
|
||||
width: capturer.width(),
|
||||
height: capturer.height(),
|
||||
kbitrate: 5000,
|
||||
framerate: 30,
|
||||
gop: MAX_GOP as _,
|
||||
},
|
||||
};
|
||||
let de_ctx = DecodeContext {
|
||||
device: Some(render.device()),
|
||||
driver: Driver::FFMPEG,
|
||||
vendor: Driver::NV,
|
||||
data_format,
|
||||
luid,
|
||||
};
|
||||
|
||||
let mut dec = Decoder::new(de_ctx).unwrap();
|
||||
let mut enc = Encoder::new(en_ctx).unwrap();
|
||||
let filename = PathBuf::from(".\\1.264");
|
||||
let mut file = std::fs::File::create(filename).unwrap();
|
||||
let mut dup_sum = Duration::ZERO;
|
||||
let mut enc_sum = Duration::ZERO;
|
||||
let mut dec_sum = Duration::ZERO;
|
||||
let mut pts_instant = Instant::now();
|
||||
loop {
|
||||
let start = Instant::now();
|
||||
let texture = capturer.capture(100);
|
||||
if texture.is_null() {
|
||||
continue;
|
||||
}
|
||||
dup_sum += start.elapsed();
|
||||
let start = Instant::now();
|
||||
let frame = enc
|
||||
.encode(texture, pts_instant.elapsed().as_millis() as _)
|
||||
.unwrap();
|
||||
enc_sum += start.elapsed();
|
||||
for f in frame {
|
||||
file.write_all(&mut f.data).unwrap();
|
||||
let start = Instant::now();
|
||||
let frames = dec.decode(&f.data).unwrap();
|
||||
dec_sum += start.elapsed();
|
||||
for f in frames {
|
||||
render.render(f.texture).unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user