185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org/* 285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 385a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * 485a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * Use of this source code is governed by a BSD-style license 585a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * that can be found in the LICENSE file in the root of the source 685a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * tree. An additional intellectual property rights grant can be found 785a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * in the file PATENTS. All contributing project authors may 885a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org * be found in the AUTHORS file in the root of the source tree. 985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org */ 1085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 1185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_frame.h" 1285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 138b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org#include <assert.h> 142873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org#include <string.h> 152873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org 1685a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgnamespace webrtc { 1785a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 1885a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgDesktopFrame::DesktopFrame(DesktopSize size, 1985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org int stride, 2085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org uint8_t* data, 2185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org SharedMemory* shared_memory) 2285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org : size_(size), 2385a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org stride_(stride), 2485a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org data_(data), 2585a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org shared_memory_(shared_memory), 2685a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org capture_time_ms_(0) { 2785a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} 2885a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 2985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgDesktopFrame::~DesktopFrame() {} 3085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 318b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.orgvoid DesktopFrame::CopyPixelsFrom(uint8_t* src_buffer, int src_stride, 328b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org const DesktopRect& dest_rect) { 338b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org assert(DesktopRect::MakeSize(size()).ContainsRect(dest_rect)); 348b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org 358b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org uint8_t* dest = data() + stride() * dest_rect.top() + 368b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org DesktopFrame::kBytesPerPixel * dest_rect.left(); 378b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org for (int y = 0; y < dest_rect.height(); ++y) { 388b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org memcpy(dest, src_buffer, DesktopFrame::kBytesPerPixel * dest_rect.width()); 398b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org src_buffer += src_stride; 408b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org dest += stride(); 418b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org } 428b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org} 438b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org 448b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.orgvoid DesktopFrame::CopyPixelsFrom(const DesktopFrame& src_frame, 458b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org const DesktopVector& src_pos, 468b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org const DesktopRect& dest_rect) { 478b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org assert(DesktopRect::MakeSize(src_frame.size()).ContainsRect( 488b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org DesktopRect::MakeOriginSize(src_pos, dest_rect.size()))); 498b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org 508b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org CopyPixelsFrom(src_frame.data() + src_frame.stride() * src_pos.y() + 518b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org DesktopFrame::kBytesPerPixel * src_pos.x(), 528b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org src_frame.stride(), dest_rect); 538b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org} 548b0791cb44f6a88ad175800485f67ba7e979209esergeyu@chromium.org 5585a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgBasicDesktopFrame::BasicDesktopFrame(DesktopSize size) 5685a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org : DesktopFrame(size, kBytesPerPixel * size.width(), 5785a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org new uint8_t[kBytesPerPixel * size.width() * size.height()], 5885a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org NULL) { 5985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} 6085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 6185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgBasicDesktopFrame::~BasicDesktopFrame() { 6285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org delete[] data_; 6385a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} 6485a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 652873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.orgDesktopFrame* BasicDesktopFrame::CopyOf(const DesktopFrame& frame) { 662873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org DesktopFrame* result = new BasicDesktopFrame(frame.size()); 672873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org for (int y = 0; y < frame.size().height(); ++y) { 682873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org memcpy(result->data() + y * result->stride(), 692873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org frame.data() + y * frame.stride(), 702873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org frame.size().width() * kBytesPerPixel); 712873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org } 722873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org result->set_dpi(frame.dpi()); 732873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org result->set_capture_time_ms(frame.capture_time_ms()); 742873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org *result->mutable_updated_region() = frame.updated_region(); 752873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org return result; 762873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org} 772873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org 782873c4c23513c84d6c822562c07c5e31fc3aa7bbsergeyu@chromium.org 7985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgSharedMemoryDesktopFrame::SharedMemoryDesktopFrame( 8085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org DesktopSize size, 8185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org int stride, 8285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org SharedMemory* shared_memory) 8385a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org : DesktopFrame(size, stride, 8485a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org reinterpret_cast<uint8_t*>(shared_memory->data()), 8585a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org shared_memory) { 8685a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} 8785a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 8885a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.orgSharedMemoryDesktopFrame::~SharedMemoryDesktopFrame() { 8985a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org delete shared_memory_; 9085a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} 9185a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org 9285a1dab7adc4a795cf62ccf08d6727569db9e935sergeyu@chromium.org} // namespace webrtc 93