| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. | 2 * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| 11 #include "webrtc/modules/desktop_capture/desktop_frame.h" | 11 #include "webrtc/modules/desktop_capture/desktop_frame.h" |
| 12 | 12 |
| 13 #include <assert.h> | 13 #include <utility> |
| 14 |
| 14 #include <string.h> | 15 #include <string.h> |
| 15 | 16 |
| 17 #include "webrtc/base/checks.h" |
| 18 |
| 16 namespace webrtc { | 19 namespace webrtc { |
| 17 | 20 |
| 18 DesktopFrame::DesktopFrame(DesktopSize size, | 21 DesktopFrame::DesktopFrame(DesktopSize size, |
| 19 int stride, | 22 int stride, |
| 20 uint8_t* data, | 23 uint8_t* data, |
| 21 SharedMemory* shared_memory) | 24 SharedMemory* shared_memory) |
| 22 : size_(size), | 25 : data_(data), |
| 26 shared_memory_(shared_memory), |
| 27 size_(size), |
| 23 stride_(stride), | 28 stride_(stride), |
| 24 data_(data), | |
| 25 shared_memory_(shared_memory), | |
| 26 capture_time_ms_(0) { | 29 capture_time_ms_(0) { |
| 27 } | 30 } |
| 28 | 31 |
| 29 DesktopFrame::~DesktopFrame() {} | 32 DesktopFrame::~DesktopFrame() {} |
| 30 | 33 |
| 31 void DesktopFrame::CopyPixelsFrom(uint8_t* src_buffer, int src_stride, | 34 void DesktopFrame::CopyPixelsFrom(uint8_t* src_buffer, int src_stride, |
| 32 const DesktopRect& dest_rect) { | 35 const DesktopRect& dest_rect) { |
| 33 assert(DesktopRect::MakeSize(size()).ContainsRect(dest_rect)); | 36 RTC_CHECK(DesktopRect::MakeSize(size()).ContainsRect(dest_rect)); |
| 34 | 37 |
| 35 uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left()); | 38 uint8_t* dest = GetFrameDataAtPos(dest_rect.top_left()); |
| 36 for (int y = 0; y < dest_rect.height(); ++y) { | 39 for (int y = 0; y < dest_rect.height(); ++y) { |
| 37 memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width()); | 40 memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width()); |
| 38 src_buffer += src_stride; | 41 src_buffer += src_stride; |
| 39 dest += stride(); | 42 dest += stride(); |
| 40 } | 43 } |
| 41 } | 44 } |
| 42 | 45 |
| 43 void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame, | 46 void DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame, |
| 44 const DesktopVector& src_pos, | 47 const DesktopVector& src_pos, |
| 45 const DesktopRect& dest_rect) { | 48 const DesktopRect& dest_rect) { |
| 46 assert(DesktopRect::MakeSize(src_frame.size()).ContainsRect( | 49 RTC_CHECK(DesktopRect::MakeSize(src_frame.size()).ContainsRect( |
| 47 DesktopRect::MakeOriginSize(src_pos, dest_rect.size()))); | 50 DesktopRect::MakeOriginSize(src_pos, dest_rect.size()))); |
| 48 | 51 |
| 49 CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos), | 52 CopyPixelsFrom(src_frame.GetFrameDataAtPos(src_pos), |
| 50 src_frame.stride(), dest_rect); | 53 src_frame.stride(), dest_rect); |
| 51 } | 54 } |
| 52 | 55 |
| 53 uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const { | 56 uint8_t* DesktopFrame::GetFrameDataAtPos(const DesktopVector& pos) const { |
| 54 return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x(); | 57 return data() + stride() * pos.y() + DesktopFrame::kBytesPerPixel * pos.x(); |
| 55 } | 58 } |
| 56 | 59 |
| (...skipping 17 matching lines...) Expand all Loading... |
| 74 result->set_dpi(frame.dpi()); | 77 result->set_dpi(frame.dpi()); |
| 75 result->set_capture_time_ms(frame.capture_time_ms()); | 78 result->set_capture_time_ms(frame.capture_time_ms()); |
| 76 *result->mutable_updated_region() = frame.updated_region(); | 79 *result->mutable_updated_region() = frame.updated_region(); |
| 77 return result; | 80 return result; |
| 78 } | 81 } |
| 79 | 82 |
| 80 // static | 83 // static |
| 81 std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create( | 84 std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create( |
| 82 DesktopSize size, | 85 DesktopSize size, |
| 83 SharedMemoryFactory* shared_memory_factory) { | 86 SharedMemoryFactory* shared_memory_factory) { |
| 84 size_t buffer_size = | 87 size_t buffer_size = size.height() * size.width() * kBytesPerPixel; |
| 85 size.width() * size.height() * DesktopFrame::kBytesPerPixel; | 88 std::unique_ptr<SharedMemory> shared_memory = |
| 86 std::unique_ptr<SharedMemory> shared_memory; | 89 shared_memory_factory->CreateSharedMemory(buffer_size); |
| 87 shared_memory = shared_memory_factory->CreateSharedMemory(buffer_size); | |
| 88 if (!shared_memory) | 90 if (!shared_memory) |
| 89 return nullptr; | 91 return nullptr; |
| 90 | 92 |
| 93 return Create(size, std::move(shared_memory)); |
| 94 } |
| 95 |
| 96 // static |
| 97 std::unique_ptr<DesktopFrame> SharedMemoryDesktopFrame::Create( |
| 98 DesktopSize size, |
| 99 std::unique_ptr<SharedMemory> shared_memory) { |
| 100 RTC_DCHECK(shared_memory); |
| 101 int stride = size.width() * kBytesPerPixel; |
| 91 return std::unique_ptr<DesktopFrame>(new SharedMemoryDesktopFrame( | 102 return std::unique_ptr<DesktopFrame>(new SharedMemoryDesktopFrame( |
| 92 size, size.width() * DesktopFrame::kBytesPerPixel, | 103 size, stride, shared_memory.release())); |
| 93 std::move(shared_memory))); | |
| 94 } | 104 } |
| 95 | 105 |
| 96 SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size, | 106 SharedMemoryDesktopFrame::SharedMemoryDesktopFrame(DesktopSize size, |
| 97 int stride, | 107 int stride, |
| 98 SharedMemory* shared_memory) | 108 SharedMemory* shared_memory) |
| 99 : DesktopFrame(size, | 109 : DesktopFrame(size, |
| 100 stride, | 110 stride, |
| 101 reinterpret_cast<uint8_t*>(shared_memory->data()), | 111 reinterpret_cast<uint8_t*>(shared_memory->data()), |
| 102 shared_memory) {} | 112 shared_memory) {} |
| 103 | 113 |
| 104 SharedMemoryDesktopFrame::SharedMemoryDesktopFrame( | |
| 105 DesktopSize size, | |
| 106 int stride, | |
| 107 std::unique_ptr<SharedMemory> shared_memory) | |
| 108 : DesktopFrame(size, | |
| 109 stride, | |
| 110 reinterpret_cast<uint8_t*>(shared_memory->data()), | |
| 111 shared_memory.release()) {} | |
| 112 | |
| 113 SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() { | 114 SharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() { |
| 114 delete shared_memory_; | 115 delete shared_memory_; |
| 115 } | 116 } |
| 116 | 117 |
| 117 } // namespace webrtc | 118 } // namespace webrtc |
| OLD | NEW |