When you first called play() on a live stream, the seek wouldn't complete because of a condition in fillBuffer() that prevented buffering until the player had started. Allow fillBuffer() to begin buffering in a live stream at a specified position, which ensures drainBuffer() will clean up the seek correctly.
Deprecate getMediaIndexByTime and replace it with a PlaylistLoader.getMediaIndexForTime_ that considers expired content in live playlists. Fix an issues that would allow the return value to be less than zero or greater than the index of the last available media segment. Currently, this code does not take into account rounding of segment durations in HLS v3.
If play() was called before the media playlist has been downloaded, when the playlist finally was received we would still update media index to the live point to start buffering. We would have skipped the code that adjusted currentTime however, so playback would seem to begin at zero instead of seekable().end(0). That would cause media-timeline relative positions to be off by the live window length and things like cue points would fire 60 seconds (for example) after they should have. Now, don't preload live video at all and just seek to live immediately on play, updating the currentTime at that point.
If the segment parser timestamp offset isn't at the start of the last encountered discontinuity, it was impossible to recover the associated media time. Track the media time alongside the timestamp offset so that when a stream is first loaded and the last discontinuity segment start is unavailable, it's still possible to properly translate timestamps. Also, make sure that cue points ahead of current time are cleaned out of the in-band metadata track on seeking. We previously assumed they were ordered by start time but that doesn't seem to be the case for Chrome on OS X. Use the dev version of video.js because of Google Closure compiler gobbling some part of the requiremed machinery for removing cues.
Previously, in-band metadata cues were added whenever they were encountered during the segment parsing process. If you seeked in a stream, this would cause the same cues to be added multiple times when its containing segment was re-buffered. Now, cues that occur after current time are cleared on every seek which allows them to be re-added without duplication after they're re-parsed. Cues before the current time are retained because re-buffering would not cause them to be recreated. Adjust cue point creation to take live stream segment expiration into account.
Keep track of the accurate durations of expired segments in the playlist loader so that it's possible to accurately calculate the start and end points of the seekable ranges relative to media timeline position zero, even if we switch variant streams or seek within a live stream. Track the media timeline position of the last discontinuity to allow for PTS-based variant stream synchronization instead of the incorrect media sequence based method we're currently using. Stop rewriting timestamps in the transmuxed FLV tags for that reason as well. Add m3u8 parser support for EXT-X-DISCONTINUITY-SEQUENCE.
Mock out metadata stream support. Comment javascript simulation parameters. Simulation results currently always buffer the first segment because of the bandwidth scaling factor applied to deal with real-world discrepancies between m3u8 download times and steady-state downloads. Behavior after the first segment still looks good.
A metadata tag injected into the generated FLV when a random access indicator was encountered in the adaptation field of a TS packet causes Firefox 38 on OSX to apply frame diffs against the wrong keyframe. This leads to ugly artifacts for a few seconds after seeking. Now metadata tags are only generated at the start of a segment and IDRs. Fixes#289.
If bandwidth drops off precipitously, it's not a good idea to fetch a higher quality segment while waiting for the new media playlist to load. Delay segment loading instead. Less fetching will be done in parallel after this change but:
- the player will adjust to dramatic bandwidth drops more quickly
- the player will upshift more quickly when bandwidth returns
We don't need a PCR stream for a program to keep synchronized but it's not a problem if one is included. Parse out the PCR PID when it's specified and make sure the warning message isn't output when they are encountered.
When a NIT was present, we would warn about unrecognized PIDs every time it was encountered. Capture the PID value so we can silently ignore it. Add a test case for NIT parsing.
Closes#272.
Squashed commit of the following:
commit de597c3ee1
Author: David LaPalomento <dlapalomento@gmail.com>
Date: Fri May 22 14:02:27 2015 -0400
Remove vim swap file
Ignore them in version control in the future.
commit fb189ba163
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 18:30:07 2015 -0400
Default 'nextFrameKeyFrame' to false.
commit 3788ad0607
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 18:24:16 2015 -0400
setNextFrameKeyFrame
commit 6944234afd
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 18:06:26 2015 -0400
Another camelcase usage
commit da6e32a4d9
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 18:05:30 2015 -0400
Dont parse unused fields. Use camel case names
commit fb7990b660
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 16:28:28 2015 -0400
ifs should have curly braces
commit 92e40c6422
Author: Gary Katsevman <git@gkatsev.com>
Date: Wed May 20 15:58:18 2015 -0400
Adaptation Field vars. Use Random Access Indicator
The Random Access Indicator tells us whether something is a keyframe.
Set the stream's frame's keyFrame property to true if the Random Access
Indicator is set.
commit 047a6d7771
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:56:23 2015 -0400
Set up the test with exact conditions
commit e2f8b18656
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:56:01 2015 -0400
Restore stubbed out methods
commit ff5f3b5fdb
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:50:22 2015 -0400
prototypeify h264-stream
commit 7ee359d582
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:28:08 2015 -0400
Initial test for metadata
commit 0e3a961c75
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:21:55 2015 -0400
Fix test properly
commit 7e0de30822
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 16:14:57 2015 -0400
Move h264-extradata into separate file
commit 66a676c234
Author: Gary Katsevman <git@gkatsev.com>
Date: Mon May 18 15:52:08 2015 -0400
prototypeify H264ExtraData
If mediaIndex was one position beyond the last segment because the player was waiting for a playlist update, it would be reset back to the "live" point. This test checks that the utility translation function does not change mediaIndex in that case.