blob: efedc03a92f14a5be174b729f0a8af67a74b1d62 [file] [log] [blame]
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +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
11#include "webrtc/modules/desktop_capture/desktop_frame.h"
12
zijiehe2970c2a2016-05-20 22:08:00 -070013#include <utility>
14
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000015#include <string.h>
16
Zijie Hecd66a772017-07-21 14:13:46 -070017#include "webrtc/modules/desktop_capture/desktop_geometry.h"
Edward Lemurc20978e2017-07-06 19:44:34 +020018#include "webrtc/rtc_base/checks.h"
Zijie He09f16c62017-07-31 20:26:11 -070019#include "webrtc/rtc_base/ptr_util.h"
zijiehe2970c2a2016-05-20 22:08:00 -070020
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000021namespace webrtc {
22
23DesktopFrame::DesktopFrame(DesktopSize size,
24 int stride,
25 uint8_t* data,
26 SharedMemory* shared_memory)
zijiehe2970c2a2016-05-20 22:08:00 -070027 : data_(data),
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000028 shared_memory_(shared_memory),
Zijie He5acd9d02017-08-24 12:41:53 -070029 size_(size),
zijiehe2970c2a2016-05-20 22:08:00 -070030 stride_(stride),
zijiehe88ac8272017-03-22 11:38:46 -070031 capture_time_ms_(0),
Zijie He09f16c62017-07-31 20:26:11 -070032 capturer_id_(DesktopCapturerId::kUnknown) {
Zijie He5acd9d02017-08-24 12:41:53 -070033 RTC_DCHECK(size_.width() >= 0);
34 RTC_DCHECK(size_.height() >= 0);
Zijie He09f16c62017-07-31 20:26:11 -070035}
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000036
Zijie Hecd66a772017-07-21 14:13:46 -070037DesktopFrame::~DesktopFrame() = default;
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000038
qiangchen6f79d842016-09-21 16:44:55 -070039void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, int src_stride,
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000040 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070041 RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect));
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000042
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000043 uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left());
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000044 for (int y = 0; y < dest_rect.height(); ++y) {
45 memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width());
46 src_buffer += src_stride;
47 dest += stride();
48 }
49}
50
51void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame,
52 const DesktopVector& src_pos,
53 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070054 RTC_CHECK(DesktopRect::MakeSize(src_frame.size()).ContainsRect(
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000055 DesktopRect::MakeOriginSize(src_pos, dest_rect.size())));
56
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000057 CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos),
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000058 src_frame.stride(), dest_rect);
59}
60
Zijie He85e6a4b2017-08-29 18:03:46 -070061DesktopRect DesktopFrame::rect() const {
62 return DesktopRect::MakeOriginSize(top_left(), size());
63}
64
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000065uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const {
66 return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x();
67}
68
Zijie He5acd9d02017-08-24 12:41:53 -070069void DesktopFrame::CopyFrameInfoFrom(const DesktopFrame& other) {
70 set_dpi(other.dpi());
71 set_capture_time_ms(other.capture_time_ms());
72 set_capturer_id(other.capturer_id());
73 *mutable_updated_region() = other.updated_region();
74 set_top_left(other.top_left());
75}
Zijie He09f16c62017-07-31 20:26:11 -070076
Zijie He5acd9d02017-08-24 12:41:53 -070077void DesktopFrame::MoveFrameInfoFrom(DesktopFrame* other) {
78 set_dpi(other->dpi());
79 set_capture_time_ms(other->capture_time_ms());
80 set_capturer_id(other->capturer_id());
81 mutable_updated_region()->Swap(other->mutable_updated_region());
82 set_top_left(other->top_left());
83}
84
85BasicDesktopFrame::BasicDesktopFrame(DesktopSize size)
86 : DesktopFrame(size, kBytesPerPixel * size.width(),
87 new uint8_t[kBytesPerPixel * size.width() * size.height()],
Zijie He09f16c62017-07-31 20:26:11 -070088 nullptr) {}
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000089
90BasicDesktopFrame::~BasicDesktopFrame() {
91 delete[] data_;
92}
93
Zijie He5acd9d02017-08-24 12:41:53 -070094// static
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000095DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) {
96 DesktopFrame* result = new BasicDesktopFrame(frame.size());
97 for (int y = 0; y < frame.size().height(); ++y) {
98 memcpy(result->data() + y * result->stride(),
99 frame.data() + y * frame.stride(),
100 frame.size().width() * kBytesPerPixel);
101 }
Zijie He5acd9d02017-08-24 12:41:53 -0700102 result->CopyFrameInfoFrom(frame);
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +0000103 return result;
104}
105
sergeyucc9669c2016-02-09 15:13:26 -0800106// static
kwiberg2bb3afa2016-03-16 15:58:08 -0700107std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
sergeyucc9669c2016-02-09 15:13:26 -0800108 DesktopSize size,
109 SharedMemoryFactory* shared_memory_factory) {
Zijie He09f16c62017-07-31 20:26:11 -0700110 RTC_DCHECK(shared_memory_factory);
111
Zijie He5acd9d02017-08-24 12:41:53 -0700112 size_t buffer_size = size.height() * size.width() * kBytesPerPixel;
zijiehe2970c2a2016-05-20 22:08:00 -0700113 std::unique_ptr<SharedMemory> shared_memory =
114 shared_memory_factory->CreateSharedMemory(buffer_size);
sergeyucc9669c2016-02-09 15:13:26 -0800115 if (!shared_memory)
116 return nullptr;
117
Zijie He09f16c62017-07-31 20:26:11 -0700118 return rtc::MakeUnique<SharedMemoryDesktopFrame>(
Zijie He5acd9d02017-08-24 12:41:53 -0700119 size, size.width() * kBytesPerPixel, std::move(shared_memory));
sergeyucc9669c2016-02-09 15:13:26 -0800120}
121
122SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size,
123 int stride,
124 SharedMemory* shared_memory)
Zijie He5acd9d02017-08-24 12:41:53 -0700125 : DesktopFrame(size,
sergeyucc9669c2016-02-09 15:13:26 -0800126 stride,
127 reinterpret_cast<uint8_t*>(shared_memory->data()),
128 shared_memory) {}
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +0000129
Zijie He5acd9d02017-08-24 12:41:53 -0700130SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(
131 DesktopSize size,
132 int stride,
133 std::unique_ptr<SharedMemory> shared_memory)
134 : SharedMemoryDesktopFrame(size,
135 stride,
136 shared_memory.release()) {}
137
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +0000138SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() {
139 delete shared_memory_;
140}
141
142} // namespace webrtc