web_codecs/
frame.rs

1use std::fmt;
2
3use bytes::{Bytes, BytesMut};
4
5use crate::Timestamp;
6
7pub struct EncodedFrame {
8	pub payload: Bytes,
9	pub timestamp: Timestamp,
10	pub keyframe: bool,
11}
12
13impl fmt::Debug for EncodedFrame {
14	fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15		f.debug_struct("EncodedFrame")
16			.field("payload", &self.payload.len())
17			.field("timestamp", &self.timestamp)
18			.field("keyframe", &self.keyframe)
19			.finish()
20	}
21}
22
23impl From<web_sys::EncodedVideoChunk> for EncodedFrame {
24	fn from(chunk: web_sys::EncodedVideoChunk) -> Self {
25		let size = chunk.byte_length() as usize;
26
27		let mut payload = BytesMut::with_capacity(size);
28		payload.resize(size, 0);
29		chunk.copy_to_with_u8_slice(&mut payload).unwrap();
30
31		Self {
32			payload: payload.freeze(),
33			timestamp: Timestamp::from_micros(chunk.timestamp() as _),
34			keyframe: chunk.type_() == web_sys::EncodedVideoChunkType::Key,
35		}
36	}
37}
38
39impl From<web_sys::EncodedAudioChunk> for EncodedFrame {
40	fn from(chunk: web_sys::EncodedAudioChunk) -> Self {
41		let size = chunk.byte_length() as usize;
42
43		let mut payload = BytesMut::with_capacity(size);
44		payload.resize(size, 0);
45		chunk.copy_to_with_u8_slice(&mut payload).unwrap();
46
47		Self {
48			payload: payload.freeze(),
49			timestamp: Timestamp::from_micros(chunk.timestamp() as _),
50			keyframe: chunk.type_() == web_sys::EncodedAudioChunkType::Key,
51		}
52	}
53}