Index: webrtc/modules/desktop_capture/screen_capturer_mac.mm |
diff --git a/webrtc/modules/desktop_capture/screen_capturer_mac.mm b/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
index c41dc4d7a3b4ba59e4ebe6880f1e090dae5386b5..422d514a3aa1db993e77422476cc5814f7e817ba 100644 |
--- a/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
+++ b/webrtc/modules/desktop_capture/screen_capturer_mac.mm |
@@ -22,6 +22,7 @@ |
#include <OpenGL/CGLMacro.h> |
#include <OpenGL/OpenGL.h> |
+#include "webrtc/base/checks.h" |
#include "webrtc/base/macutils.h" |
#include "webrtc/modules/desktop_capture/desktop_capture_options.h" |
#include "webrtc/modules/desktop_capture/desktop_frame.h" |
@@ -30,8 +31,9 @@ |
#include "webrtc/modules/desktop_capture/mac/desktop_configuration.h" |
#include "webrtc/modules/desktop_capture/mac/desktop_configuration_monitor.h" |
#include "webrtc/modules/desktop_capture/mac/scoped_pixel_buffer_object.h" |
-#include "webrtc/modules/desktop_capture/screen_capture_frame_queue.h" |
+#include "webrtc/modules/desktop_capture/screen_capture_queue.h" |
#include "webrtc/modules/desktop_capture/screen_capturer_helper.h" |
+#include "webrtc/modules/desktop_capture/shared_desktop_frame.h" |
#include "webrtc/system_wrappers/include/logging.h" |
#include "webrtc/system_wrappers/include/tick_util.h" |
@@ -226,7 +228,7 @@ class ScreenCapturerMac : public ScreenCapturer { |
void *user_parameter); |
void ReleaseBuffers(); |
- DesktopFrame* CreateFrame(); |
+ std::unique_ptr<DesktopFrame> CreateFrame(); |
Callback* callback_; |
@@ -234,7 +236,7 @@ class ScreenCapturerMac : public ScreenCapturer { |
ScopedPixelBufferObject pixel_buffer_object_; |
// Queue of the frames buffers. |
- ScreenCaptureFrameQueue queue_; |
+ ScreenCaptureQueue<SharedDesktopFrame> queue_; |
// Current display configuration. |
MacDesktopConfiguration desktop_config_; |
@@ -383,7 +385,8 @@ void ScreenCapturerMac::Start(Callback* callback) { |
void ScreenCapturerMac::Capture(const DesktopRegion& region_to_capture) { |
TickTime capture_start_time = TickTime::Now(); |
- queue_.MoveToNextFrame(); |
+ queue_.MoveToNext(); |
+ RTC_DCHECK(!queue_.current() || !queue_.current()->IsShared()); |
desktop_config_monitor_->Lock(); |
MacDesktopConfiguration new_config = |
@@ -404,10 +407,10 @@ void ScreenCapturerMac::Capture(const DesktopRegion& region_to_capture) { |
// If the current buffer is from an older generation then allocate a new one. |
// Note that we can't reallocate other buffers at this point, since the caller |
// may still be reading from them. |
- if (!queue_.current_frame()) |
- queue_.ReplaceCurrentFrame(CreateFrame()); |
+ if (!queue_.current()) |
+ queue_.ReplaceCurrent(SharedDesktopFrame::Wrap(CreateFrame())); |
- DesktopFrame* current_frame = queue_.current_frame(); |
+ DesktopFrame* current_frame = queue_.current(); |
bool flip = false; // GL capturers need flipping. |
if (rtc::GetOSVersionName() >= rtc::kMacOSLion) { |
@@ -431,7 +434,7 @@ void ScreenCapturerMac::Capture(const DesktopRegion& region_to_capture) { |
CgBlitPreLion(*current_frame, region); |
} |
- DesktopFrame* new_frame = queue_.current_frame()->Share(); |
+ DesktopFrame* new_frame = queue_.current()->Share(); |
*new_frame->mutable_updated_region() = region; |
if (flip) |
@@ -497,7 +500,7 @@ void ScreenCapturerMac::GlBlitFast(const DesktopFrame& frame, |
const DesktopRegion& region) { |
// Clip to the size of our current screen. |
DesktopRect clip_rect = DesktopRect::MakeSize(frame.size()); |
- if (queue_.previous_frame()) { |
+ if (queue_.previous()) { |
// We are doing double buffer for the capture data so we just need to copy |
// the invalid region from the previous capture in the current buffer. |
// TODO(hclam): We can reduce the amount of copying here by subtracting |
@@ -512,7 +515,7 @@ void ScreenCapturerMac::GlBlitFast(const DesktopFrame& frame, |
DesktopRect copy_rect = i.rect(); |
copy_rect.IntersectWith(clip_rect); |
if (!copy_rect.is_empty()) { |
- CopyRect(queue_.previous_frame()->data() + y_offset, |
+ CopyRect(queue_.previous()->data() + y_offset, |
-frame.stride(), |
frame.data() + y_offset, |
-frame.stride(), |
@@ -581,9 +584,9 @@ void ScreenCapturerMac::CgBlitPreLion(const DesktopFrame& frame, |
// Copy the entire contents of the previous capture buffer, to capture over. |
// TODO(wez): Get rid of this as per crbug.com/145064, or implement |
// crbug.com/92354. |
- if (queue_.previous_frame()) { |
+ if (queue_.previous()) { |
memcpy(frame.data(), |
- queue_.previous_frame()->data(), |
+ queue_.previous()->data(), |
frame.stride() * frame.size().height()); |
} |
@@ -636,9 +639,9 @@ bool ScreenCapturerMac::CgBlitPostLion(const DesktopFrame& frame, |
// Copy the entire contents of the previous capture buffer, to capture over. |
// TODO(wez): Get rid of this as per crbug.com/145064, or implement |
// crbug.com/92354. |
- if (queue_.previous_frame()) { |
+ if (queue_.previous()) { |
memcpy(frame.data(), |
- queue_.previous_frame()->data(), |
+ queue_.previous()->data(), |
frame.stride() * frame.size().height()); |
} |
@@ -964,13 +967,13 @@ void ScreenCapturerMac::ScreenUpdateMoveCallback( |
capturer->ScreenUpdateMove(delta, count, rect_array); |
} |
-DesktopFrame* ScreenCapturerMac::CreateFrame() { |
+std::unique_ptr<DesktopFrame> ScreenCapturerMac::CreateFrame() { |
std::unique_ptr<DesktopFrame> frame( |
new BasicDesktopFrame(screen_pixel_bounds_.size())); |
frame->set_dpi(DesktopVector(kStandardDPI * dip_to_pixel_scale_, |
kStandardDPI * dip_to_pixel_scale_)); |
- return frame.release(); |
+ return frame; |
} |
} // namespace |