Skip to main content

h264_reader/nal/sei/
user_data_unregistered.rs

1use 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/// Parsed `user_data_unregistered()` SEI message (payloadType == 5).
10#[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    /// UUID per ISO/IEC 11578 identifying the user data type.
28    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    /// The `user_data_payload_byte` values following the UUID.
35    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}