forked from video-dev/hls.js
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfps-controller.js
50 lines (44 loc) · 1.61 KB
/
fps-controller.js
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
/*
* FPS controller
*
*/
import Event from '../events';
import observer from '../observer';
import {logger} from '../utils/logger';
class FPSController {
constructor(hls) {
this.hls = hls;
this.timer = setInterval(this.checkFPS, hls.config.fpsDroppedMonitoringPeriod);
}
destroy() {
if(this.timer) {
clearInterval(this.timer);
}
}
checkFPS() {
var v = this.hls.video;
if(v) {
var decodedFrames = v.webkitDecodedFrameCount, droppedFrames = v.webkitDroppedFrameCount,currentTime = new Date();
if(decodedFrames) {
if(this.lastTime) {
var currentPeriod = currentTime-this.lastTime;
var currentDropped = droppedFrames - this.lastDroppedFrames;
var currentDecoded = decodedFrames - this.lastDecodedFrames;
var decodedFPS = 1000*currentDecoded/currentPeriod;
var droppedFPS = 1000*currentDropped/currentPeriod;
if(droppedFPS>0) {
logger.log(`checkFPS : droppedFPS/decodedFPS:${droppedFPS.toFixed(1)}/${decodedFPS.toFixed(1)}`);
if(currentDropped > this.hls.config.fpsDroppedMonitoringThreshold*currentDecoded) {
logger.warn(`drop FPS ratio greater than max allowed value`);
observer.trigger(Event.FPS_DROP,{ currentDropped : currentDropped, currentDecoded : currentDecoded, totalDroppedFrames : droppedFrames});
}
}
}
this.lastTime = currentTime;
this.lastDroppedFrames=droppedFrames;
this.lastDecodedFrames=decodedFrames;
}
}
}
}
export default FPSController;