diff --git a/libobs/obs-source.c b/libobs/obs-source.c index ac7235d2a..3402ee418 100644 --- a/libobs/obs-source.c +++ b/libobs/obs-source.c @@ -894,19 +894,18 @@ static inline bool frame_out_of_bounds(obs_source_t source, uint64_t ts) } static inline struct source_frame *get_closest_frame(obs_source_t source, - uint64_t sys_time) + uint64_t sys_time, int *audio_time_refs) { struct source_frame *next_frame = source->video_frames.array[0]; struct source_frame *frame = NULL; uint64_t sys_offset = sys_time - source->last_sys_timestamp; uint64_t frame_time = next_frame->timestamp; uint64_t frame_offset = 0; - int audio_time_refs = 0; /* account for timestamp invalidation */ if (frame_out_of_bounds(source, frame_time)) { source->last_frame_ts = next_frame->timestamp; - audio_time_refs++; + (*audio_time_refs)++; } else { frame_offset = frame_time - source->last_frame_ts; source->last_frame_ts += sys_offset; @@ -927,20 +926,13 @@ static inline struct source_frame *get_closest_frame(obs_source_t source, if ((next_frame->timestamp - frame_time) > MAX_TIMESTAMP_JUMP) { source->last_frame_ts = next_frame->timestamp - frame_offset; - audio_time_refs++; + (*audio_time_refs)++; } frame_time = next_frame->timestamp; frame_offset = frame_time - source->last_frame_ts; } - /* reset timing to current system time */ - if (frame) { - source->timing_adjust = sys_time - frame->timestamp; - source->audio_reset_ref += audio_time_refs; - source->timing_set = true; - } - return frame; } @@ -952,8 +944,9 @@ static inline struct source_frame *get_closest_frame(obs_source_t source, */ struct source_frame *obs_source_getframe(obs_source_t source) { - uint64_t last_frame_time = source->last_frame_ts; struct source_frame *frame = NULL; + uint64_t last_frame_time = source->last_frame_ts; + int audio_time_refs = 0; uint64_t sys_time; pthread_mutex_lock(&source->video_mutex); @@ -969,7 +962,14 @@ struct source_frame *obs_source_getframe(obs_source_t source) source->last_frame_ts = frame->timestamp; } else { - frame = get_closest_frame(source, sys_time); + frame = get_closest_frame(source, sys_time, &audio_time_refs); + } + + /* reset timing to current system time */ + if (frame) { + source->audio_reset_ref += audio_time_refs; + source->timing_adjust = sys_time - frame->timestamp; + source->timing_set = true; } source->last_sys_timestamp = sys_time;