Skip to content

7.1.1 - A software session paused before its first frame presents it, unclassifiable HEVC decodes in software

Choose a tag to compare

@superuser404notfound superuser404notfound released this 17 Sep 04:21
· 301 commits to main since this release

Two software-host fixes: a session paused before anything was decoded showed a black picture for as long as it stayed paused, and a decode-path correction onto software ended an HEVC session whose format the probe could not classify.

What changes for a consumer

A software session paused before its first frame presents that frame (Sodalite#104, PR #543). The demux and feeder loops park on a paused transport. That is right once a picture is up and wrong before it: a pause() that arrived before anything was decoded left the layer empty under a stopped clock, startup 8/8 presenting never came, and the 1 Hz diagnostic read enq=+0 status=unknown r4d=n for the whole pause. A host that holds a fresh load paused hits exactly that; Sodalite's foreground retune did after a TV off/on cycle, and the reporter got a black screen on an HDHomeRun channel.

Until the first frame is in, a pause now stops the clock and not the loops. A clock arming under it starts at rate 0, the first frame is handed straight out of the renderer's reorder buffer (which otherwise holds four frames before releasing one), and the stopped clock moves onto the frame where it stood before it, because a live tune arms on audio ahead of the first keyframe and a stopped synchronizer presents no future sample. The same change closes a race at clock arming: a pause() or play() landing between an arm reading its rate and marking the clock armed was lost, which left a VOD clock running under state=paused (8.25 s after eight paused seconds, snapping back to zero on play).

A decode-path correction onto software no longer ends an unclassifiable HEVC session (#461, PR #542). The software host read the routing gate's "keep native" for in-band parameter sets, Annex-B extradata or a missing config record as "open HardwareVideoDecoder", which builds from the hvcC alone and has no software fallback, so preferredDecodePath = .software threw sessionCreationFailed(status: -4). The probe now returns a three-valued verdict: routing still keeps native on an unclassifiable format, and the software host opens the hardware decoder only on a proven session and hands everything else to libavcodec.

No public API changed.

Verified

  • aetherctl play --host-calls pausestart (new) pauses the instant load returns and plays at t=8. Live software DVR session: before, eight paused ticks of enq=+0 r4d=n; after, layer.isReadyForDisplay=true after 1 frames and startup 8/8 presenting while paused, clock frozen, play() resumes. VOD software session: the clock holds 0.00 under the pause.
  • The pauseseek, seekback, overlapseek (A, B, C PASS) and ratehold drills are unchanged.
  • Both test runners green (swift-testing 2997, XCTest 627 with 0 failures); CI green on macOS, iOS, tvOS and visionOS.
  • Device confirmation of the paused first frame on the reporter's tuner is still open on Sodalite#104.

Full notes: CHANGELOG - 7.1.0...7.1.1