/* * Copyright (c) 2022 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 VIDEO_DECODE_SYNCHRONIZER_H_ #define VIDEO_DECODE_SYNCHRONIZER_H_ #include <stdint.h> #include <functional> #include <memory> #include <set> #include <utility> #include "absl/types/optional.h" #include "api/metronome/metronome.h" #include "api/sequence_checker.h" #include "api/task_queue/task_queue_base.h" #include "api/units/timestamp.h" #include "rtc_base/checks.h" #include "rtc_base/thread_annotations.h" #include "video/frame_decode_scheduler.h" #include "video/frame_decode_timing.h" namespace webrtc { // DecodeSynchronizer synchronizes the frame scheduling by coalescing decoding // on the metronome. // // A video receive stream can use the DecodeSynchronizer by receiving a // FrameDecodeScheduler instance with `CreateSynchronizedFrameScheduler()`. // This instance implements FrameDecodeScheduler and can be used as a normal // scheduler. This instance is owned by the receive stream, and is borrowed by // the DecodeSynchronizer. The DecodeSynchronizer will stop borrowing the // instance when `FrameDecodeScheduler::Stop()` is called, after which the // scheduler may be destroyed by the receive stream. // // When a frame is scheduled for decode by a receive stream using the // DecodeSynchronizer, it will instead be executed on the metronome during the // tick interval where `max_decode_time` occurs. For example, if a frame is // scheduled for decode in 50ms and the tick interval is 20ms, then the frame // will be released for decoding in 2 ticks. See below for illustration, // // In the case where the decode time is in the past, or must occur before the // next metronome tick then the frame will be released right away, allowing a // delayed stream to catch up quickly. // // DecodeSynchronizer is single threaded - all method calls must run on the // `worker_queue_`. class DecodeSynchronizer { … }; } // namespace webrtc #endif // VIDEO_DECODE_SYNCHRONIZER_H_