From 75b52afb07c22d6704900bbd8ab574b96372f334 Mon Sep 17 00:00:00 2001 From: Brad Hards Date: Thu, 2 Apr 2026 20:46:03 +1100 Subject: [PATCH] dref: follow-up for self-contained flag fix, add tests --- src/moov/trak/mdia/minf/dinf/dref/url.rs | 66 +++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/src/moov/trak/mdia/minf/dinf/dref/url.rs b/src/moov/trak/mdia/minf/dinf/dref/url.rs index 578cc00..92a4c8d 100644 --- a/src/moov/trak/mdia/minf/dinf/dref/url.rs +++ b/src/moov/trak/mdia/minf/dinf/dref/url.rs @@ -35,8 +35,72 @@ impl AtomExt for Url { Ok(UrlExt { // ISOBMFF ยง8.7.2: flag bit 0 = media data is in the same file - self_contained: true, + self_contained: self.location.is_empty(), ..Default::default() }) } } + +#[cfg(test)] +mod tests { + use super::*; + + const ENCODED_EMPTY: &[u8] = &[ + 0x00, 0x00, 0x00, 0x0c, b'u', b'r', b'l', b' ', 0x00, 0x00, 0x00, 0x01, + ]; + #[test] + fn test_url_empty_encode() { + let url = Url { + location: "".into(), + }; + + let mut buf = Vec::new(); + url.encode(&mut buf).unwrap(); + + assert_eq!(buf.as_slice(), ENCODED_EMPTY); + } + + #[test] + fn test_url_empty_decode() { + let buf = &mut std::io::Cursor::new(&ENCODED_EMPTY); + + let url = Url::decode(buf).expect("failed to decode url"); + + assert_eq!( + url, + Url { + location: "".into(), + } + ); + } + + const ENCODED_HTTP: &[u8] = &[ + 0x00, 0x00, 0x00, 0x2a, b'u', b'r', b'l', b' ', 0x00, 0x00, 0x00, 0x00, b'h', b't', b't', + b'p', b's', b':', b'/', b'/', b'e', b'x', b'a', b'm', b'p', b'l', b'e', b'.', b'c', b'o', + b'm', b'/', b'd', b'a', b't', b'a', b'.', b'b', b'l', b'o', b'b', 0, + ]; + #[test] + fn test_url_http_encode() { + let url = Url { + location: "https://example.com/data.blob".into(), + }; + + let mut buf = Vec::new(); + url.encode(&mut buf).unwrap(); + + assert_eq!(buf.as_slice(), ENCODED_HTTP); + } + + #[test] + fn test_url_http_decode() { + let buf = &mut std::io::Cursor::new(&ENCODED_HTTP); + + let url = Url::decode(buf).expect("failed to decode url"); + assert_eq!( + url, + Url { + location: "https://example.com/data.blob".into(), + } + ); + } +}