[vlc-devel] [PATCH 2/2] audio_output: coreaudio: use int64_t for host time
Alexandre Janniaux
ajanni at videolabs.io
Thu Jul 23 09:57:08 CEST 2020
The computation was leading to very high render_delay (for example in
some measurement, render_delay = 6148914691236500), and so glitch during
playback with for instance the following warnings:
libvlc video output warning: picture is too late to be displayed
(missing 4279998112535367 ms)
Instead, use int64_t for host_time. Unsignedness is kept for computation
on frames / bytes.
---
modules/audio_output/coreaudio_common.c | 23 +++++++++++++----------
modules/audio_output/coreaudio_common.h | 6 +++---
2 files changed, 16 insertions(+), 13 deletions(-)
diff --git a/modules/audio_output/coreaudio_common.c b/modules/audio_output/coreaudio_common.c
index 797c3e623d..b3df6289b8 100644
--- a/modules/audio_output/coreaudio_common.c
+++ b/modules/audio_output/coreaudio_common.c
@@ -46,16 +46,17 @@ FramesToBytes(struct aout_sys_common *p_sys, uint64_t i_frames)
static inline uint64_t
UsToFrames(struct aout_sys_common *p_sys, vlc_tick_t i_us)
{
+ assert(i_us > 0);
return samples_from_vlc_tick(i_us, p_sys->i_rate);
}
static inline vlc_tick_t
-HostTimeToTick(struct aout_sys_common *p_sys, uint64_t i_host_time)
+HostTimeToTick(struct aout_sys_common *p_sys, int64_t i_host_time)
{
return VLC_TICK_FROM_NS(i_host_time * p_sys->tinfo.numer / p_sys->tinfo.denom);
}
-static inline uint64_t
+static inline int64_t
TickToHostTime(struct aout_sys_common *p_sys, vlc_tick_t i_us)
{
return NS_FROM_VLC_TICK(i_us * p_sys->tinfo.denom / p_sys->tinfo.numer);
@@ -124,7 +125,7 @@ ca_Open(audio_output_t *p_aout)
/* Called from render callbacks. No lock, wait, and IO here */
void
-ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
+ca_Render(audio_output_t *p_aout, uint32_t i_frames, int64_t i_host_time,
uint8_t *p_output, size_t i_requested)
{
struct aout_sys_common *p_sys = (struct aout_sys_common *) p_aout->sys;
@@ -157,7 +158,7 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
* */
const size_t i_requested_us =
FramesToUs(p_sys, BytesToFrames(p_sys, i_requested));
- const uint64_t i_requested_host_time =
+ const int64_t i_requested_host_time =
TickToHostTime(p_sys, i_requested_us);
if (p_sys->i_first_render_host_time >= i_host_time + i_requested_host_time)
{
@@ -169,7 +170,7 @@ ca_Render(audio_output_t *p_aout, uint32_t i_frames, uint64_t i_host_time,
const vlc_tick_t i_silence_us =
HostTimeToTick(p_sys, p_sys->i_first_render_host_time - i_host_time);
- const uint64_t i_silence_bytes =
+ const size_t i_silence_bytes =
FramesToBytes(p_sys, UsToFrames(p_sys, i_silence_us));
assert(i_silence_bytes <= i_requested);
memset(p_output, 0, i_silence_bytes);
@@ -244,17 +245,19 @@ ca_TimeGet(audio_output_t *p_aout, vlc_tick_t *delay)
if (p_sys->i_render_host_time == 0 || p_sys->i_first_render_host_time == 0)
{
+ msg_Info(p_aout, "aout - not yet started");
/* Not yet started (or reached the first_render host time) */
lock_unlock(p_sys);
return -1;
}
- uint64_t i_render_delay_host_time = p_sys->i_render_host_time
- - mach_absolute_time();
+ int64_t i_render_delay_host_time = p_sys->i_render_host_time
+ - mach_absolute_time();
const vlc_tick_t i_render_delay =
HostTimeToTick(p_sys, i_render_delay_host_time);
- *delay = ca_GetLatencyLocked(p_aout) + i_render_delay;
+ vlc_tick_t latency = ca_GetLatencyLocked(p_aout);
+ *delay = latency + i_render_delay;
lock_unlock(p_sys);
return 0;
}
@@ -511,8 +514,8 @@ RenderCallback(void *p_data, AudioUnitRenderActionFlags *ioActionFlags,
VLC_UNUSED(inTimeStamp);
VLC_UNUSED(inBusNumber);
- uint64_t i_host_time = (inTimeStamp->mFlags & kAudioTimeStampHostTimeValid)
- ? inTimeStamp->mHostTime : 0;
+ int64_t i_host_time = (inTimeStamp->mFlags & kAudioTimeStampHostTimeValid)
+ ? inTimeStamp->mHostTime : 0;
ca_Render(p_data, inNumberFrames, i_host_time, ioData->mBuffers[0].mData,
ioData->mBuffers[0].mDataByteSize);
diff --git a/modules/audio_output/coreaudio_common.h b/modules/audio_output/coreaudio_common.h
index 4bd6139493..c757cf0042 100644
--- a/modules/audio_output/coreaudio_common.h
+++ b/modules/audio_output/coreaudio_common.h
@@ -60,8 +60,8 @@ struct aout_sys_common
bool b_played;
block_t *p_out_chain;
block_t **pp_out_last;
- uint64_t i_render_host_time;
- uint64_t i_first_render_host_time;
+ int64_t i_render_host_time;
+ int64_t i_first_render_host_time;
uint32_t i_render_frames;
vlc_sem_t flush_sem;
@@ -86,7 +86,7 @@ struct aout_sys_common
int ca_Open(audio_output_t *p_aout);
-void ca_Render(audio_output_t *p_aout, uint32_t i_nb_samples, uint64_t i_host_time,
+void ca_Render(audio_output_t *p_aout, uint32_t i_nb_samples, int64_t i_host_time,
uint8_t *p_output, size_t i_requested);
int ca_TimeGet(audio_output_t *p_aout, vlc_tick_t *delay);
--
2.27.0
More information about the vlc-devel
mailing list