OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "remoting/host/video_frame_capturer.h" | 5 #include "remoting/capturer/video_frame_capturer.h" |
6 | 6 |
7 #include <ApplicationServices/ApplicationServices.h> | 7 #include <ApplicationServices/ApplicationServices.h> |
8 #include <Cocoa/Cocoa.h> | 8 #include <Cocoa/Cocoa.h> |
9 #include <dlfcn.h> | 9 #include <dlfcn.h> |
10 #include <IOKit/pwr_mgt/IOPMLib.h> | 10 #include <IOKit/pwr_mgt/IOPMLib.h> |
11 #include <OpenGL/CGLMacro.h> | 11 #include <OpenGL/CGLMacro.h> |
12 #include <OpenGL/OpenGL.h> | 12 #include <OpenGL/OpenGL.h> |
13 #include <set> | 13 #include <set> |
14 #include <stddef.h> | 14 #include <stddef.h> |
15 | 15 |
16 #include "base/logging.h" | 16 #include "base/logging.h" |
17 #include "base/file_path.h" | 17 #include "base/file_path.h" |
18 #include "base/mac/mac_util.h" | 18 #include "base/mac/mac_util.h" |
19 #include "base/mac/scoped_cftyperef.h" | 19 #include "base/mac/scoped_cftyperef.h" |
20 #include "base/memory/scoped_ptr.h" | 20 #include "base/memory/scoped_ptr.h" |
21 #include "base/scoped_native_library.h" | 21 #include "base/scoped_native_library.h" |
22 #include "base/synchronization/waitable_event.h" | 22 #include "base/synchronization/waitable_event.h" |
23 #include "base/time.h" | 23 #include "base/time.h" |
24 #include "remoting/base/capture_data.h" | 24 #include "remoting/capturer/capture_data.h" |
25 #include "remoting/base/util.h" | 25 #include "remoting/capturer/mac/scoped_pixel_buffer_object.h" |
26 #include "remoting/host/mac/scoped_pixel_buffer_object.h" | 26 #include "remoting/capturer/mouse_cursor_shape.h" |
27 #include "remoting/host/video_frame.h" | 27 #include "remoting/capturer/video_frame.h" |
28 #include "remoting/host/video_frame_capturer_helper.h" | 28 #include "remoting/capturer/video_frame_capturer_helper.h" |
29 #include "remoting/host/video_frame_queue.h" | 29 #include "remoting/capturer/video_frame_queue.h" |
30 #include "remoting/proto/control.pb.h" | 30 #include "remoting/proto/control.pb.h" |
31 | 31 |
32 namespace remoting { | 32 namespace remoting { |
33 | 33 |
34 namespace { | 34 namespace { |
35 | 35 |
36 // Definitions used to dynamic-link to deprecated OS 10.6 functions. | 36 // Definitions used to dynamic-link to deprecated OS 10.6 functions. |
37 const char* kApplicationServicesLibraryName = | 37 const char* kApplicationServicesLibraryName = |
38 "/System/Library/Frameworks/ApplicationServices.framework/" | 38 "/System/Library/Frameworks/ApplicationServices.framework/" |
39 "ApplicationServices"; | 39 "ApplicationServices"; |
40 typedef void* (*CGDisplayBaseAddressFunc)(CGDirectDisplayID); | 40 typedef void* (*CGDisplayBaseAddressFunc)(CGDirectDisplayID); |
41 typedef size_t (*CGDisplayBytesPerRowFunc)(CGDirectDisplayID); | 41 typedef size_t (*CGDisplayBytesPerRowFunc)(CGDirectDisplayID); |
42 typedef size_t (*CGDisplayBitsPerPixelFunc)(CGDirectDisplayID); | 42 typedef size_t (*CGDisplayBitsPerPixelFunc)(CGDirectDisplayID); |
43 const char* kOpenGlLibraryName = | 43 const char* kOpenGlLibraryName = |
44 "/System/Library/Frameworks/OpenGL.framework/OpenGL"; | 44 "/System/Library/Frameworks/OpenGL.framework/OpenGL"; |
45 typedef CGLError (*CGLSetFullScreenFunc)(CGLContextObj); | 45 typedef CGLError (*CGLSetFullScreenFunc)(CGLContextObj); |
46 | 46 |
47 // skia/ext/skia_utils_mac.h only defines CGRectToSkRect(). | 47 // skia/ext/skia_utils_mac.h only defines CGRectToSkRect(). |
48 SkIRect CGRectToSkIRect(const CGRect& rect) { | 48 SkIRect CGRectToSkIRect(const CGRect& rect) { |
49 SkIRect sk_rect = { | 49 SkIRect sk_rect = { |
50 SkScalarRound(rect.origin.x), | 50 SkScalarRound(rect.origin.x), |
51 SkScalarRound(rect.origin.y), | 51 SkScalarRound(rect.origin.y), |
52 SkScalarRound(rect.origin.x + rect.size.width), | 52 SkScalarRound(rect.origin.x + rect.size.width), |
53 SkScalarRound(rect.origin.y + rect.size.height) | 53 SkScalarRound(rect.origin.y + rect.size.height) |
54 }; | 54 }; |
55 return sk_rect; | 55 return sk_rect; |
56 } | 56 } |
57 | 57 |
58 void CopyRect(const uint8* src_plane, | |
alexeypa (please no reviews)
2012/12/12 19:53:10
nit: Add a comment explaining what this function d
alexeypa (please no reviews)
2012/12/12 19:53:10
Did you forget to delete CopyRect from base/util.h
Sergey Ulanov
2012/12/13 02:57:23
Done.
Sergey Ulanov
2012/12/13 02:57:23
Done.
| |
59 int src_plane_stride, | |
60 uint8* dest_plane, | |
61 int dest_plane_stride, | |
62 int bytes_per_pixel, | |
63 const SkIRect& rect) { | |
64 // Get the address of the starting point. | |
65 const int src_y_offset = src_plane_stride * rect.top(); | |
66 const int dest_y_offset = dest_plane_stride * rect.top(); | |
67 const int x_offset = bytes_per_pixel * rect.left(); | |
68 src_plane += src_y_offset + x_offset; | |
69 dest_plane += dest_y_offset + x_offset; | |
70 | |
71 // Copy pixels in the rectangle line by line. | |
72 const int bytes_per_line = bytes_per_pixel * rect.width(); | |
73 const int height = rect.height(); | |
74 for (int i = 0 ; i < height; ++i) { | |
75 memcpy(dest_plane, src_plane, bytes_per_line); | |
76 src_plane += src_plane_stride; | |
77 dest_plane += dest_plane_stride; | |
78 } | |
79 } | |
80 | |
58 // The amount of time allowed for displays to reconfigure. | 81 // The amount of time allowed for displays to reconfigure. |
59 const int64 kDisplayConfigurationEventTimeoutInSeconds = 10; | 82 const int64 kDisplayConfigurationEventTimeoutInSeconds = 10; |
60 | 83 |
61 // A class representing a full-frame pixel buffer. | 84 // A class representing a full-frame pixel buffer. |
62 class VideoFrameMac : public VideoFrame { | 85 class VideoFrameMac : public VideoFrame { |
63 public: | 86 public: |
64 explicit VideoFrameMac(const SkISize& size); | 87 explicit VideoFrameMac(const SkISize& size); |
65 virtual ~VideoFrameMac(); | 88 virtual ~VideoFrameMac(); |
66 | 89 |
67 const SkIPoint& dpi() const { return dpi_; } | 90 const SkIPoint& dpi() const { return dpi_; } |
(...skipping 354 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
422 } | 445 } |
423 | 446 |
424 VLOG(3) << "Sending cursor: " << size.width << "x" << size.height; | 447 VLOG(3) << "Sending cursor: " << size.width << "x" << size.height; |
425 | 448 |
426 CGDataProviderRef provider = CGImageGetDataProvider(image); | 449 CGDataProviderRef provider = CGImageGetDataProvider(image); |
427 base::mac::ScopedCFTypeRef<CFDataRef> image_data_ref( | 450 base::mac::ScopedCFTypeRef<CFDataRef> image_data_ref( |
428 CGDataProviderCopyData(provider)); | 451 CGDataProviderCopyData(provider)); |
429 if (image_data_ref.get() == NULL) { | 452 if (image_data_ref.get() == NULL) { |
430 return; | 453 return; |
431 } | 454 } |
432 const uint8* cursor_src_data = CFDataGetBytePtr(image_data_ref); | 455 const char* cursor_src_data = |
456 reinterpret_cast<char*>(CFDataGetBytePtr(image_data_ref)); | |
433 int data_size = CFDataGetLength(image_data_ref); | 457 int data_size = CFDataGetLength(image_data_ref); |
434 | 458 |
435 // Create a CursorShapeInfo proto that describes the cursor and pass it to | 459 // Create a MouseCursorShape that describes the cursor and pass it to |
436 // the client. | 460 // the client. |
437 scoped_ptr<protocol::CursorShapeInfo> cursor_proto( | 461 scoped_ptr<MouseCursorShape> cursor; |
438 new protocol::CursorShapeInfo()); | 462 cursor->size.set(size.width, size.height); |
439 cursor_proto->mutable_data()->resize(data_size); | 463 cursor->hotspot.set(hotspot.x, hotspot.y); |
440 uint8* cursor_tgt_data = const_cast<uint8*>(reinterpret_cast<const uint8*>( | 464 cursor->data.assign(cursor_src_data, cursor_src_data + data_size); |
441 cursor_proto->mutable_data()->data())); | |
442 | 465 |
443 memcpy(cursor_tgt_data, cursor_src_data, data_size); | 466 delegate_->OnCursorShapeChanged(cursor.Pass()); |
444 | |
445 cursor_proto->set_width(size.width); | |
446 cursor_proto->set_height(size.height); | |
447 cursor_proto->set_hotspot_x(hotspot.x); | |
448 cursor_proto->set_hotspot_y(hotspot.y); | |
449 delegate_->OnCursorShapeChanged(cursor_proto.Pass()); | |
450 | 467 |
451 // Record the last cursor image that we sent. | 468 // Record the last cursor image that we sent. |
452 current_cursor_.reset(CGImageCreateCopy(image)); | 469 current_cursor_.reset(CGImageCreateCopy(image)); |
453 } | 470 } |
454 | 471 |
455 void VideoFrameCapturerMac::GlBlitFast(const VideoFrame& buffer, | 472 void VideoFrameCapturerMac::GlBlitFast(const VideoFrame& buffer, |
456 const SkRegion& region) { | 473 const SkRegion& region) { |
457 const int buffer_height = buffer.dimensions().height(); | 474 const int buffer_height = buffer.dimensions().height(); |
458 const int buffer_width = buffer.dimensions().width(); | 475 const int buffer_width = buffer.dimensions().width(); |
459 | 476 |
(...skipping 388 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
848 } | 865 } |
849 | 866 |
850 // static | 867 // static |
851 scoped_ptr<VideoFrameCapturer> VideoFrameCapturer::CreateWithFactory( | 868 scoped_ptr<VideoFrameCapturer> VideoFrameCapturer::CreateWithFactory( |
852 SharedBufferFactory* shared_buffer_factory) { | 869 SharedBufferFactory* shared_buffer_factory) { |
853 NOTIMPLEMENTED(); | 870 NOTIMPLEMENTED(); |
854 return scoped_ptr<VideoFrameCapturer>(); | 871 return scoped_ptr<VideoFrameCapturer>(); |
855 } | 872 } |
856 | 873 |
857 } // namespace remoting | 874 } // namespace remoting |
OLD | NEW |