Skip to content

Commit 0da435f

Browse files
authored
Merge pull request #4 from amazon-contributing/ruwen/webvtt-single-cue
Switch to new single cue WebVTT format
2 parents 4b000db + 2c9ec67 commit 0da435f

File tree

13 files changed

+157
-164
lines changed

13 files changed

+157
-164
lines changed

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/av1.rs

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -283,24 +283,21 @@ impl<W: Write + ?Sized> WebvttWrite for OBUWriter<W> {
283283
fn write_webvtt_payload(
284284
&mut self,
285285
track_index: u8,
286-
chunk_number: u64,
287-
chunk_version: u8,
286+
subtitle_version: u8,
288287
video_offset: Duration,
289288
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
290289
) -> std::io::Result<()> {
291290
fn inner<W: ?Sized + Write>(
292291
writer: &mut W,
293292
track_index: u8,
294-
chunk_number: u64,
295-
chunk_version: u8,
293+
subtitle_version: u8,
296294
video_offset: Duration,
297295
webvtt_payload: &str,
298296
) -> std::io::Result<()> {
299297
write_webvtt_payload(
300298
writer,
301299
track_index,
302-
chunk_number,
303-
chunk_version,
300+
subtitle_version,
304301
video_offset,
305302
webvtt_payload,
306303
|write, _size| {
@@ -313,8 +310,7 @@ impl<W: Write + ?Sized> WebvttWrite for OBUWriter<W> {
313310
inner(
314311
&mut count,
315312
track_index,
316-
chunk_number,
317-
chunk_version,
313+
subtitle_version,
318314
video_offset,
319315
webvtt_payload,
320316
)?;
@@ -327,11 +323,35 @@ impl<W: Write + ?Sized> WebvttWrite for OBUWriter<W> {
327323
inner(
328324
&mut self.0,
329325
track_index,
330-
chunk_number,
331-
chunk_version,
326+
subtitle_version,
332327
video_offset,
333328
webvtt_payload,
334329
)?;
335330
self.finish_payload()
336331
}
337332
}
333+
334+
#[cfg(test)]
335+
mod tests {
336+
use crate::{
337+
av1::OBUWriter,
338+
webvtt::{WebvttWrite, PAYLOAD_GUID},
339+
};
340+
use std::time::Duration;
341+
342+
#[test]
343+
fn check_webvtt_metadata_obu() {
344+
let mut buffer = vec![];
345+
let mut obu_writer = OBUWriter::new(&mut buffer);
346+
let track_index = 0;
347+
let subtitle_version = 0;
348+
let video_offset = Duration::from_millis(200);
349+
let webvtt_payload = "Some unverified data";
350+
obu_writer
351+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
352+
.unwrap();
353+
println!("av1 {buffer:02x?}");
354+
assert!(&buffer[3..19] == PAYLOAD_GUID.as_bytes());
355+
assert!(&buffer[23..43] == webvtt_payload.as_bytes());
356+
}
357+
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h264.rs

Lines changed: 10 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -136,18 +136,12 @@ impl<W: Write + ?Sized> WebvttWrite for H264RbspWriter<W> {
136136
fn write_webvtt_payload(
137137
&mut self,
138138
track_index: u8,
139-
chunk_number: u64,
140-
chunk_version: u8,
139+
subtitle_version: u8,
141140
video_offset: Duration,
142141
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
143142
) -> std::io::Result<()> {
144-
self.0.write_webvtt_payload(
145-
track_index,
146-
chunk_number,
147-
chunk_version,
148-
video_offset,
149-
webvtt_payload,
150-
)
143+
self.0
144+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
151145
}
152146
}
153147

@@ -173,18 +167,11 @@ mod tests {
173167
H264NalHeader::from_nal_unit_type_and_nal_ref_idc(nal_unit_type, nal_ref_idc).unwrap();
174168
let mut payload_writer = nalu_writer.write_nal_header(nal_header).unwrap();
175169
let track_index = 0;
176-
let chunk_number = 1;
177-
let chunk_version = 0;
170+
let subtitle_version = 0;
178171
let video_offset = Duration::from_millis(200);
179172
let webvtt_payload = "Some unverified data";
180173
payload_writer
181-
.write_webvtt_payload(
182-
track_index,
183-
chunk_number,
184-
chunk_version,
185-
video_offset,
186-
webvtt_payload,
187-
)
174+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
188175
.unwrap();
189176
payload_writer.finish_rbsp().unwrap();
190177
assert!(&writer[3..19] == PAYLOAD_GUID.as_bytes());
@@ -206,12 +193,11 @@ mod tests {
206193
assert!(length + 1 == byte_reader.clone().bytes().count());
207194
byte_reader.read_u128::<BigEndian>().unwrap();
208195
assert!(track_index == byte_reader.read_u8().unwrap());
209-
assert!(chunk_number == byte_reader.read_u64::<BigEndian>().unwrap());
210-
assert!(chunk_version == byte_reader.read_u8().unwrap());
211196
assert!(
212197
u16::try_from(video_offset.as_millis()).unwrap()
213198
== byte_reader.read_u16::<BigEndian>().unwrap()
214199
);
200+
assert!(subtitle_version == byte_reader.read_u8().unwrap());
215201
println!("{writer:02x?}");
216202
}
217203

@@ -226,21 +212,14 @@ mod tests {
226212
H264NalHeader::from_nal_unit_type_and_nal_ref_idc(nal_unit_type, nal_ref_idc).unwrap();
227213
let mut payload_writer = nalu_writer.write_nal_header(nal_header).unwrap();
228214
let track_index = 0;
229-
let chunk_number = 1;
230-
let chunk_version = 0;
215+
let subtitle_version = 0;
231216
let video_offset = Duration::from_millis(200);
232217
let webvtt_payload = "Some unverified data";
233218
payload_writer
234-
.write_webvtt_payload(
235-
track_index,
236-
chunk_number,
237-
chunk_version,
238-
video_offset,
239-
webvtt_payload,
240-
)
219+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
241220
.unwrap();
242221
payload_writer
243-
.write_webvtt_payload(1, 1, 0, video_offset, "Something else")
222+
.write_webvtt_payload(1, 0, video_offset, "Something else")
244223
.unwrap();
245224
payload_writer.finish_rbsp().unwrap();
246225
assert!(&writer[3..19] == PAYLOAD_GUID.as_bytes());
@@ -261,12 +240,11 @@ mod tests {
261240
}
262241
byte_reader.read_u128::<BigEndian>().unwrap();
263242
assert!(track_index == byte_reader.read_u8().unwrap());
264-
assert!(chunk_number == byte_reader.read_u64::<BigEndian>().unwrap());
265-
assert!(chunk_version == byte_reader.read_u8().unwrap());
266243
assert!(
267244
u16::try_from(video_offset.as_millis()).unwrap()
268245
== byte_reader.read_u16::<BigEndian>().unwrap()
269246
);
247+
assert!(subtitle_version == byte_reader.read_u8().unwrap());
270248
println!("{writer:02x?}");
271249
}
272250
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h264/annex_b.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,11 @@ impl<W: Write + ?Sized> WebvttWrite for AnnexBRbspWriter<W> {
6262
fn write_webvtt_payload(
6363
&mut self,
6464
track_index: u8,
65-
chunk_number: u64,
66-
chunk_version: u8,
65+
subtitle_version: u8,
6766
video_offset: Duration,
6867
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
6968
) -> std::io::Result<()> {
70-
self.0.write_webvtt_payload(
71-
track_index,
72-
chunk_number,
73-
chunk_version,
74-
video_offset,
75-
webvtt_payload,
76-
)
69+
self.0
70+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
7771
}
7872
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h264/avcc.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -131,17 +131,11 @@ impl<W: Write + ?Sized> WebvttWrite for AVCCRbspWriter<W> {
131131
fn write_webvtt_payload(
132132
&mut self,
133133
track_index: u8,
134-
chunk_number: u64,
135-
chunk_version: u8,
134+
subtitle_version: u8,
136135
video_offset: Duration,
137136
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
138137
) -> std::io::Result<()> {
139-
self.0.write_webvtt_payload(
140-
track_index,
141-
chunk_number,
142-
chunk_version,
143-
video_offset,
144-
webvtt_payload,
145-
)
138+
self.0
139+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
146140
}
147141
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h265.rs

Lines changed: 11 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -246,18 +246,12 @@ impl<W: Write + ?Sized> WebvttWrite for H265RbspWriter<W> {
246246
fn write_webvtt_payload(
247247
&mut self,
248248
track_index: u8,
249-
chunk_number: u64,
250-
chunk_version: u8,
249+
subtitle_version: u8,
251250
video_offset: Duration,
252251
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
253252
) -> std::io::Result<()> {
254-
self.0.write_webvtt_payload(
255-
track_index,
256-
chunk_number,
257-
chunk_version,
258-
video_offset,
259-
webvtt_payload,
260-
)
253+
self.0
254+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
261255
}
262256
}
263257

@@ -335,18 +329,11 @@ mod tests {
335329
.unwrap();
336330
let mut payload_writer = nalu_writer.write_nal_header(nal_header).unwrap();
337331
let track_index = 0;
338-
let chunk_number = 1;
339-
let chunk_version = 0;
332+
let subtitle_version = 0;
340333
let video_offset = Duration::from_millis(200);
341334
let webvtt_payload = "Some unverified data";
342335
payload_writer
343-
.write_webvtt_payload(
344-
track_index,
345-
chunk_number,
346-
chunk_version,
347-
video_offset,
348-
webvtt_payload,
349-
)
336+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
350337
.unwrap();
351338
payload_writer.finish_rbsp().unwrap();
352339

@@ -364,15 +351,14 @@ mod tests {
364351
break;
365352
}
366353
}
367-
assert!(dbg!(length + 1) == dbg!(reader.clone().bytes().count()));
354+
assert!(length + 1 == reader.clone().bytes().count());
368355
reader.read_u128::<BigEndian>().unwrap();
369356
assert!(track_index == reader.read_u8().unwrap());
370-
assert!(chunk_number == reader.read_u64::<BigEndian>().unwrap());
371-
assert!(chunk_version == reader.read_u8().unwrap());
372357
assert!(
373358
u16::try_from(video_offset.as_millis()).unwrap()
374359
== reader.read_u16::<BigEndian>().unwrap()
375360
);
361+
assert!(subtitle_version == reader.read_u8().unwrap());
376362
println!("{writer:02x?}");
377363
}
378364

@@ -392,21 +378,14 @@ mod tests {
392378
.unwrap();
393379
let mut payload_writer = nalu_writer.write_nal_header(nal_header).unwrap();
394380
let track_index = 0;
395-
let chunk_number = 1;
396-
let chunk_version = 0;
381+
let subtitle_version = 0;
397382
let video_offset = Duration::from_millis(200);
398383
let webvtt_payload = "Some unverified data";
399384
payload_writer
400-
.write_webvtt_payload(
401-
track_index,
402-
chunk_number,
403-
chunk_version,
404-
video_offset,
405-
webvtt_payload,
406-
)
385+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
407386
.unwrap();
408387
payload_writer
409-
.write_webvtt_payload(1, 1, 0, video_offset, "Something else")
388+
.write_webvtt_payload(1, 0, video_offset, "Something else")
410389
.unwrap();
411390
payload_writer.finish_rbsp().unwrap();
412391

@@ -426,12 +405,11 @@ mod tests {
426405
}
427406
reader.read_u128::<BigEndian>().unwrap();
428407
assert!(track_index == reader.read_u8().unwrap());
429-
assert!(chunk_number == reader.read_u64::<BigEndian>().unwrap());
430-
assert!(chunk_version == reader.read_u8().unwrap());
431408
assert!(
432409
u16::try_from(video_offset.as_millis()).unwrap()
433410
== reader.read_u16::<BigEndian>().unwrap()
434411
);
412+
assert!(subtitle_version == reader.read_u8().unwrap());
435413
println!("{writer:02x?}");
436414
}
437415
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h265/annex_b.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -62,17 +62,11 @@ impl<W: Write + ?Sized> WebvttWrite for AnnexBRbspWriter<W> {
6262
fn write_webvtt_payload(
6363
&mut self,
6464
track_index: u8,
65-
chunk_number: u64,
66-
chunk_version: u8,
65+
subtitle_version: u8,
6766
video_offset: Duration,
6867
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
6968
) -> std::io::Result<()> {
70-
self.0.write_webvtt_payload(
71-
track_index,
72-
chunk_number,
73-
chunk_version,
74-
video_offset,
75-
webvtt_payload,
76-
)
69+
self.0
70+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
7771
}
7872
}

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h26x.rs

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,14 @@ impl<W: Write + ?Sized> WebvttWrite for RbspWriter<W> {
112112
fn write_webvtt_payload(
113113
&mut self,
114114
track_index: u8,
115-
chunk_number: u64,
116-
chunk_version: u8,
115+
subtitle_version: u8,
117116
video_offset: Duration,
118117
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
119118
) -> std::io::Result<()> {
120119
write_webvtt_payload(
121120
self,
122121
track_index,
123-
chunk_number,
124-
chunk_version,
122+
subtitle_version,
125123
video_offset,
126124
webvtt_payload,
127125
|writer, size| write_sei_header(writer, USER_DATA_UNREGISTERED, size),

deps/c-webvtt-in-video-stream/video-bytestream-tools/src/h26x/annex_b.rs

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -76,17 +76,11 @@ impl<W: Write + ?Sized> WebvttWrite for AnnexBRbspWriter<W> {
7676
fn write_webvtt_payload(
7777
&mut self,
7878
track_index: u8,
79-
chunk_number: u64,
80-
chunk_version: u8,
79+
subtitle_version: u8,
8180
video_offset: Duration,
8281
webvtt_payload: &str, // TODO: replace with string type that checks for interior NULs
8382
) -> std::io::Result<()> {
84-
self.inner.write_webvtt_payload(
85-
track_index,
86-
chunk_number,
87-
chunk_version,
88-
video_offset,
89-
webvtt_payload,
90-
)
83+
self.inner
84+
.write_webvtt_payload(track_index, subtitle_version, video_offset, webvtt_payload)
9185
}
9286
}

0 commit comments

Comments
 (0)