1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
// Testing parsing of sidx boxes (MP4 and WebM)
//
// To run tests while enabling printing to stdout/stderr
//
// RUST_LOG=info cargo test --test sidx -- --show-output
//
pub mod common;
use std::env;
use std::time::Duration;
use reqwest::header::{RANGE, CONTENT_LENGTH};
use tracing::warn;
use common::setup_logging;
use dash_mpd::sidx::{from_isobmff_sidx, from_webm_cue};
// <BaseURL>v-0480p-1000k-libx264.mp4</BaseURL>
// <SegmentBase indexRange="837-3532" timescale="12288">
// <Initialization range="0-836"/>
// </SegmentBase>
#[tokio::test]
async fn test_sidx_mp4() {
setup_logging();
if env::var("CI").is_ok() {
return;
}
let segment_url = "https://storage.googleapis.com/shaka-demo-assets/sintel/v-0480p-1000k-libx264.mp4";
let s = 837;
let e = 3532;
let client = reqwest::Client::builder()
.timeout(Duration::new(10, 0))
.build()
.unwrap();
let idx = client.get(segment_url)
.header(RANGE, format!("bytes={s}-{e}"))
.header("Sec-Fetch-Mode", "navigate")
.send().await
.unwrap()
.error_for_status()
.unwrap()
.bytes().await
.unwrap();
// TODO need to reject idx value if len() doesn't correspond to what we requested
// (server may not accept Range requests).
if e - s + 1 != idx.len() {
warn!("sidx box length does not correspond to requested octet range");
}
// let sidx = SidxBox::parse(&idx).unwrap();
let _refs = from_isobmff_sidx(&idx, s as u64);
/*
println!("sidx box includes {} references", sidx.reference_count);
let mut total_size = 0;
for sref in sidx.references {
// println!("{sref:?}");
total_size += sref.referenced_size;
}
let resp = client.head(segment_url)
.send().await
.unwrap();
let headers = resp.headers();
let declared_size = headers.get(CONTENT_LENGTH).unwrap()
.to_str().unwrap()
.parse::<usize>().unwrap();
println!("content-length of segment is {declared_size}, total_size = {total_size}");
println!("content-length - start = {}", declared_size - e);
*/
}
// <BaseURL>v-0240p-0300k-vp9.webm</BaseURL>
// <SegmentBase indexRange="296-4111" timescale="1000000">
// <Initialization range="0-295"/>
// </SegmentBase>
#[tokio::test]
async fn test_cues_webm() {
setup_logging();
if env::var("CI").is_ok() {
return;
}
let segment_url = "https://storage.googleapis.com/shaka-demo-assets/sintel/v-0240p-0300k-vp9.webm";
let s = 296;
let e = 4111;
let client = reqwest::Client::builder()
.timeout(Duration::new(10, 0))
.build()
.unwrap();
let idx = client.get(segment_url)
.header(RANGE, format!("bytes={s}-{e}"))
.header("Sec-Fetch-Mode", "navigate")
.send().await
.unwrap()
.error_for_status()
.unwrap()
.bytes().await
.unwrap();
// TODO need to reject idx value if len() doesn't correspond to what we requested
// (server may not accept Range requests).
if e - s + 1 != idx.len() {
warn!("sidx box length does not correspond to requested octet range");
}
let _segments = from_webm_cue(&idx);
let resp = client.head(segment_url)
.send().await
.unwrap();
let headers = resp.headers();
let declared_size = headers.get(CONTENT_LENGTH).unwrap()
.to_str().unwrap()
.parse::<usize>().unwrap();
println!("content-length of WebM segment is {declared_size}");
}