mirror of
https://github.com/gnif/LookingGlass.git
synced 2026-08-23 07:31:30 +00:00
[client] audio: ignore jitter after underruns
Do not learn late delivery from packets that already caused an underrun and media-clock rebase. Preserve learned jitter only across continuous playback.
This commit is contained in:
@@ -924,7 +924,7 @@ static int64_t playbackMapMediaTime(PlaybackSourceData * sourceData,
|
|||||||
}
|
}
|
||||||
|
|
||||||
const int64_t delta = time - sourceData->mediaTime;
|
const int64_t delta = time - sourceData->mediaTime;
|
||||||
if ((!clock || !clock->discontinuity) &&
|
if (!*discontinuity && (!clock || !clock->discontinuity) &&
|
||||||
sourceData->mediaClockFromSource == fromSource &&
|
sourceData->mediaClockFromSource == fromSource &&
|
||||||
sourceData->mediaPositionValid &&
|
sourceData->mediaPositionValid &&
|
||||||
sourceData->mediaPosition == position && delta >= 0 &&
|
sourceData->mediaPosition == position && delta >= 0 &&
|
||||||
@@ -937,8 +937,9 @@ static int64_t playbackMapMediaTime(PlaybackSourceData * sourceData,
|
|||||||
(now - sourceData->lastArrivalTime) * 1.0e-9;
|
(now - sourceData->lastArrivalTime) * 1.0e-9;
|
||||||
const double lateness = max(arrivalDelta - mediaDelta, 0.0);
|
const double lateness = max(arrivalDelta - mediaDelta, 0.0);
|
||||||
|
|
||||||
/* Learn harmful late delivery before a buffer underrun rebases the media
|
/* Learn harmful late delivery only while playback remains continuous.
|
||||||
* clock. Early catch-up packets do not require additional reserve. */
|
* An underrun rebases the media clock and must not become future
|
||||||
|
* latency. Early catch-up packets do not require additional reserve. */
|
||||||
sourceData->arrivalJitterSec =
|
sourceData->arrivalJitterSec =
|
||||||
min(PLAYBACK_MAX_JITTER_SEC,
|
min(PLAYBACK_MAX_JITTER_SEC,
|
||||||
max(lateness, sourceData->arrivalJitterSec *
|
max(lateness, sourceData->arrivalJitterSec *
|
||||||
|
|||||||
@@ -819,6 +819,7 @@ if(ENABLE_AUDIO)
|
|||||||
convert
|
convert
|
||||||
provider
|
provider
|
||||||
playback-retry
|
playback-retry
|
||||||
|
jitter
|
||||||
consent
|
consent
|
||||||
quiesce
|
quiesce
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -624,6 +624,36 @@ static void testPlaybackRetry(void)
|
|||||||
stopAudio();
|
stopAudio();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void testPlaybackJitter(void)
|
||||||
|
{
|
||||||
|
PlaybackSourceData source = { 0 };
|
||||||
|
playbackPrepareMediaClock(&source, NULL);
|
||||||
|
|
||||||
|
bool discontinuity = false;
|
||||||
|
playbackMapMediaTime(&source, NULL, 480, 48000, 0,
|
||||||
|
&discontinuity);
|
||||||
|
source.inputPosition = 480;
|
||||||
|
source.lastArrivalTime = 0;
|
||||||
|
|
||||||
|
discontinuity = true;
|
||||||
|
playbackMapMediaTime(&source, NULL, 480, 48000,
|
||||||
|
INT64_C(110000000), &discontinuity);
|
||||||
|
CHECK(discontinuity);
|
||||||
|
CHECK(source.arrivalJitterSec == 0.0);
|
||||||
|
|
||||||
|
memset(&source, 0, sizeof(source));
|
||||||
|
playbackPrepareMediaClock(&source, NULL);
|
||||||
|
discontinuity = false;
|
||||||
|
playbackMapMediaTime(&source, NULL, 480, 48000, 0,
|
||||||
|
&discontinuity);
|
||||||
|
source.inputPosition = 480;
|
||||||
|
source.lastArrivalTime = 0;
|
||||||
|
playbackMapMediaTime(&source, NULL, 480, 48000,
|
||||||
|
INT64_C(20000000), &discontinuity);
|
||||||
|
CHECK(source.arrivalJitterSec > 0.009);
|
||||||
|
CHECK(source.arrivalJitterSec < 0.011);
|
||||||
|
}
|
||||||
|
|
||||||
static void testConsent(void)
|
static void testConsent(void)
|
||||||
{
|
{
|
||||||
reset();
|
reset();
|
||||||
@@ -750,6 +780,7 @@ static const struct Test tests[] =
|
|||||||
{ "convert" , testConvert },
|
{ "convert" , testConvert },
|
||||||
{ "provider" , testProvider },
|
{ "provider" , testProvider },
|
||||||
{ "playback-retry", testPlaybackRetry },
|
{ "playback-retry", testPlaybackRetry },
|
||||||
|
{ "jitter" , testPlaybackJitter },
|
||||||
{ "consent" , testConsent },
|
{ "consent" , testConsent },
|
||||||
{ "quiesce" , testQuiesce },
|
{ "quiesce" , testQuiesce },
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user