blob: a58762fb1cb29c662ca29258516788c4031c6b2e [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)
Zijie Hecd66a772017-07-21 14:13:46 -070027 : DesktopFrame(DesktopRect::MakeSize(size),
28 stride,
29 data,
30 shared_memory) {}
31
32DesktopFrame::DesktopFrame(DesktopRect rect,
33 int stride,
34 uint8_t* data,
35 SharedMemory* shared_memory)
zijiehe2970c2a2016-05-20 22:08:00 -070036 : data_(data),
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000037 shared_memory_(shared_memory),
Zijie Hecd66a772017-07-21 14:13:46 -070038 rect_(rect),
zijiehe2970c2a2016-05-20 22:08:00 -070039 stride_(stride),
zijiehe88ac8272017-03-22 11:38:46 -070040 capture_time_ms_(0),
Zijie He09f16c62017-07-31 20:26:11 -070041 capturer_id_(DesktopCapturerId::kUnknown) {
42 RTC_DCHECK(stride_ >= 0);
43 RTC_DCHECK(rect.width() >= 0);
44 RTC_DCHECK(rect.height() >= 0);
45}
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000046
Zijie Hecd66a772017-07-21 14:13:46 -070047DesktopFrame::~DesktopFrame() = default;
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000048
qiangchen6f79d842016-09-21 16:44:55 -070049void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, int src_stride,
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000050 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070051 RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect));
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000052
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000053 uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left());
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000054 for (int y = 0; y < dest_rect.height(); ++y) {
55 memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width());
56 src_buffer += src_stride;
57 dest += stride();
58 }
59}
60
61void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame,
62 const DesktopVector& src_pos,
63 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070064 RTC_CHECK(DesktopRect::MakeSize(src_frame.size()).ContainsRect(
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000065 DesktopRect::MakeOriginSize(src_pos, dest_rect.size())));
66
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000067 CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos),
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000068 src_frame.stride(), dest_rect);
69}
70
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000071uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const {
72 return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x();
73}
74
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000075BasicDesktopFrame::BasicDesktopFrame(DesktopSize size)
Zijie He09f16c62017-07-31 20:26:11 -070076 : BasicDesktopFrame(DesktopRect::MakeSize(size)) {}
77
78BasicDesktopFrame::BasicDesktopFrame(DesktopRect rect)
79 : DesktopFrame(rect, kBytesPerPixel * rect.width(),
80 new uint8_t[kBytesPerPixel * rect.width() * rect.height()],
81 nullptr) {}
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000082
83BasicDesktopFrame::~BasicDesktopFrame() {
84 delete[] data_;
85}
86
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000087DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) {
88 DesktopFrame* result = new BasicDesktopFrame(frame.size());
89 for (int y = 0; y < frame.size().height(); ++y) {
90 memcpy(result->data() + y * result->stride(),
91 frame.data() + y * frame.stride(),
92 frame.size().width() * kBytesPerPixel);
93 }
94 result->set_dpi(frame.dpi());
95 result->set_capture_time_ms(frame.capture_time_ms());
zijiehe40326742017-04-27 18:39:01 -070096 result->set_capturer_id(frame.capturer_id());
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000097 *result->mutable_updated_region() = frame.updated_region();
98 return result;
99}
100
sergeyucc9669c2016-02-09 15:13:26 -0800101// static
kwiberg2bb3afa2016-03-16 15:58:08 -0700102std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
sergeyucc9669c2016-02-09 15:13:26 -0800103 DesktopSize size,
104 SharedMemoryFactory* shared_memory_factory) {
Zijie He09f16c62017-07-31 20:26:11 -0700105 return Create(DesktopRect::MakeSize(size), shared_memory_factory);
106}
107
108// static
109std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
110 DesktopRect rect,
111 SharedMemoryFactory* shared_memory_factory) {
112 RTC_DCHECK(shared_memory_factory);
113
114 size_t buffer_size = rect.height() * rect.width() * kBytesPerPixel;
zijiehe2970c2a2016-05-20 22:08:00 -0700115 std::unique_ptr<SharedMemory> shared_memory =
116 shared_memory_factory->CreateSharedMemory(buffer_size);
sergeyucc9669c2016-02-09 15:13:26 -0800117 if (!shared_memory)
118 return nullptr;
119
Zijie He09f16c62017-07-31 20:26:11 -0700120 return rtc::MakeUnique<SharedMemoryDesktopFrame>(
121 rect, rect.width() * kBytesPerPixel, std::move(shared_memory));
sergeyucc9669c2016-02-09 15:13:26 -0800122}
123
124SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size,
125 int stride,
126 SharedMemory* shared_memory)
Zijie He09f16c62017-07-31 20:26:11 -0700127 : SharedMemoryDesktopFrame(DesktopRect::MakeSize(size),
128 stride,
129 shared_memory) {}
130
131SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(
132 DesktopRect rect,
133 int stride,
134 std::unique_ptr<SharedMemory> shared_memory)
135 : SharedMemoryDesktopFrame(rect,
136 stride,
137 shared_memory.release()) {}
138
139SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(
140 DesktopRect rect,
141 int stride,
142 SharedMemory* shared_memory)
143 : DesktopFrame(rect,
sergeyucc9669c2016-02-09 15:13:26 -0800144 stride,
145 reinterpret_cast<uint8_t*>(shared_memory->data()),
146 shared_memory) {}
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +0000147
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +0000148SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() {
149 delete shared_memory_;
150}
151
152} // namespace webrtc