blob: a9a1643058e809cb663ed899742f77d07681d655 [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.
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020019#include "modules/desktop_capture/desktop_frame.h" // Remove
20#include "modules/desktop_capture/shared_desktop_frame.h" // Remove
torbjorng1bcb8f02016-04-21 14:18:19 -070021
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000022
23namespace webrtc {
24
25// Represents a queue of reusable video frames. Provides access to the 'current'
26// frame - the frame that the caller is working with at the moment, and to the
27// 'previous' frame - the predecessor of the current frame swapped by
28// MoveToNextFrame() call, if any.
29//
30// The caller is expected to (re)allocate frames if current_frame() returns
31// NULL. The caller can mark all frames in the queue for reallocation (when,
32// say, frame dimensions change). The queue records which frames need updating
33// which the caller can query.
34//
35// Frame consumer is expected to never hold more than kQueueLength frames
36// created by this function and it should release the earliest one before trying
37// to capture a new frame (i.e. before MoveToNextFrame() is called).
zijiehe809dcb42016-04-22 16:08:39 -070038template <typename FrameType>
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000039class ScreenCaptureFrameQueue {
40 public:
zijiehe809dcb42016-04-22 16:08:39 -070041 ScreenCaptureFrameQueue() : current_(0) {}
42 ~ScreenCaptureFrameQueue() = default;
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000043
44 // Moves to the next frame in the queue, moving the 'current' frame to become
45 // the 'previous' one.
zijiehe809dcb42016-04-22 16:08:39 -070046 void MoveToNextFrame() {
47 current_ = (current_ + 1) % kQueueLength;
48 }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000049
50 // Replaces the current frame with a new one allocated by the caller. The
51 // existing frame (if any) is destroyed. Takes ownership of |frame|.
sergeyu5d910282016-06-07 16:41:58 -070052 void ReplaceCurrentFrame(std::unique_ptr<FrameType> frame) {
53 frames_[current_] = std::move(frame);
zijiehe809dcb42016-04-22 16:08:39 -070054 }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000055
56 // Marks all frames obsolete and resets the previous frame pointer. No
57 // frames are freed though as the caller can still access them.
zijiehe809dcb42016-04-22 16:08:39 -070058 void Reset() {
59 for (int i = 0; i < kQueueLength; i++) {
60 frames_[i].reset();
61 }
62 current_ = 0;
63 }
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000064
zijiehe809dcb42016-04-22 16:08:39 -070065 FrameType* current_frame() const {
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000066 return frames_[current_].get();
67 }
68
zijiehe809dcb42016-04-22 16:08:39 -070069 FrameType* previous_frame() const {
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000070 return frames_[(current_ + kQueueLength - 1) % kQueueLength].get();
71 }
72
73 private:
74 // Index of the current frame.
75 int current_;
76
77 static const int kQueueLength = 2;
zijiehe809dcb42016-04-22 16:08:39 -070078 std::unique_ptr<FrameType> frames_[kQueueLength];
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000079
henrikg3c089d72015-09-16 05:37:44 -070080 RTC_DISALLOW_COPY_AND_ASSIGN(ScreenCaptureFrameQueue);
sergeyu@chromium.org3d34f662013-06-04 18:51:23 +000081};
82
83} // namespace webrtc
84
Mirko Bonadei92ea95e2017-09-15 06:47:31 +020085#endif // MODULES_DESKTOP_CAPTURE_SCREEN_CAPTURE_FRAME_QUEUE_H_