package com.limelight.binding.video; import android.os.SystemClock; class VideoStats { long decoderTimeMs; long totalTimeMs; int totalFrames; int totalFramesReceived; int totalFramesRendered; int frameLossEvents; int framesLost; char minHostProcessingLatency; char maxHostProcessingLatency; int totalHostProcessingLatency; int framesWithHostProcessingLatency; long measurementStartTimestamp; void add(VideoStats other) { this.decoderTimeMs += other.decoderTimeMs; this.totalTimeMs += other.totalTimeMs; this.totalFrames += other.totalFrames; this.totalFramesReceived += other.totalFramesReceived; this.totalFramesRendered += other.totalFramesRendered; this.frameLossEvents += other.frameLossEvents; this.framesLost += other.framesLost; if (this.minHostProcessingLatency == 0) { this.minHostProcessingLatency = other.minHostProcessingLatency; } else { this.minHostProcessingLatency = (char) Math.min(this.minHostProcessingLatency, other.minHostProcessingLatency); } this.maxHostProcessingLatency = (char) Math.max(this.maxHostProcessingLatency, other.maxHostProcessingLatency); this.totalHostProcessingLatency += other.totalHostProcessingLatency; this.framesWithHostProcessingLatency += other.framesWithHostProcessingLatency; if (this.measurementStartTimestamp == 0) { this.measurementStartTimestamp = other.measurementStartTimestamp; } assert other.measurementStartTimestamp >= this.measurementStartTimestamp; } void copy(VideoStats other) { this.decoderTimeMs = other.decoderTimeMs; this.totalTimeMs = other.totalTimeMs; this.totalFrames = other.totalFrames; this.totalFramesReceived = other.totalFramesReceived; this.totalFramesRendered = other.totalFramesRendered; this.frameLossEvents = other.frameLossEvents; this.framesLost = other.framesLost; this.minHostProcessingLatency = other.minHostProcessingLatency; this.maxHostProcessingLatency = other.maxHostProcessingLatency; this.totalHostProcessingLatency = other.totalHostProcessingLatency; this.framesWithHostProcessingLatency = other.framesWithHostProcessingLatency; this.measurementStartTimestamp = other.measurementStartTimestamp; } void clear() { this.decoderTimeMs = 0; this.totalTimeMs = 0; this.totalFrames = 0; this.totalFramesReceived = 0; this.totalFramesRendered = 0; this.frameLossEvents = 0; this.framesLost = 0; this.minHostProcessingLatency = 0; this.maxHostProcessingLatency = 0; this.totalHostProcessingLatency = 0; this.framesWithHostProcessingLatency = 0; this.measurementStartTimestamp = 0; } VideoStatsFps getFps() { float elapsed = (SystemClock.uptimeMillis() - this.measurementStartTimestamp) / (float) 1000; VideoStatsFps fps = new VideoStatsFps(); if (elapsed > 0) { fps.totalFps = this.totalFrames / elapsed; fps.receivedFps = this.totalFramesReceived / elapsed; fps.renderedFps = this.totalFramesRendered / elapsed; } return fps; } } class VideoStatsFps { float totalFps; float receivedFps; float renderedFps; }