Skip to content

Live cutter wedges with zero audio packets on an mp2-stereo MPEG-TS under the FLAC bridge (regression 6.31.0 -> 6.47.0) #432

Description

@Simpendaal

What happened?

I played a live MPEG-TS channel whose audio is MP2 stereo. I expected the segment producer to keep cutting for as long as the source delivers, which is what 6.31.0 does on the same channel and the same origin. Instead 6.47.0 finalizes segments normally for about twenty seconds and then wedges the cutter with zero audio packets in its window, emits one 85 MB segment declared as half a second, and produces nothing after that.

The one deliberate behavioural difference between the two versions on this class of source is 6.32.0's move from E-AC-3 to FLAC for a bridged source of two channels or fewer. 6.31.0 reports decoding + EAC3 re-encode and plays for minutes; 6.47.0 reports decoding + FLAC re-encode and wedges.

Recovery afterwards behaves correctly on its own terms and cannot help, because there is nothing left to serve: #65 nudges, then skips stage 2 with "the producer is starved, not the consumer", and the item dies with AVFoundationErrorDomain/-11866. The viewer gets a thirty-second rebuffer, a few seconds of picture, and a second stall the session does not return fr

Steps to reproduce

Take a live MPEG-TS source whose audio is MP2 stereo at 48 kHz, two channels (mine is HEVC 3840x2160 at 50 fps, hvc1.2.4.L153, from an Xtream panel that answers with a 302 to a token-bearing media host).
Configure LoadOptions with the default audioBridgeMode (.surroundCompat) and load it as a live source on the native route.
Watch the HLSSegmentProducer log for about half a minute.
Segments seg-0..seg-16 finalize at 1.280 s each, then the no-cut watchdog fires with window video=1792 key=30 audio=0.
The same channel on 6.31.0, same host and same app build, plays for minutes with muxCuts climbing steadily (44, 71, 94, 117, 144 at t=30/60/90/120/150 s).

AetherEngine version or commit SHA

6.47.0

Host app

Custom / my own integration

Platform

tvOS

OS version

26.6

Device / chip

ATV 4k 3th gen

Playback path

Native AVPlayer

Source media (for playback bugs)

No response

Error codes / log lines

6.31.0, working:

[HLSVideoEngine] audio: codec=mp2 (bridge required), decoding + EAC3 re-encode [AudioBridge] init: mode=surroundCompat srcCodec=86016 sampleRate=48000 sourceChannels=2 encoderChannels=2 bitRate=256 kbps [HLSVideoEngine] prepared: codec=hvc1.2.4.L153,ec-3 resolution=3840x2160 fps=50.000

6.47.0, wedging:

[HLSVideoEngine] audio: codec=mp2 (bridge required), decoding + FLAC re-encode [AudioBridge] init: mode=surroundCompat encoder=flac srcCodec=86016 sampleRate=48000 sourceChannels=2 encoderChannels=2 bitRate=VBR (source=container, container=2, decoder=2) [HLSVideoEngine] prepared: codec=hvc1.2.4.L153,fLaC resolution=3840x2160 fps=50.000

[HLSSegmentProducer] no-cut stall: no segment finalized for 10s (packetsRead=3787, sinceFinalize=1792, rate=179.1pkt/s, cutter wedge); window video=1792 key=30 audio=0 foreign=0 videoPtsAdvance=0.0s; aborting the source read and exiting for host retune [HLSSegmentProducer] seg-17.m4s captured (85388914 B) [HLSSegmentProducer] live seg-17 finalized: start=21.740s dur=0.500s [HLSSegmentProducer] pump finished: reason=segmentStall packetsRead=3788 packetsWritten=2876 lastError=0 elapsed=11094ms [HLSVideoEngine] live segment cutter stalled (likely SSAI ad pod); requesting host retune to the server route

[AetherEngine] #65 re-engaging stalled AVPlayer (stall + 6s without fetches): nudge seek to 21.45s [AetherEngine] #65 stage-2 skipped: no segment finalized since the stall (producer still at seg18); the producer is starved, not the consumer; publishing liveSourceReset to host [NativeAVPlayerHost] #1 failedToPlayToEndTime AVFoundationErrorDomain/-11866 'Playback Stopped'

Both memprobe samples after the wedge read muxBytesMB=0 muxCuts=0, and the producer stays at seg18 for the rest of the session.

Anything else

What this report does not establish: the same line reports videoPtsAdvance=0.0s, and a change of audio encoder does not explain a video timeline that fails to advance across 1792 packets, so a second factor may be present. The origin is also independently unreliable. Measured with curl outside any player it closes the connection by itself after ten to fifty-five seconds, and it answers 401 to a reused token link, which is the same shape as the 302-to-a-one-slot-host origin in 6.36.0. Two other players buffer on this channel as well, roughly once every few minutes, so a source-side dropout coinciding with the wedge cannot be excluded from this trace alone. The control that would settle it, 6.47.0 against a channel whose audio is stream-copied AAC and therefore never enters the bridge, has not been run.

On the workaround: AudioBridgeMode offers no way back for this source, since .lossless is FLAC unconditionally and .surroundCompat returns FLAC for any source of two channels or fewer, so a host that hits this has to pin back.

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions