blob: 12a49cb1ff941950a9d4727dcb43e5969bcf1149 [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"
zijiehe2970c2a2016-05-20 22:08:00 -070019
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000020namespace webrtc {
21
22DesktopFrame::DesktopFrame(DesktopSize size,
23 int stride,
24 uint8_t* data,
25 SharedMemory* shared_memory)
Zijie Hecd66a772017-07-21 14:13:46 -070026 : DesktopFrame(DesktopRect::MakeSize(size),
27 stride,
28 data,
29 shared_memory) {}
30
31DesktopFrame::DesktopFrame(DesktopRect rect,
32 int stride,
33 uint8_t* data,
34 SharedMemory* shared_memory)
zijiehe2970c2a2016-05-20 22:08:00 -070035 : data_(data),
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000036 shared_memory_(shared_memory),
Zijie Hecd66a772017-07-21 14:13:46 -070037 rect_(rect),
zijiehe2970c2a2016-05-20 22:08:00 -070038 stride_(stride),
zijiehe88ac8272017-03-22 11:38:46 -070039 capture_time_ms_(0),
40 capturer_id_(DesktopCapturerId::kUnknown) {}
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000041
Zijie Hecd66a772017-07-21 14:13:46 -070042DesktopFrame::~DesktopFrame() = default;
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000043
qiangchen6f79d842016-09-21 16:44:55 -070044void DesktopFrame::CopyPixelsFrom(const uint8_t* src_buffer, int src_stride,
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000045 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070046 RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect));
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000047
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000048 uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left());
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000049 for (int y = 0; y < dest_rect.height(); ++y) {
50 memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width());
51 src_buffer += src_stride;
52 dest += stride();
53 }
54}
55
56void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame,
57 const DesktopVector& src_pos,
58 const DesktopRect& dest_rect) {
zijiehe2970c2a2016-05-20 22:08:00 -070059 RTC_CHECK(DesktopRect::MakeSize(src_frame.size()).ContainsRect(
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000060 DesktopRect::MakeOriginSize(src_pos, dest_rect.size())));
61
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000062 CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos),
sergeyu@chromium.org5d858192013-11-19 02:15:47 +000063 src_frame.stride(), dest_rect);
64}
65
jiayl@webrtc.org0e710702014-11-11 18:15:55 +000066uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const {
67 return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x();
68}
69
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +000070BasicDesktopFrame::BasicDesktopFrame(DesktopSize size)
71 : DesktopFrame(size, kBytesPerPixel * size.width(),
72 new uint8_t[kBytesPerPixel * size.width() * size.height()],
73 NULL) {
74}
75
76BasicDesktopFrame::~BasicDesktopFrame() {
77 delete[] data_;
78}
79
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000080DesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) {
81 DesktopFrame* result = new BasicDesktopFrame(frame.size());
82 for (int y = 0; y < frame.size().height(); ++y) {
83 memcpy(result->data() + y * result->stride(),
84 frame.data() + y * frame.stride(),
85 frame.size().width() * kBytesPerPixel);
86 }
87 result->set_dpi(frame.dpi());
88 result->set_capture_time_ms(frame.capture_time_ms());
zijiehe40326742017-04-27 18:39:01 -070089 result->set_capturer_id(frame.capturer_id());
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +000090 *result->mutable_updated_region() = frame.updated_region();
91 return result;
92}
93
sergeyucc9669c2016-02-09 15:13:26 -080094// static
kwiberg2bb3afa2016-03-16 15:58:08 -070095std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
sergeyucc9669c2016-02-09 15:13:26 -080096 DesktopSize size,
97 SharedMemoryFactory* shared_memory_factory) {
zijiehe2970c2a2016-05-20 22:08:00 -070098 size_t buffer_size = size.height() * size.width() * kBytesPerPixel;
99 std::unique_ptr<SharedMemory> shared_memory =
100 shared_memory_factory->CreateSharedMemory(buffer_size);
sergeyucc9669c2016-02-09 15:13:26 -0800101 if (!shared_memory)
102 return nullptr;
103
zijiehe2970c2a2016-05-20 22:08:00 -0700104 return Create(size, std::move(shared_memory));
105}
106
107// static
108std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create(
109 DesktopSize size,
110 std::unique_ptr<SharedMemory> shared_memory) {
111 RTC_DCHECK(shared_memory);
112 int stride = size.width() * kBytesPerPixel;
kwiberg2bb3afa2016-03-16 15:58:08 -0700113 return std::unique_ptr<DesktopFrame>(new SharedMemoryDesktopFrame(
zijiehe2970c2a2016-05-20 22:08:00 -0700114 size, stride, shared_memory.release()));
sergeyucc9669c2016-02-09 15:13:26 -0800115}
116
117SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size,
118 int stride,
119 SharedMemory* shared_memory)
120 : DesktopFrame(size,
121 stride,
122 reinterpret_cast<uint8_t*>(shared_memory->data()),
123 shared_memory) {}
sergeyu@chromium.org2df89c02013-10-17 19:47:18 +0000124
sergeyu@chromium.org15e32cc2013-04-29 20:10:57 +0000125SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() {
126 delete shared_memory_;
127}
128
129} // namespace webrtc