Under zero-hertz mode, provided that a frame arrived to the VideoStreamEncoder, the receiver may experience up to a second between incoming frames. This results in key frame requests getting serviced with that delay, which is undesired. What's worse is also the fact that if no frame ever arrived to the VideoStreamEncoder, it will not service the keyframe requests at all until the first frame comes. This change introduces VideoSourceInterface::RequestRefreshFrame which results in a refresh frame being sent from complying sources. The method is used under zero-hertz mode from the VideoStreamEncoder when frames didn't arrive to it yet (with changes to the zero-hertz adapter). With this change, when the frame adapter has received at least one frame, it will conditionally repeat the last frame in response to the key frame request. go/rtc-0hz-present Bug: chromium:1255737 Change-Id: I6f97813b3a938747357d45e5dda54f759129b44d Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/242361 Reviewed-by: Erik Språng <sprang@webrtc.org> Reviewed-by: Niels Moller <nisse@webrtc.org> Reviewed-by: Henrik Boström <hbos@webrtc.org> Commit-Queue: Markus Handell <handellm@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35562}
54 lines
2.1 KiB
C++
54 lines
2.1 KiB
C++
/*
|
|
* Copyright 2012 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#ifndef PC_VIDEO_TRACK_SOURCE_PROXY_H_
|
|
#define PC_VIDEO_TRACK_SOURCE_PROXY_H_
|
|
|
|
#include "api/media_stream_interface.h"
|
|
#include "pc/proxy.h"
|
|
|
|
namespace webrtc {
|
|
|
|
// Makes sure the real VideoTrackSourceInterface implementation is destroyed on
|
|
// the signaling thread and marshals all method calls to the signaling thread.
|
|
// TODO(deadbeef): Move this to .cc file. What threads methods are called on is
|
|
// an implementation detail.
|
|
BEGIN_PROXY_MAP(VideoTrackSource)
|
|
PROXY_PRIMARY_THREAD_DESTRUCTOR()
|
|
PROXY_CONSTMETHOD0(SourceState, state)
|
|
BYPASS_PROXY_CONSTMETHOD0(bool, remote)
|
|
BYPASS_PROXY_CONSTMETHOD0(bool, is_screencast)
|
|
PROXY_CONSTMETHOD0(absl::optional<bool>, needs_denoising)
|
|
PROXY_METHOD1(bool, GetStats, Stats*)
|
|
PROXY_SECONDARY_METHOD2(void,
|
|
AddOrUpdateSink,
|
|
rtc::VideoSinkInterface<VideoFrame>*,
|
|
const rtc::VideoSinkWants&)
|
|
PROXY_SECONDARY_METHOD1(void, RemoveSink, rtc::VideoSinkInterface<VideoFrame>*)
|
|
PROXY_SECONDARY_METHOD0(void, RequestRefreshFrame)
|
|
PROXY_METHOD1(void, RegisterObserver, ObserverInterface*)
|
|
PROXY_METHOD1(void, UnregisterObserver, ObserverInterface*)
|
|
PROXY_CONSTMETHOD0(bool, SupportsEncodedOutput)
|
|
PROXY_SECONDARY_METHOD0(void, GenerateKeyFrame)
|
|
PROXY_SECONDARY_METHOD1(void,
|
|
AddEncodedSink,
|
|
rtc::VideoSinkInterface<RecordableEncodedFrame>*)
|
|
PROXY_SECONDARY_METHOD1(void,
|
|
RemoveEncodedSink,
|
|
rtc::VideoSinkInterface<RecordableEncodedFrame>*)
|
|
PROXY_SECONDARY_METHOD1(void,
|
|
ProcessConstraints,
|
|
const webrtc::VideoTrackSourceConstraints&)
|
|
END_PROXY_MAP(VideoTrackSource)
|
|
|
|
} // namespace webrtc
|
|
|
|
#endif // PC_VIDEO_TRACK_SOURCE_PROXY_H_
|