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