use super::super::wrappers::EncodedVideoChunkTypeWrapper;
use crate::constants::get_video_codec;
use crate::crypto::aes::Aes128State;
use js_sys::Uint8Array;
use protobuf::Message;
use std::rc::Rc;
use videocall_types::protos::{
media_packet::{media_packet::MediaType, MediaPacket, VideoMetadata},
packet_wrapper::{packet_wrapper::PacketType, PacketWrapper},
};
use web_sys::EncodedVideoChunk;
pub fn buffer_to_uint8array(buf: &mut [u8]) -> Uint8Array {
unsafe { Uint8Array::view_mut_raw(buf.as_mut_ptr(), buf.len()) }
}
pub fn transform_video_chunk(
chunk: EncodedVideoChunk,
sequence: u64,
buffer: &mut [u8],
user_id: &str,
aes: Rc<Aes128State>,
) -> PacketWrapper {
let byte_length = chunk.byte_length() as usize;
if let Err(e) = chunk.copy_to_with_u8_array(&buffer_to_uint8array(buffer)) {
log::error!("Error copying video chunk: {e:?}");
}
let mut media_packet: MediaPacket = MediaPacket {
data: buffer[0..byte_length].to_vec(),
frame_type: EncodedVideoChunkTypeWrapper(chunk.type_()).to_string(),
user_id: Vec::new(),
media_type: MediaType::VIDEO.into(),
timestamp: chunk.timestamp(),
video_metadata: Some(VideoMetadata {
sequence,
codec: get_video_codec().into(),
..Default::default()
})
.into(),
..Default::default()
};
if let Some(duration0) = chunk.duration() {
media_packet.duration = duration0;
}
let data = media_packet.write_to_bytes().unwrap();
let data = aes.encrypt(&data).unwrap();
PacketWrapper {
data,
user_id: user_id.as_bytes().to_vec(),
packet_type: PacketType::MEDIA.into(),
..Default::default()
}
}
pub fn transform_screen_chunk(
chunk: EncodedVideoChunk,
sequence: u64,
buffer: &mut [u8],
user_id: &str,
aes: Rc<Aes128State>,
) -> PacketWrapper {
let byte_length = chunk.byte_length() as usize;
if let Err(e) = chunk.copy_to_with_u8_array(&buffer_to_uint8array(buffer)) {
log::error!("Error copying video chunk: {e:?}");
}
let mut media_packet: MediaPacket = MediaPacket {
user_id: Vec::new(),
data: buffer[0..byte_length].to_vec(),
frame_type: EncodedVideoChunkTypeWrapper(chunk.type_()).to_string(),
media_type: MediaType::SCREEN.into(),
timestamp: chunk.timestamp(),
video_metadata: Some(VideoMetadata {
sequence,
codec: get_video_codec().into(),
..Default::default()
})
.into(),
..Default::default()
};
if let Some(duration0) = chunk.duration() {
media_packet.duration = duration0;
}
let data = media_packet.write_to_bytes().unwrap();
let data = aes.encrypt(&data).unwrap();
PacketWrapper {
data,
user_id: user_id.as_bytes().to_vec(),
packet_type: PacketType::MEDIA.into(),
..Default::default()
}
}