[vlc-devel] [PATCH 2/2] audio_output: coreaudio: use int64_t for host time

Thomas Guillem thomas at gllm.fr
Thu Jul 23 10:31:19 CEST 2020


cf. https://developer.apple.com/documentation/coreaudiotypes/audiotimestamp/1422266-mhosttime

Host time is an uint64_t.

Should we instead fix the unsigned calculation?
It seems that on iOS, the host_time can be before mach_absolute_time() ? We should debug why it happens. It the host_time always late or only the first ones?


On Thu, Jul 23, 2020, at 09:57, Alexandre Janniaux wrote:
> 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");

stray debug

>          /* 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
> 
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel


More information about the vlc-devel mailing list