Skip to content

Commit fadee3f

Browse files
committed
perf: expose rendered TV frame count
1 parent 50381d4 commit fadee3f

3 files changed

Lines changed: 28 additions & 1 deletion

File tree

tv/src/main/java/video/typetype/tv/player/TvPlaybackQualityDiagnostics.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ internal fun logTvPlaybackQuality(metrics: TvPlaybackQualityMetrics) {
88
"TypeTypePlayback",
99
"quality startupMs=${snapshot.startupMilliseconds ?: -1L} " +
1010
"playedMs=${snapshot.playedMilliseconds} rebufferMs=${snapshot.rebufferMilliseconds} " +
11-
"droppedVideoFrames=${snapshot.droppedVideoFrames}",
11+
"droppedVideoFrames=${snapshot.droppedVideoFrames} " +
12+
"renderedVideoFrames=${snapshot.renderedVideoFrames}",
1213
)
1314
}

tv/src/main/java/video/typetype/tv/player/TvPlaybackQualityMetrics.kt

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,15 @@ package video.typetype.tv.player
44

55
import android.os.SystemClock
66
import androidx.media3.common.Player
7+
import androidx.media3.exoplayer.DecoderCounters
78
import androidx.media3.exoplayer.analytics.AnalyticsListener
89

910
internal data class TvPlaybackQualitySnapshot(
1011
val startupMilliseconds: Long?,
1112
val playedMilliseconds: Long,
1213
val rebufferMilliseconds: Long,
1314
val droppedVideoFrames: Long,
15+
val renderedVideoFrames: Long,
1416
)
1517

1618
internal class TvPlaybackQualityMetrics : AnalyticsListener {
@@ -21,6 +23,7 @@ internal class TvPlaybackQualityMetrics : AnalyticsListener {
2123
private var playedMilliseconds = 0L
2224
private var rebufferMilliseconds = 0L
2325
private var droppedVideoFrames = 0L
26+
private var renderedVideoFrames = 0L
2427

2528
fun onPlaybackRequested(now: Long = SystemClock.elapsedRealtime()) {
2629
playStartedAt = now
@@ -30,6 +33,7 @@ internal class TvPlaybackQualityMetrics : AnalyticsListener {
3033
playedMilliseconds = 0L
3134
rebufferMilliseconds = 0L
3235
droppedVideoFrames = 0L
36+
renderedVideoFrames = 0L
3337
}
3438

3539
fun onPlaybackStateChanged(state: Int, now: Long = SystemClock.elapsedRealtime()) {
@@ -72,6 +76,18 @@ internal class TvPlaybackQualityMetrics : AnalyticsListener {
7276
onDroppedVideoFramesCount(droppedFrames)
7377
}
7478

79+
override fun onVideoDisabled(
80+
eventTime: AnalyticsListener.EventTime,
81+
counters: DecoderCounters,
82+
) {
83+
counters.ensureUpdated()
84+
onRenderedVideoFramesCount(counters.renderedOutputBufferCount)
85+
}
86+
87+
fun onRenderedVideoFramesCount(renderedFrames: Int) {
88+
renderedVideoFrames += renderedFrames.coerceAtLeast(0).toLong()
89+
}
90+
7591
fun onDroppedVideoFramesCount(droppedFrames: Int) {
7692
droppedVideoFrames += droppedFrames.coerceAtLeast(0).toLong()
7793
}
@@ -89,6 +105,7 @@ internal class TvPlaybackQualityMetrics : AnalyticsListener {
89105
playedMilliseconds = played,
90106
rebufferMilliseconds = rebuffered,
91107
droppedVideoFrames = droppedVideoFrames,
108+
renderedVideoFrames = renderedVideoFrames,
92109
)
93110
}
94111

tv/src/test/java/video/typetype/tv/player/TvPlaybackQualityMetricsTest.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,13 @@ public class TvPlaybackQualityMetricsTest {
3939

4040
assertEquals(3L, metrics.snapshot(now = 100L).droppedVideoFrames)
4141
}
42+
43+
@Test
44+
public fun recordsRenderedVideoFrames() {
45+
val metrics = TvPlaybackQualityMetrics()
46+
metrics.onRenderedVideoFramesCount(-2)
47+
metrics.onRenderedVideoFramesCount(240)
48+
49+
assertEquals(240L, metrics.snapshot(now = 100L).renderedVideoFrames)
50+
}
4251
}

0 commit comments

Comments
 (0)