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}