Call OnRenderedFrame after frame is passed to renderer

This CL reverts change that was made in https://webrtc-review.googlesource.com/c/src/+/174220 where capturing of frame rendered time was moved into VideoFrameMetaData and construction of VideoFrameMetaData was placed before renderer->OnFrame(). That change made video freeze metrics (freeze and pause durations, harmonic frame rate) more off from the actual user experience.

Bug: webrtc:11489, b/261512902
Change-Id: Ic92a0cc1bb6d7b3ee1023804a73aa282848f8c4b
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/287880
Reviewed-by: Philip Eliasson <philipel@webrtc.org>
Commit-Queue: Sergey Silkin <ssilkin@webrtc.org>
Cr-Commit-Position: refs/heads/main@{#38883}
This commit is contained in:
Sergey Silkin 2022-12-13 17:09:12 +01:00 committed by WebRTC LUCI CQ
parent 28b7b2458c
commit f89122c1fb

View File

@ -655,11 +655,20 @@ int VideoReceiveStream2::GetBaseMinimumPlayoutDelayMs() const {
}
void VideoReceiveStream2::OnFrame(const VideoFrame& video_frame) {
VideoFrameMetaData frame_meta(video_frame, clock_->CurrentTime());
source_tracker_.OnFrameDelivered(video_frame.packet_infos());
config_.renderer->OnFrame(video_frame);
// TODO(bugs.webrtc.org/10739): we should set local capture clock offset for
// `video_frame.packet_infos`. But VideoFrame is const qualified here.
// For frame delay metrics, calculated in `OnRenderedFrame`, to better reflect
// user experience measurements must be done as close as possible to frame
// rendering moment. Capture current time, which is used for calculation of
// delay metrics in `OnRenderedFrame`, right after frame is passed to
// renderer. Frame may or may be not rendered by this time. This results in
// inaccuracy but is still the best we can do in the absence of "frame
// rendered" callback from the renderer.
VideoFrameMetaData frame_meta(video_frame, clock_->CurrentTime());
call_->worker_thread()->PostTask(
SafeTask(task_safety_.flag(), [frame_meta, this]() {
RTC_DCHECK_RUN_ON(&worker_sequence_checker_);
@ -675,8 +684,6 @@ void VideoReceiveStream2::OnFrame(const VideoFrame& video_frame) {
stats_proxy_.OnRenderedFrame(frame_meta);
}));
source_tracker_.OnFrameDelivered(video_frame.packet_infos());
config_.renderer->OnFrame(video_frame);
webrtc::MutexLock lock(&pending_resolution_mutex_);
if (pending_resolution_.has_value()) {
if (!pending_resolution_->empty() &&