mpv icon indicating copy to clipboard operation
mpv copied to clipboard

ao: proper end_time calulation & ao_read_frame()

Open ruihe774 opened this issue 9 months ago • 2 comments

This PR fixes the calculation of ao->buffer_state->end_time_ns when pad_silence == false and partial data is returned for pull-based AO. Previously, end_time_ns was calculated by driver delay plus the duration of requested sample count. It was not accurate if pad_silence == false giving the number of returned samples can vary. To fix this issue, this PR introduces an API change that ao_read_data() and ao_read_data_converted() now accepts start_time_ns, which is the the expected delay until the first sample reaches the speakers, instead of out_time_ns. ao_read_data() then updates ao->buffer_state->end_time_ns using start_time_ns and the actual sample count got from the buffer.

This PR also introduces a new API ao_read_frame() for pull-based AO. Now pull-based AO can directly get mp_aframe. For AO that can handle data with variable size, this new API bypass the copying of audio data from audio frames into data buffer in read_buffer(). A zero-copy ao_avfoundation that utilizes ao_read_frame() is included in this PR.

This PR depends on #13967. Before it is merged, I think I'd better keep this PR a draft, though my work is done already.

ruihe774 avatar May 04 '24 08:05 ruihe774

Download the artifacts for this pull request:

Windows
macOS

github-actions[bot] avatar May 04 '24 09:05 github-actions[bot]

TBH I just forgot this for some while :)

I rebased this and added some extra commits, including:

  • A rewritten playing_audio_pts() which reports pts properly during playback speed changes; this allows more accurate AV compensation in video-sync=display-*.
  • A new option --avfoundation-buffer.

@sfan5 could you plz review this?

BTW, @sfan5 I'm not very satisfied with current implementation of AV compensation of video-sync=audio:

https://github.com/mpv-player/mpv/blob/3e499ff3bc3cdd668efc41974c8cdd64d9a99178/player/video.c#L621

When buffered_audio and delay is large (2 second when using ao_avfoundation), changing the video_speed is bound to cause a jump in time_frame. As the result, the video gets stalled (video_pts stops advancing) while audio continues; it is the root cause of many desync cases in ao_avfoundation.

ruihe774 avatar Oct 18 '24 13:10 ruihe774