
Test for metadata tracks from Apple HLS stream.


** Set video.src, wait for media data to load
RUN(video.src = 'http://127.0.0.1:8000/media/resources/hls/metadata/prog_index.m3u8')

EVENT(addtrack)
EXPECTED (tracks.length == '1') OK
RUN(track = video.textTracks[0])
EXPECTED (track.kind == 'metadata') OK
EXPECTED (track.mode == 'disabled') OK
RUN(track.mode = 'hidden')
EVENT(canplaythrough)

** Start playback, wait for all cues to load
RUN(video.play())

** Validate cue data
* 1
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'com.apple.quicktime.HLS') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"X-START-OFFSET"') OK
EXPECTED (cue.value.data == '"0.000000"') OK

* 2
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'com.apple.quicktime.HLS') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"X-END-OFFSET"') OK
EXPECTED (cue.value.data == '"5.000000"') OK

* 3
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"TIT2"') OK
EXPECTED (cue.value.data == '"Stream Counting"') OK

* 4
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"TPE1"') OK
EXPECTED (cue.value.data == '"Andy"') OK

* 5
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"TALB"') OK
EXPECTED (cue.value.data == '"Greatest Hits"') OK

* 6
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"GEOB"') OK
EXPECTED (cue.value.data == '{}') OK
EXPECTED (cue.value.type == '"image/png"') OK
EXPECTED (cue.value.info == '"Our Hero"') OK
EXPECTED (cue.value.name == '"abe.png"') OK

* 7
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"APIC"') OK
EXPECTED (cue.value.data == '{}') OK
EXPECTED (cue.value.type == '"image/png"') OK

* 8
EXPECTED (typeof(cue) != 'undefined') OK
EXPECTED (cue.data == 'null') OK
EXPECTED (cue.type == 'org.id3') OK
EXPECTED (cue.value != 'null') OK
EXPECTED (cue.value.key == '"TXXX"') OK
EXPECTED (cue.value.data == '"Text Blob"') OK

** Extract images from cue data, validate by setting img.src
RUN(cueImageData = track.cues[5].value.data)
EXPECTED (cueImageData instanceof ArrayBuffer == 'true') OK
RUN(blobUrl = URL.createObjectURL(new Blob([cueImageData], { type: 'image/png' })))
RUN(imageElement.src = blobUrl)
EVENT(load)
EXPECTED (imageElement.width == '76') OK
EXPECTED (imageElement.height == '103') OK

RUN(cueImageData = track.cues[6].value.data)
EXPECTED (cueImageData instanceof ArrayBuffer == 'true') OK
RUN(blobUrl = URL.createObjectURL(new Blob([cueImageData], { type: 'image/png' })))
RUN(imageElement.src = blobUrl)
EVENT(load)
EXPECTED (imageElement.width == '100') OK
EXPECTED (imageElement.height == '100') OK

END OF TEST

