h264_reader/nal/sei/
user_data_unregistered.rs1use crate::nal::sei::HeaderType;
2use crate::nal::sei::SeiMessage;
3
4#[derive(Debug)]
5pub enum UserDataUnregisteredError {
6 NotEnoughData { expected: usize, actual: usize },
7}
8
9#[derive(Debug, PartialEq, Eq)]
11pub struct UserDataUnregistered<'a> {
12 buf: &'a [u8],
13}
14
15impl<'a> UserDataUnregistered<'a> {
16 pub fn read(msg: &SeiMessage<'a>) -> Result<Self, UserDataUnregisteredError> {
17 assert_eq!(msg.payload_type, HeaderType::UserDataUnregistered);
18 if msg.payload.len() < 16 {
19 return Err(UserDataUnregisteredError::NotEnoughData {
20 expected: 16,
21 actual: msg.payload.len(),
22 });
23 }
24 Ok(UserDataUnregistered { buf: msg.payload })
25 }
26
27 pub fn uuid(&self) -> [u8; 16] {
29 let mut uuid = [0u8; 16];
30 uuid.copy_from_slice(&self.buf[..16]);
31 uuid
32 }
33
34 pub fn payload(&self) -> &'a [u8] {
36 &self.buf[16..]
37 }
38}
39
40#[cfg(test)]
41mod test {
42 use super::*;
43
44 #[test]
45 fn parse() {
46 let uuid_bytes: [u8; 16] = [
47 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23,
48 0xee, 0xef,
49 ];
50 let user_data = [0x01, 0x02, 0x03];
51 let mut payload = Vec::new();
52 payload.extend_from_slice(&uuid_bytes);
53 payload.extend_from_slice(&user_data);
54 let msg = SeiMessage {
55 payload_type: HeaderType::UserDataUnregistered,
56 payload: &payload,
57 };
58 let parsed = UserDataUnregistered::read(&msg).unwrap();
59 assert_eq!(parsed.uuid(), uuid_bytes);
60 assert_eq!(parsed.payload(), &user_data[..]);
61 }
62
63 #[test]
64 fn parse_no_user_data() {
65 let uuid_bytes: [u8; 16] = [
66 0xdc, 0x45, 0xe9, 0xbd, 0xe6, 0xd9, 0x48, 0xb7, 0x96, 0x2c, 0xd8, 0x20, 0xd9, 0x23,
67 0xee, 0xef,
68 ];
69 let msg = SeiMessage {
70 payload_type: HeaderType::UserDataUnregistered,
71 payload: &uuid_bytes,
72 };
73 let parsed = UserDataUnregistered::read(&msg).unwrap();
74 assert_eq!(parsed.uuid(), uuid_bytes);
75 assert_eq!(parsed.payload(), &[][..]);
76 }
77
78 #[test]
79 fn too_short() {
80 let msg = SeiMessage {
81 payload_type: HeaderType::UserDataUnregistered,
82 payload: &[0x01, 0x02, 0x03],
83 };
84 let err = UserDataUnregistered::read(&msg).unwrap_err();
85 match err {
86 UserDataUnregisteredError::NotEnoughData { expected, actual } => {
87 assert_eq!(expected, 16);
88 assert_eq!(actual, 3);
89 }
90 }
91 }
92}