Skip to content

VPAAMP-667: Live-edge ABR ramp-up bypass for buffer-deadlock recovery#1706

Open
pstroffolino wants to merge 1 commit into
dev_sprint_25_2from
feature/VPAAMP-667
Open

VPAAMP-667: Live-edge ABR ramp-up bypass for buffer-deadlock recovery#1706
pstroffolino wants to merge 1 commit into
dev_sprint_25_2from
feature/VPAAMP-667

Conversation

@pstroffolino

Copy link
Copy Markdown
Contributor

Add an else-if branch in GetDesiredProfileOnSteadyState() that allows ABR ramp-up when the player is at the live point and the buffer is in the deadlock band (above mABRMinBuffer but at or below mABRMaxBuffer).

Previously, after curl timeouts dropped the profile to index 0, the buffer would stabilise at ~6-9s during standard-latency live. The live edge means downloads arrive at approximately the same rate they are consumed, so the buffer could never grow above the 10s mABRMaxBuffer gate required for ramp-up. For LLDASH the same structural deadlock exists because the steady-state ramp-up path is skipped by the !lowLatencyMode guard.

The new branch uses the same patience counter (mABRHighBufferCounter / mMaxBufferCountCheck) and the same CheckRampupFromSteadyState 30% headroom rule as the existing high-buffer path. VOD playback is unaffected (mIsAtLivePoint == false). Both LLDASH and standard-latency live benefit.

Unit tests: 7 new test cases covering the bypass firing in the deadlock band, LLDASH deadlock band, patience counter, counter reset on ramp-down, and negative cases (not at live point, buffer below min, buffer above max).

Test infrastructure: FakeABR.cpp getRampedUpProfileIndex and CheckRampupFromSteadyState now delegate to g_mockABRManager when available. MockABRManager.h gains a CheckRampupFromSteadyState mock.

@pstroffolino
pstroffolino requested a review from a team as a code owner July 8, 2026 20:38
Add an else-if branch in GetDesiredProfileOnSteadyState() that allows
ABR ramp-up when the player is at the live point and the buffer is in
the deadlock band (above mABRMinBuffer but at or below mABRMaxBuffer).

Previously, after curl timeouts dropped the profile to index 0, the
buffer would stabilise at ~6-9s during standard-latency live. The live
edge means downloads arrive at approximately the same rate they are
consumed, so the buffer could never grow above the 10s mABRMaxBuffer
gate required for ramp-up. For LLDASH the same structural deadlock
exists because the steady-state ramp-up path is skipped by the
!lowLatencyMode guard.

The new branch uses the same patience counter (mABRHighBufferCounter /
mMaxBufferCountCheck) and the same CheckRampupFromSteadyState 30%
headroom rule as the existing high-buffer path. VOD playback is
unaffected (mIsAtLivePoint == false). Both LLDASH and standard-latency
live benefit.

Unit tests: 7 new test cases covering the bypass firing in the deadlock
band, LLDASH deadlock band, patience counter, counter reset on
ramp-down, and negative cases (not at live point, buffer below min,
buffer above max).

Test infrastructure: FakeABR.cpp getRampedUpProfileIndex and
CheckRampupFromSteadyState now delegate to g_mockABRManager when
available. MockABRManager.h gains a CheckRampupFromSteadyState mock.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant