mirror of
https://github.com/jellyfin/jellyfin-web
synced 2025-03-30 19:56:21 +00:00
78 lines
2.8 KiB
JavaScript
78 lines
2.8 KiB
JavaScript
![]() |
/**
|
||
|
* Buffer Helper class, providing methods dealing buffer length retrieval
|
||
|
*/
|
||
|
|
||
|
|
||
|
class BufferHelper {
|
||
|
|
||
|
static bufferInfo(media, pos,maxHoleDuration) {
|
||
|
if (media) {
|
||
|
var vbuffered = media.buffered, buffered = [],i;
|
||
|
for (i = 0; i < vbuffered.length; i++) {
|
||
|
buffered.push({start: vbuffered.start(i), end: vbuffered.end(i)});
|
||
|
}
|
||
|
return this.bufferedInfo(buffered,pos,maxHoleDuration);
|
||
|
} else {
|
||
|
return {len: 0, start: 0, end: 0, nextStart : undefined} ;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
static bufferedInfo(buffered,pos,maxHoleDuration) {
|
||
|
var buffered2 = [],
|
||
|
// bufferStart and bufferEnd are buffer boundaries around current video position
|
||
|
bufferLen,bufferStart, bufferEnd,bufferStartNext,i;
|
||
|
// sort on buffer.start/smaller end (IE does not always return sorted buffered range)
|
||
|
buffered.sort(function (a, b) {
|
||
|
var diff = a.start - b.start;
|
||
|
if (diff) {
|
||
|
return diff;
|
||
|
} else {
|
||
|
return b.end - a.end;
|
||
|
}
|
||
|
});
|
||
|
// there might be some small holes between buffer time range
|
||
|
// consider that holes smaller than maxHoleDuration are irrelevant and build another
|
||
|
// buffer time range representations that discards those holes
|
||
|
for (i = 0; i < buffered.length; i++) {
|
||
|
var buf2len = buffered2.length;
|
||
|
if(buf2len) {
|
||
|
var buf2end = buffered2[buf2len - 1].end;
|
||
|
// if small hole (value between 0 or maxHoleDuration ) or overlapping (negative)
|
||
|
if((buffered[i].start - buf2end) < maxHoleDuration) {
|
||
|
// merge overlapping time ranges
|
||
|
// update lastRange.end only if smaller than item.end
|
||
|
// e.g. [ 1, 15] with [ 2,8] => [ 1,15] (no need to modify lastRange.end)
|
||
|
// whereas [ 1, 8] with [ 2,15] => [ 1,15] ( lastRange should switch from [1,8] to [1,15])
|
||
|
if(buffered[i].end > buf2end) {
|
||
|
buffered2[buf2len - 1].end = buffered[i].end;
|
||
|
}
|
||
|
} else {
|
||
|
// big hole
|
||
|
buffered2.push(buffered[i]);
|
||
|
}
|
||
|
} else {
|
||
|
// first value
|
||
|
buffered2.push(buffered[i]);
|
||
|
}
|
||
|
}
|
||
|
for (i = 0, bufferLen = 0, bufferStart = bufferEnd = pos; i < buffered2.length; i++) {
|
||
|
var start = buffered2[i].start,
|
||
|
end = buffered2[i].end;
|
||
|
//logger.log('buf start/end:' + buffered.start(i) + '/' + buffered.end(i));
|
||
|
if ((pos + maxHoleDuration) >= start && pos < end) {
|
||
|
// play position is inside this buffer TimeRange, retrieve end of buffer position and buffer length
|
||
|
bufferStart = start;
|
||
|
bufferEnd = end;
|
||
|
bufferLen = bufferEnd - pos;
|
||
|
} else if ((pos + maxHoleDuration) < start) {
|
||
|
bufferStartNext = start;
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
return {len: bufferLen, start: bufferStart, end: bufferEnd, nextStart : bufferStartNext};
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
export default BufferHelper;
|