Skip to content

Commit e4a39e3

Browse files
authored
BADGER: Fix frames-total (#420)
* fix: add frames-total to types * chore: rename to frames * fix: exclude component frame entries from static entries
1 parent a7a1c91 commit e4a39e3

3 files changed

Lines changed: 60 additions & 7 deletions

File tree

src/debugger/chronicle.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ type CurrentLatency = CreateMetric<"current-latency", number>
4646
type CurrentUrl = CreateMetric<"current-url", string>
4747
type Duration = CreateMetric<"duration", number>
4848
type FramesDropped = CreateMetric<"frames-dropped", number>
49+
type FramesTotal = CreateMetric<"frames-total", number>
4950
type InitialPlaybackTime = CreateMetric<"initial-playback-time", [time: number, timeline: Timeline]>
5051
type MediaElementEnded = CreateMetric<"ended", HTMLMediaElement["ended"]>
5152
type MediaElementPaused = CreateMetric<"paused", HTMLMediaElement["paused"]>
@@ -73,6 +74,7 @@ export type Metric =
7374
| CurrentUrl
7475
| Duration
7576
| FramesDropped
77+
| FramesTotal
7678
| InitialPlaybackTime
7779
| MediaElementEnded
7880
| MediaElementPaused

src/debugger/debugviewcontroller.test.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ describe("Debug View", () => {
2020
controller.showView()
2121

2222
chronicle.appendMetric("buffer-length", 0)
23-
chronicle.appendMetric("frames-dropped", 4)
23+
chronicle.appendMetric("auto-resume", 4)
2424
chronicle.appendMetric("duration", 30)
2525

2626
controller.addEntries(chronicle.retrieve())
@@ -31,7 +31,7 @@ describe("Debug View", () => {
3131
expect.objectContaining({
3232
static: [
3333
{ id: "buffer-length", key: "buffer length", value: 0 },
34-
{ id: "frames-dropped", key: "frames dropped", value: 4 },
34+
{ id: "auto-resume", key: "auto resume", value: 4 },
3535
{ id: "duration", key: "duration", value: 30 },
3636
],
3737
})
@@ -254,22 +254,22 @@ describe("Debug View", () => {
254254

255255
const chronicle = new Chronicle()
256256

257-
chronicle.appendMetric("frames-dropped", 0)
257+
chronicle.appendMetric("auto-resume", 0)
258258

259259
jest.advanceTimersByTime(500)
260260

261-
chronicle.appendMetric("frames-dropped", 1)
261+
chronicle.appendMetric("auto-resume", 1)
262262

263263
jest.advanceTimersByTime(4500)
264264

265-
chronicle.appendMetric("frames-dropped", 4)
265+
chronicle.appendMetric("auto-resume", 4)
266266

267267
controller.addEntries(chronicle.retrieve())
268268

269269
jest.advanceTimersToNextTimer()
270270

271271
expect(DebugView.render).toHaveBeenCalledWith(
272-
expect.objectContaining({ static: [{ id: "frames-dropped", key: "frames dropped", value: 4 }] })
272+
expect.objectContaining({ static: [{ id: "auto-resume", key: "auto resume", value: 4 }] })
273273
)
274274
})
275275

src/debugger/debugviewcontroller.ts

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,10 +67,22 @@ type MaxBitrate = {
6767
data: Record<MediaKinds, number>
6868
}
6969

70+
type FrameKind = Extends<MetricKind, "frames-dropped" | "frames-total">
71+
72+
type Frames = {
73+
category: "union"
74+
kind: "frames"
75+
data: {
76+
total?: number
77+
dropped?: number
78+
}
79+
}
80+
7081
type DynamicEntry = TimestampedMessage | TimestampedTrace | Timestamp
7182

7283
type StaticEntry =
73-
| Exclude<TimestampedMetric, MetricForKind<MediaElementStateKind | AudioQualityKind | VideoQualityKind>>
84+
| Exclude<TimestampedMetric, MetricForKind<MediaElementStateKind | AudioQualityKind | VideoQualityKind | FrameKind>>
85+
| Timestamped<Frames>
7486
| Timestamped<MediaElementState>
7587
| Timestamped<AudioQuality>
7688
| Timestamped<VideoQuality>
@@ -107,6 +119,32 @@ class DebugViewController {
107119
private dynamicEntries: DynamicEntry[] = []
108120
private latestMetricByKey: Partial<Record<StaticEntryKind, StaticEntry>> = {}
109121

122+
private isFrameStat(metric: TimestampedMetric): metric is Timestamped<MetricForKind<FrameKind>> {
123+
const { kind } = metric
124+
return kind === "frames-dropped" || kind === "frames-total"
125+
}
126+
127+
private mergeFrameStat(entry: Timestamped<MetricForKind<FrameKind>>): Timestamped<Frames> {
128+
const prevEntry: Frames =
129+
this.latestMetricByKey.frames == null
130+
? { category: "union", kind: "frames", data: {} }
131+
: (this.latestMetricByKey.frames as Frames)
132+
133+
const { sessionTime, currentElementTime, kind: metricKind, data: metricData } = entry
134+
135+
const keyForKind: Record<FrameKind, string> = {
136+
"frames-dropped": "dropped",
137+
"frames-total": "total",
138+
}
139+
140+
return {
141+
...prevEntry,
142+
sessionTime,
143+
currentElementTime,
144+
data: { ...prevEntry.data, [keyForKind[metricKind]]: metricData },
145+
}
146+
}
147+
110148
private isMediaState(metric: TimestampedMetric): metric is Timestamped<MetricForKind<MediaElementStateKind>> {
111149
const { kind } = metric
112150
const mediaStateMetrics = ["ended", "paused", "playback-rate", "ready-state", "seeking"]
@@ -219,6 +257,11 @@ class DebugViewController {
219257

220258
switch (category) {
221259
case EntryCategory.METRIC:
260+
if (this.isFrameStat(entry)) {
261+
this.cacheStaticEntry(this.mergeFrameStat(entry))
262+
return
263+
}
264+
222265
if (this.isMediaState(entry)) {
223266
this.cacheStaticEntry(this.mergeMediaState(entry))
224267
return
@@ -477,6 +520,14 @@ class DebugViewController {
477520
return `${bitratePart} kbps`
478521
}
479522

523+
if (kind === "frames") {
524+
if (data.total == null) {
525+
return null
526+
}
527+
528+
return `${(data.dropped ?? (0 / data.total) * 100).toFixed(2)}% dropped (${data.dropped}/${data.total})`
529+
}
530+
480531
return data.join(", ")
481532
}
482533

0 commit comments

Comments
 (0)