blob: a5bb595150f5cf3ad551d63fd4d41e4aa64efa3f [file] [log] [blame]
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +00001/*
2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
3 *
4 * Use of this source code is governed by a BSD-style license
5 * that can be found in the LICENSE file in the root of the source
6 * tree. An additional intellectual property rights grant can be found
7 * in the file PATENTS. All contributing project authors may
8 * be found in the AUTHORS file in the root of the source tree.
9 */
10
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020011#ifndef MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_
12#define MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000013
kwiberg2bb3afa2016-03-16 15:58:08 -070014#include <memory>
15
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020016#include "rtc_base/constructormagic.h"
zijiehe809dcb42016-04-22 16:08:39 -070017// TODO(zijiehe): These headers are not used in this file, but to avoid build
18// break in remoting/host. We should add headers in each individual files.
Yves Gerey665174f2018-06-19 15:03:05 +020019#include "modules/desktop_capture/desktop_frame.h" // Remove
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020020#include "modules/desktop_capture/shared_desktop_frame.h" // Remove
torbjorng1bcb8f02016-04-21 14:18:19 -070021
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000022namespace webrtc {
23
24// Represents a queue of reusable video frames. Provides access to the 'current'
25// frame - the frame that the caller is working with at the moment, and to the
26// 'previous' frame - the predecessor of the current frame swapped by
27// MoveToNextFrame() call, if any.
28//
29// The caller is expected to (re)allocate frames if current_frame() returns
30// NULL. The caller can mark all frames in the queue for reallocation (when,
31// say, frame dimensions change). The queue records which frames need updating
32// which the caller can query.
33//
34// Frame consumer is expected to never hold more than kQueueLength frames
35// created by this function and it should release the earliest one before trying
36// to capture a new frame (i.e. before MoveToNextFrame() is called).
zijiehe809dcb42016-04-22 16:08:39 -070037template <typename FrameType>
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000038class ScreenCaptureFrameQueue {
39 public:
zijiehe809dcb42016-04-22 16:08:39 -070040 ScreenCaptureFrameQueue() : current_(0) {}
41 ~ScreenCaptureFrameQueue() = default;
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000042
43 // Moves to the next frame in the queue, moving the 'current' frame to become
44 // the 'previous' one.
Yves Gerey665174f2018-06-19 15:03:05 +020045 void MoveToNextFrame() { current_ = (current_ + 1) % kQueueLength; }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000046
47 // Replaces the current frame with a new one allocated by the caller. The
48 // existing frame (if any) is destroyed. Takes ownership of |frame|.
sergeyu5d910282016-06-07 16:41:58 -070049 void ReplaceCurrentFrame(std::unique_ptr<FrameType> frame) {
50 frames_[current_] = std::move(frame);
zijiehe809dcb42016-04-22 16:08:39 -070051 }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000052
53 // Marks all frames obsolete and resets the previous frame pointer. No
54 // frames are freed though as the caller can still access them.
zijiehe809dcb42016-04-22 16:08:39 -070055 void Reset() {
56 for (int i = 0; i < kQueueLength; i++) {
57 frames_[i].reset();
58 }
59 current_ = 0;
60 }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000061
Yves Gerey665174f2018-06-19 15:03:05 +020062 FrameType* current_frame() const { return frames_[current_].get(); }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000063
zijiehe809dcb42016-04-22 16:08:39 -070064 FrameType* previous_frame() const {
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000065 return frames_[(current_ + kQueueLength - 1) % kQueueLength].get();
66 }
67
68 private:
69 // Index of the current frame.
70 int current_;
71
72 static const int kQueueLength = 2;
zijiehe809dcb42016-04-22 16:08:39 -070073 std::unique_ptr<FrameType> frames_[kQueueLength];
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000074
henrikg3c089d72015-09-16 05:37:44 -070075 RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCaptureFrameQueue);
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000076};
77
78} // namespace webrtc
79
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020080#endif // MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_