decoder
This commit is contained in:
parent
34c19268df
commit
3e6b05645f
1 changed files with 37 additions and 23 deletions
|
@ -1,34 +1,48 @@
|
||||||
use std::{mem::transmute, net::{self, SocketAddr}};
|
use std::{mem::transmute, net::{self, SocketAddr}, slice, sync::{Mutex, OnceLock}};
|
||||||
|
|
||||||
#[repr(C)]
|
use openh264::decoder::Decoder;
|
||||||
pub struct ServerAddress {
|
|
||||||
ip_octet_1: u8,
|
|
||||||
ip_octet_2: u8,
|
|
||||||
ip_octet_3: u8,
|
|
||||||
ip_octet_4: u8,
|
|
||||||
port: u16,
|
|
||||||
}
|
|
||||||
|
|
||||||
impl Into<SocketAddr> for ServerAddress {
|
|
||||||
fn into(self) -> SocketAddr {
|
|
||||||
SocketAddr::from(([self.ip_octet_1, self.ip_octet_2, self.ip_octet_3, self.ip_octet_4], self.port))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
|
||||||
pub extern fn connect(server: ServerAddress) -> u64 {
|
|
||||||
let _connection = net::TcpStream::connect(Into::<SocketAddr>::into(server));
|
|
||||||
|
|
||||||
0
|
|
||||||
}
|
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn add(a: u64, b: u64) -> u64 {
|
pub extern fn add(a: u64, b: u64) -> u64 {
|
||||||
a + b
|
a + b
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static DECODER: OnceLock<Mutex<Decoder>> = OnceLock::new();
|
||||||
|
|
||||||
#[no_mangle]
|
#[no_mangle]
|
||||||
pub extern fn blit_red(arr: &mut u32) -> u64 {
|
/// reset h264 decoder
|
||||||
|
///
|
||||||
|
/// call before opening new stream
|
||||||
|
pub extern fn reset_decoder() -> u64 {
|
||||||
|
// calls constructor twice in the reset case, not big deal
|
||||||
|
if let Err(_) = DECODER.set(Mutex::new(Decoder::new().unwrap())) {
|
||||||
|
*DECODER.get().unwrap().lock().unwrap() = Decoder::new().unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
/// decode h264 packet of given length
|
||||||
|
///
|
||||||
|
/// returns 1 if the packet contained a new frame, otherwise 0
|
||||||
|
pub extern fn decode_h264(image: &mut u32, packet: &u8, length: u32) -> u64 {
|
||||||
|
let decoder = DECODER.get_or_init(|| Mutex::new(Decoder::new().unwrap()));
|
||||||
|
let mut decoder = decoder.lock().unwrap();
|
||||||
|
|
||||||
|
let packet = unsafe {slice::from_raw_parts(packet, length as usize)};
|
||||||
|
let image: &mut [u8; 4*320*240] = unsafe{transmute(image)};
|
||||||
|
|
||||||
|
if let Ok(Some(frame)) = decoder.decode(packet) {
|
||||||
|
frame.write_rgba8(image);
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
0
|
||||||
|
}
|
||||||
|
|
||||||
|
#[no_mangle]
|
||||||
|
pub extern fn blit_pattern(arr: &mut u32) -> u64 {
|
||||||
let arr: &mut [u32; 320*240] = unsafe{transmute(arr)};
|
let arr: &mut [u32; 320*240] = unsafe{transmute(arr)};
|
||||||
let arr: &mut [[u32; 320];240] = unsafe{transmute(arr)};
|
let arr: &mut [[u32; 320];240] = unsafe{transmute(arr)};
|
||||||
for x in 0..320 {
|
for x in 0..320 {
|
||||||
|
|
Loading…
Reference in a new issue