| 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..a4aa46da412ead0e6ec1d2a47bfdbd25eed1ea2a 100644 | 
| --- a/content/browser/media/capture/desktop_capture_device_aura.cc | 
| +++ b/content/browser/media/capture/desktop_capture_device_aura.cc | 
| @@ -95,8 +95,8 @@ class DesktopVideoCaptureMachine | 
| virtual ~DesktopVideoCaptureMachine(); | 
|  | 
| // VideoCaptureFrameSource overrides. | 
| -  virtual bool Start( | 
| -      const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) OVERRIDE; | 
| +  virtual bool Start(const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy, | 
| +                     const media::VideoCaptureParams& params) OVERRIDE; | 
| virtual void Stop(const base::Closure& callback) OVERRIDE; | 
|  | 
| // Implements aura::WindowObserver. | 
| @@ -152,6 +152,9 @@ class DesktopVideoCaptureMachine | 
| // Makes all the decisions about which frames to copy, and how. | 
| scoped_refptr<ThreadSafeCaptureOracle> oracle_proxy_; | 
|  | 
| +  // The capture parameters for this capture. | 
| +  media::VideoCaptureParams capture_params_; | 
| + | 
| // YUV readback pipeline. | 
| scoped_ptr<content::ReadbackYUVInterface> yuv_readback_pipeline_; | 
|  | 
| @@ -173,7 +176,8 @@ DesktopVideoCaptureMachine::DesktopVideoCaptureMachine( | 
| DesktopVideoCaptureMachine::~DesktopVideoCaptureMachine() {} | 
|  | 
| bool DesktopVideoCaptureMachine::Start( | 
| -    const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy) { | 
| +    const scoped_refptr<ThreadSafeCaptureOracle>& oracle_proxy, | 
| +    const media::VideoCaptureParams& params) { | 
| DCHECK(BrowserThread::CurrentlyOn(BrowserThread::UI)); | 
|  | 
| desktop_window_ = content::DesktopMediaID::GetAuraWindowById(window_id_); | 
| @@ -187,6 +191,7 @@ bool DesktopVideoCaptureMachine::Start( | 
|  | 
| DCHECK(oracle_proxy.get()); | 
| oracle_proxy_ = oracle_proxy; | 
| +  capture_params_ = params; | 
|  | 
| // Update capture size. | 
| UpdateCaptureSize(); | 
| @@ -284,7 +289,12 @@ void CopyOutputFinishedForVideo( | 
| if (!cursor_bitmap.isNull()) | 
| RenderCursorOnVideoFrame(target, cursor_bitmap, cursor_position); | 
| release_callback->Run(0, false); | 
| -  capture_frame_cb.Run(start_time, result); | 
| +  capture_frame_cb.Run(target, start_time, result); | 
| +} | 
| + | 
| +void RunSingleReleaseCallback(scoped_ptr<cc::SingleReleaseCallback> cb, | 
| +                              scoped_ptr<gpu::MailboxHolder> mailbox_holder) { | 
| +  cb->Run(mailbox_holder->sync_point, false); | 
| } | 
|  | 
| void DesktopVideoCaptureMachine::DidCopyOutput( | 
| @@ -295,6 +305,29 @@ void DesktopVideoCaptureMachine::DidCopyOutput( | 
| if (result->IsEmpty() || result->size().IsEmpty() || !desktop_layer_) | 
| return; | 
|  | 
| +  if (capture_params_.requested_format.pixel_format == | 
| +      media::PIXEL_FORMAT_TEXTURE) { | 
| +    DCHECK(!video_frame); | 
| +    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; | 
| +    video_frame = media::VideoFrame::WrapNativeTexture( | 
| +        make_scoped_ptr(new gpu::MailboxHolder(texture_mailbox.mailbox(), | 
| +                                               texture_mailbox.target(), | 
| +                                               texture_mailbox.sync_point())), | 
| +        base::Bind(&RunSingleReleaseCallback, base::Passed(&release_callback)), | 
| +        result->size(), | 
| +        gfx::Rect(result->size()), | 
| +        result->size(), | 
| +        base::TimeDelta(), | 
| +        media::VideoFrame::ReadPixelsCB()); | 
| +    capture_frame_cb.Run(video_frame, start_time, true); | 
| +    return; | 
| +  } | 
| + | 
| // Compute the dest size we want after the letterboxing resize. Make the | 
| // coordinates and sizes even because we letterbox in YUV space | 
| // (see CopyRGBToVideoFrame). They need to be even for the UV samples to | 
| @@ -439,7 +472,11 @@ void DesktopCaptureDeviceAura::AllocateAndStart( | 
| const media::VideoCaptureParams& params, | 
| scoped_ptr<Client> client) { | 
| DVLOG(1) << "Allocating " << params.requested_format.frame_size.ToString(); | 
| -  core_->AllocateAndStart(params, client.Pass()); | 
| +  media::VideoCaptureParams new_params = params; | 
| +  // Desktop capture devices ignore the requested size and return the actual | 
| +  // captured desktop size. | 
| +  new_params.requested_format.frame_size.SetSize(0, 0); | 
| +  core_->AllocateAndStart(new_params, client.Pass()); | 
| } | 
|  | 
| void DesktopCaptureDeviceAura::StopAndDeAllocate() { | 
|  |