| Index: content/browser/media/capture/desktop_capture_device_aura.cc
|
| diff --git a/content/browser/media/capture/desktop_capture_device_aura.cc b/content/browser/media/capture/desktop_capture_device_aura.cc
|
| index 2c7d196531b121795f84848105a6603edba4bf54..86bc271dab6f22b2242bae6fff42474d9f20bf06 100644
|
| --- a/content/browser/media/capture/desktop_capture_device_aura.cc
|
| +++ b/content/browser/media/capture/desktop_capture_device_aura.cc
|
| @@ -5,11 +5,13 @@
|
| #include "content/browser/media/capture/desktop_capture_device_aura.h"
|
|
|
| #include "base/logging.h"
|
| +#include "base/metrics/histogram.h"
|
| #include "base/timer/timer.h"
|
| #include "cc/output/copy_output_request.h"
|
| #include "cc/output/copy_output_result.h"
|
| #include "content/browser/compositor/image_transport_factory.h"
|
| #include "content/browser/media/capture/content_video_capture_device_core.h"
|
| +#include "content/browser/media/capture/desktop_capture_device_uma_types.h"
|
| #include "content/common/gpu/client/gl_helper.h"
|
| #include "content/public/browser/browser_thread.h"
|
| #include "media/base/video_util.h"
|
| @@ -129,6 +131,14 @@ class DesktopVideoCaptureMachine
|
| const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb,
|
| scoped_ptr<cc::CopyOutputResult> result);
|
|
|
| + // A helper which does the real work for DidCopyOutput. Returns true if
|
| + // succeeded.
|
| + bool ProcessCopyOutputResponse(
|
| + scoped_refptr<media::VideoFrame> video_frame,
|
| + base::TimeTicks start_time,
|
| + const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb,
|
| + scoped_ptr<cc::CopyOutputResult> result);
|
| +
|
| // Helper function to update cursor state.
|
| // |region_in_frame| defines the desktop bound in the captured frame.
|
| // Returns the current cursor position in captured frame.
|
| @@ -292,8 +302,37 @@ void DesktopVideoCaptureMachine::DidCopyOutput(
|
| base::TimeTicks start_time,
|
| const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb,
|
| scoped_ptr<cc::CopyOutputResult> result) {
|
| + static bool first_call = true;
|
| +
|
| + bool succeeded = ProcessCopyOutputResponse(
|
| + video_frame, start_time, capture_frame_cb, result.Pass());
|
| +
|
| + base::TimeDelta capture_time = base::TimeTicks::Now() - start_time;
|
| + UMA_HISTOGRAM_TIMES(
|
| + window_id_.type == DesktopMediaID::TYPE_SCREEN ? kUmaScreenCaptureTime
|
| + : kUmaWindowCaptureTime,
|
| + capture_time);
|
| +
|
| + if (first_call) {
|
| + first_call = false;
|
| + if (window_id_.type == DesktopMediaID::TYPE_SCREEN) {
|
| + IncrementDesktopCaptureCounter(succeeded ? FIRST_SCREEN_CAPTURE_SUCCEEDED
|
| + : FIRST_SCREEN_CAPTURE_FAILED);
|
| + } else {
|
| + IncrementDesktopCaptureCounter(succeeded
|
| + ? FIRST_WINDOW_CAPTURE_SUCCEEDED
|
| + : FIRST_WINDOW_CAPTURE_SUCCEEDED);
|
| + }
|
| + }
|
| +}
|
| +
|
| +bool DesktopVideoCaptureMachine::ProcessCopyOutputResponse(
|
| + scoped_refptr<media::VideoFrame> video_frame,
|
| + base::TimeTicks start_time,
|
| + const ThreadSafeCaptureOracle::CaptureFrameCallback& capture_frame_cb,
|
| + scoped_ptr<cc::CopyOutputResult> result) {
|
| if (result->IsEmpty() || result->size().IsEmpty() || !desktop_layer_)
|
| - return;
|
| + return false;
|
|
|
| // Compute the dest size we want after the letterboxing resize. Make the
|
| // coordinates and sizes even because we letterbox in YUV space
|
| @@ -309,19 +348,19 @@ void DesktopVideoCaptureMachine::DidCopyOutput(
|
| region_in_frame.width() & ~1,
|
| region_in_frame.height() & ~1);
|
| if (region_in_frame.IsEmpty())
|
| - return;
|
| + return false;
|
|
|
| ImageTransportFactory* factory = ImageTransportFactory::GetInstance();
|
| GLHelper* gl_helper = factory->GetGLHelper();
|
| if (!gl_helper)
|
| - return;
|
| + return false;
|
|
|
| cc::TextureMailbox texture_mailbox;
|
| scoped_ptr<cc::SingleReleaseCallback> release_callback;
|
| result->TakeTexture(&texture_mailbox, &release_callback);
|
| DCHECK(texture_mailbox.IsTexture());
|
| if (!texture_mailbox.IsTexture())
|
| - return;
|
| + return false;
|
|
|
| gfx::Rect result_rect(result->size());
|
| if (!yuv_readback_pipeline_ ||
|
| @@ -350,6 +389,7 @@ void DesktopVideoCaptureMachine::DidCopyOutput(
|
| scaled_cursor_bitmap_,
|
| cursor_position_in_frame,
|
| base::Passed(&release_callback)));
|
| + return true;
|
| }
|
|
|
| gfx::Point DesktopVideoCaptureMachine::UpdateCursorState(
|
| @@ -432,6 +472,9 @@ DesktopCaptureDeviceAura::~DesktopCaptureDeviceAura() {
|
| // static
|
| media::VideoCaptureDevice* DesktopCaptureDeviceAura::Create(
|
| const DesktopMediaID& source) {
|
| + IncrementDesktopCaptureCounter(source.type == DesktopMediaID::TYPE_SCREEN
|
| + ? SCREEN_CAPTURER_CREATED
|
| + : WINDOW_CATPTURER_CREATED);
|
| return new DesktopCaptureDeviceAura(source);
|
| }
|
|
|
|
|