[vlc-commits] aout_TimeReport: feedback timing from audio output to audio decoder
Rémi Denis-Courmont
git at videolan.org
Sat Aug 6 22:52:15 CEST 2011
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Aug 6 23:50:27 2011 +0300| [d3d3989066d1d5400f3dd495c8cc79bfe350bd35] | committer: Rémi Denis-Courmont
aout_TimeReport: feedback timing from audio output to audio decoder
Currently, this is used to trigger resampling in the audio "input"
(i.e. filters) as before.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=d3d3989066d1d5400f3dd495c8cc79bfe350bd35
---
include/vlc_aout.h | 2 ++
src/audio_output/dec.c | 43 +++++++++++++++++++++++++++++++++++++++++++
src/libvlccore.sym | 1 +
3 files changed, 46 insertions(+), 0 deletions(-)
diff --git a/include/vlc_aout.h b/include/vlc_aout.h
index f5eaafb..b3d4954 100644
--- a/include/vlc_aout.h
+++ b/include/vlc_aout.h
@@ -244,6 +244,8 @@ VLC_API void aout_VolumeSoftInit( audio_output_t * );
VLC_API void aout_VolumeHardInit( audio_output_t *, aout_volume_cb );
VLC_API void aout_VolumeHardSet( audio_output_t *, float, bool );
+VLC_API void aout_TimeReport(audio_output_t *, mtime_t);
+
VLC_API int aout_ChannelsRestart( vlc_object_t *, const char *, vlc_value_t, vlc_value_t, void * );
/* */
diff --git a/src/audio_output/dec.c b/src/audio_output/dec.c
index 0f3adda..d22807d 100644
--- a/src/audio_output/dec.c
+++ b/src/audio_output/dec.c
@@ -311,3 +311,46 @@ bool aout_DecIsEmpty (audio_output_t *aout)
aout_unlock (aout);
return end_date == VLC_TS_INVALID || end_date <= mdate();
}
+
+/**
+ * Notifies the audio input of the drift from the requested audio
+ * playback timestamp (@ref block_t.i_pts) to the anticipated playback time
+ * as reported by the audio output hardware.
+ * Depending on the drift amplitude, the input core may ignore the drift
+ * trigger upsampling or downsampling, or even discard samples.
+ * Future VLC versions may instead adjust the input decoding speed.
+ *
+ * The audio output plugin is responsible for estimating the ideal current
+ * playback time defined as follows:
+ * ideal time = buffer timestamp - (output latency + pending buffer duration)
+ *
+ * Practically, this is the PTS (block_t.i_pts) of the current buffer minus
+ * the latency reported by the output programming interface.
+ * Computing the estimated drift directly would probably be more intuitive.
+ * However the use of an absolute time value does not introduce extra
+ * measurement errors due to the CPU scheduling jitter and clock resolution.
+ * Furthermore, the ideal while it is an abstract value, is easy for most
+ * audio output plugins to compute.
+ * The following definition is equivalent but depends on the clock time:
+ * ideal time = real time + drift
+
+ * @note If aout_LatencyReport() is never called, the core will assume that
+ * there is no drift.
+ *
+ * @param ideal estimated ideal time as defined above.
+ */
+void aout_TimeReport (audio_output_t *aout, mtime_t ideal)
+{
+ mtime_t delta = mdate() - ideal /* = -drift */;
+
+ aout_assert_locked (aout);
+ if (delta < -AOUT_MAX_PTS_ADVANCE || +AOUT_MAX_PTS_DELAY < delta)
+ {
+ aout_owner_t *owner = aout_owner (aout);
+
+ msg_Warn (aout, "not synchronized (%"PRId64" us), resampling",
+ delta);
+ if (date_Get (&owner->sync.date) != VLC_TS_INVALID)
+ date_Move (&owner->sync.date, delta);
+ }
+}
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 9f6a0ff..f6216c9 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -29,6 +29,7 @@ aout_VolumeUp
aout_ToggleMute
aout_IsMuted
aout_SetMute
+aout_TimeReport
aout_VolumeNoneInit
aout_VolumeSoftInit
aout_VolumeHardInit
More information about the vlc-commits
mailing list