115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org/* 215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * Copyright (c) 2013 The WebRTC project authors. All Rights Reserved. 315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * 415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * Use of this source code is governed by a BSD-style license 515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * that can be found in the LICENSE file in the root of the source 615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * tree. An additional intellectual property rights grant can be found 715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * in the file PATENTS. All contributing project authors may 815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org * be found in the AUTHORS file in the root of the source tree. 915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org */ 1015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 1115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org#include "webrtc/modules/desktop_capture/desktop_frame_win.h" 1215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 1398f53510b222f71fdd8b799b2f33737ceeb28c61Henrik Kjellander#include "webrtc/system_wrappers/include/logging.h" 146a5cc9d8998ec979ea3be1b3378b7b47d6c765e9sergeyu@chromium.org 1515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgnamespace webrtc { 1615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 1715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin::DesktopFrameWin(DesktopSize size, 1815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org int stride, 1915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org uint8_t* data, 2015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org SharedMemory* shared_memory, 2115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org HBITMAP bitmap) 2215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org : DesktopFrame(size, stride, data, shared_memory), 2315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bitmap_(bitmap), 2415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org owned_shared_memory_(shared_memory_) { 2515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org} 2615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 2715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin::~DesktopFrameWin() { 2815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org DeleteObject(bitmap_); 2915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org} 3015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 3115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org// static 3215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.orgDesktopFrameWin* DesktopFrameWin::Create(DesktopSize size, 3315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org SharedMemory* shared_memory, 3415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org HDC hdc) { 3515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org int bytes_per_row = size.width() * kBytesPerPixel; 3615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 3715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org // Describe a device independent bitmap (DIB) that is the size of the desktop. 38a771bf8ee84f293c166d3e377d852e9705c12725dcheng BITMAPINFO bmi = {}; 3915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biHeight = -size.height(); 4015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biWidth = size.width(); 4115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biPlanes = 1; 4215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biBitCount = DesktopFrameWin::kBytesPerPixel * 8; 4315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biSize = sizeof(bmi.bmiHeader); 4415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org bmi.bmiHeader.biSizeImage = bytes_per_row * size.height(); 4515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 4615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org HANDLE section_handle = NULL; 4715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org if (shared_memory) 4815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org section_handle = shared_memory->handle(); 4915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org void* data = NULL; 5015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org HBITMAP bitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, &data, 5115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org section_handle, 0); 5215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org if (!bitmap) { 536a5cc9d8998ec979ea3be1b3378b7b47d6c765e9sergeyu@chromium.org LOG(LS_WARNING) << "Failed to allocate new window frame " << GetLastError(); 5415e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org delete shared_memory; 5515e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org return NULL; 5615e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org } 5715e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 5815e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org return new DesktopFrameWin(size, bytes_per_row, 5915e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org reinterpret_cast<uint8_t*>(data), 6015e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org shared_memory, bitmap); 6115e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org} 6215e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org 6315e32ccd30992840f6a48c3e52cc979452eb5f0dsergeyu@chromium.org} // namespace webrtc 64