[vlc-devel] [PATCH 08/18] aout: use original pts as play date
Thomas Guillem
thomas at gllm.fr
Thu Mar 7 15:25:30 CET 2019
This will be required by the new vlc_clock_t. Indeed, in case of rate change,
only the filters are changed but not the aout. This means that aout->time_get()
timebase need to be the same than clock update points: the orignal pts given by
the decoder. In case the filters are outputting slightly more or less data
because of a ressampler imprecision, the delay will be corrected via a future
aout->time_get() call.
---
src/audio_output/aout_internal.h | 1 +
src/audio_output/dec.c | 20 ++++++++++++++++++--
2 files changed, 19 insertions(+), 2 deletions(-)
diff --git a/src/audio_output/aout_internal.h b/src/audio_output/aout_internal.h
index 32be61034f..5b302a5d93 100644
--- a/src/audio_output/aout_internal.h
+++ b/src/audio_output/aout_internal.h
@@ -67,6 +67,7 @@ typedef struct
int resamp_type; /**< Resampler mode (FIXME: redundant / resampling) */
bool discontinuity;
} sync;
+ vlc_tick_t original_pts;
int requested_stereo_mode; /**< Requested stereo mode set by the user */
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 0898487668..81fc4fdef8 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -99,6 +99,7 @@ error:
owner->sync.rate = 1.f;
owner->sync.resamp_type = AOUT_RESAMPLING_NONE;
owner->sync.discontinuity = true;
+ owner->original_pts = VLC_TICK_INVALID;
atomic_init (&owner->buffers_lost, 0);
atomic_init (&owner->buffers_played, 0);
@@ -352,7 +353,10 @@ int aout_DecPlay(audio_output_t *aout, block_t *block)
goto drop; /* Pipeline is unrecoverably broken :-( */
if (block->i_flags & BLOCK_FLAG_DISCONTINUITY)
+ {
owner->sync.discontinuity = true;
+ owner->original_pts = VLC_TICK_INVALID;
+ }
if (atomic_load_explicit(&owner->vp.update, memory_order_relaxed))
{
@@ -362,6 +366,15 @@ int aout_DecPlay(audio_output_t *aout, block_t *block)
vlc_mutex_unlock (&owner->vp.lock);
}
+ if (owner->original_pts == VLC_TICK_INVALID)
+ {
+ /* Use the original PTS for synchronization and as a play date of the
+ * aout module. This PTS need to be saved here in order to use the PTS
+ * of the first block that has been filtered. Indeed, aout filters may
+ * need more than one block to output a new one. */
+ owner->original_pts = block->i_pts;
+ }
+
block = aout_FiltersPlay(owner->filters, block, owner->sync.rate);
if (block == NULL)
return ret;
@@ -370,15 +383,17 @@ int aout_DecPlay(audio_output_t *aout, block_t *block)
aout_volume_Amplify (owner->volume, block);
/* Drift correction */
- aout_DecSynchronize(aout, block->i_pts);
+ aout_DecSynchronize(aout, owner->original_pts);
/* Output */
owner->sync.discontinuity = false;
- aout->play(aout, block, block->i_pts);
+ aout->play(aout, block, owner->original_pts);
+ owner->original_pts = VLC_TICK_INVALID;
atomic_fetch_add_explicit(&owner->buffers_played, 1, memory_order_relaxed);
return ret;
drop:
owner->sync.discontinuity = true;
+ owner->original_pts = VLC_TICK_INVALID;
block_Release (block);
atomic_fetch_add_explicit(&owner->buffers_lost, 1, memory_order_relaxed);
return ret;
@@ -428,4 +443,5 @@ void aout_DecFlush (audio_output_t *aout, bool wait)
aout->flush(aout, wait);
}
owner->sync.discontinuity = true;
+ owner->original_pts = VLC_TICK_INVALID;
}
--
2.20.1
More information about the vlc-devel
mailing list