Skip to main content

M3: The Cutting Room

Trevor McCormick
Data Product @ Disney+

That clip up top: sixty point candidates, back to back, sliced automatically out of a 24-minute highlights reel. Almost every one opens on a serve.

Everything still missing from the chart — the serve, the ending, the point score — is missing for the same boring reason: the pipeline has only ever seen one 16-second clip that starts and ends mid-rally. cv-01 called clip sourcing "its own pipeline step" and then I spent four posts avoiding it. This session was the bill coming due.

It also delivered the project's best plot twist so far, but that's at the bottom.

Round two of the least glamorous layer

The M0 rally came from a highlights compilation of Zverev–Gasquet, Montreal 2017. It turns out the same match has a 24-minute extended highlights reel: same broadcast, same court, same camera. Twenty-four minutes of video containing dozens of complete points — serve, rally, dead ball — separated by the enemy of all charting: camera cuts. Player close-ups, crowd shots, net-cam replays, slow-mo from the sideline.

So the job is a classifier: for each of 36,234 frames, are we looking at the broadcast angle, or something else?

Attempt one: color. Noon breaks what evening tuned.

The obvious features are the ones M1 already used — the court is blue, the apron is green. Blue fraction, green fraction, thresholds, done. Tuned on frames from the end of the match, it looked great: every frame it accepted was genuinely the broadcast angle.

Then the eyeball check on the rejects found six frames that were obviously court views. All from the first set. All in blazing daylight.

A daytime broadcast frame beside the same frame with its largest blue region highlighted, sprawling across court and stands

The largest "blue" contour in a daytime frame: the court, plus the entire shaded seating bowl, fused into one 50%-of-frame blob.

Two failures at once. In daylight, the shaded stadium seats read as blue and merge with the court into a single enormous contour. Meanwhile the sunlit apron washes out — saturation 38 against a threshold of 40 — so the green that's supposed to surround the court barely registers. The match starts at noon and ends under floodlights, and color rules tuned at one end break at the other.

Attempt two: geometry. The homography is a fingerprint.

M1's homography was fit on one frame of the original rally clip. Project the court model's corners through it onto frames of the new reel:

Two reel frames, daytime and evening, each with the projected court quad landing exactly on the court lines

M1's court quad, projected onto the new reel — daytime and evening. Pixel-perfect on both. Same broadcast, same camera pose.

The framing transfers. Which means the court quad isn't just a coordinate transform — it's a fingerprint of the camera pose. So the classifier stops caring about color moods entirely: project fifty points that must land on court-blue, and seventeen points just outside the doubles lines that must not. A close-up filled with blue court fails the apron test. A crowd shot fails the interior test. Sun and shade both keep the actual court blue enough to pass.

Median-smooth the boolean, keep runs of three seconds or more: 60 segments, 725 seconds of chartable play.

Twenty tiled frames, each the opening of a detected segment, nearly all showing a serve about to happen

The first twenty segment openings. The service toss is everywhere — highlight editors cut to the point just before the serve, so the serve comes free with the cut.

All sixty starts got the eyeball treatment: every one is a true broadcast view, and the endings all run to a dead ball. Broadcast editors, it turns out, deliver exactly the unit this milestone needs — complete points.

The audit, and one honest hole

Auditing every long gap between segments turned up twenty genuine cutaways — including sideline and net-cam replays, which the probes reject because a replay is a different camera pose. That's not a bug to apologize for; it's load-bearing. Replays would double-chart points through the wrong homography.

One gap was a real loss:

Side-by-side comparison of the standard framing with the quad fitting and an early-match tighter framing where the quad floats off the lines

Early in set one the broadcast ran a slightly tighter zoom. Interior probes still hit court, but the bigger in-frame court swallows the apron probes. 131 seconds, rejected.

The "fixed broadcast framing" assumption is only mostly true — the camera drifted early, then settled for the rest of the match. Known hole, on the record. The fix, if a future match needs it, is to refit the homography per block; M1's fit is already fully automatic.

Timeline strip of the whole reel: green segments of court view, gray cutaways, one hatched orange block for the missed zoom section

Twenty-four minutes of reel: 60 green segments in, one orange confession.

The plot twist

Sixty clips went to disk, each one a candidate point. Segment 51 is different from the others: 59.6 seconds of unbroken court view, by far the longest in the reel.

That's the famous point from this match — the 49-shot rally, the one that made the YouTube titles. The M0 clip that this entire pipeline has been built on turns out to be a 16-second slice of it. The segmenter, knowing nothing but blue and geometry, went and found the whole thing — serve included.

The pipeline has been charting an excerpt of a novel. It just got handed the book.

The verdict

Session cost: $0.00 — no API calls, just HSV thresholds and 67 pixel probes per frame. Project total still ~$0.75. One wrinkle logged for the next session: the reel runs 25 fps where the original clip ran 30, and M2's velocity thresholds are secretly per-frame numbers — fps has to become a parameter before the detector meets these clips.

The remaining question marks in ?f2f1f1b2f2f2b?? all live inside these sixty clips now. Serves at the front, endings at the back, and a 49-shot monster in the middle waiting to stress-test everything. Next: point anatomy — finding the serve inside a segment, and the ending after the last bounce.