| Index: content/browser/renderer_host/media/video_capture_controller.cc
 | 
| diff --git a/content/browser/renderer_host/media/video_capture_controller.cc b/content/browser/renderer_host/media/video_capture_controller.cc
 | 
| index 7f4a1f602a8d286b81f92996d84dd03f517b3dfe..3fbb2dcf37a64d0cfbab7f0a41404d6aa6ca69db 100644
 | 
| --- a/content/browser/renderer_host/media/video_capture_controller.cc
 | 
| +++ b/content/browser/renderer_host/media/video_capture_controller.cc
 | 
| @@ -175,7 +175,6 @@ class VideoCaptureController::VideoCaptureDeviceClient
 | 
|                                              const gfx::Size& size) override;
 | 
|    void OnIncomingCapturedVideoFrame(
 | 
|        const scoped_refptr<Buffer>& buffer,
 | 
| -      const VideoCaptureFormat& buffer_format,
 | 
|        const scoped_refptr<media::VideoFrame>& frame,
 | 
|        const base::TimeTicks& timestamp) override;
 | 
|    void OnError(const std::string& reason) override;
 | 
| @@ -547,9 +546,9 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedData(
 | 
|            base::TimeDelta(),
 | 
|            base::Closure());
 | 
|    DCHECK(frame.get());
 | 
| +  frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE,
 | 
| +                               frame_format.frame_rate);
 | 
|  
 | 
| -  VideoCaptureFormat format(
 | 
| -      dimensions, frame_format.frame_rate, media::PIXEL_FORMAT_I420);
 | 
|    BrowserThread::PostTask(
 | 
|        BrowserThread::IO,
 | 
|        FROM_HERE,
 | 
| @@ -557,7 +556,6 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedData(
 | 
|            &VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread,
 | 
|            controller_,
 | 
|            buffer,
 | 
| -          format,
 | 
|            frame,
 | 
|            timestamp));
 | 
|  }
 | 
| @@ -565,7 +563,6 @@ void VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedData(
 | 
|  void
 | 
|  VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedVideoFrame(
 | 
|      const scoped_refptr<Buffer>& buffer,
 | 
| -    const VideoCaptureFormat& buffer_format,
 | 
|      const scoped_refptr<media::VideoFrame>& frame,
 | 
|      const base::TimeTicks& timestamp) {
 | 
|    BrowserThread::PostTask(
 | 
| @@ -575,7 +572,6 @@ VideoCaptureController::VideoCaptureDeviceClient::OnIncomingCapturedVideoFrame(
 | 
|            &VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread,
 | 
|            controller_,
 | 
|            buffer,
 | 
| -          buffer_format,
 | 
|            frame,
 | 
|            timestamp));
 | 
|  }
 | 
| @@ -606,7 +602,6 @@ VideoCaptureController::~VideoCaptureController() {
 | 
|  
 | 
|  void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
 | 
|      const scoped_refptr<media::VideoCaptureDevice::Client::Buffer>& buffer,
 | 
| -    const media::VideoCaptureFormat& buffer_format,
 | 
|      const scoped_refptr<media::VideoFrame>& frame,
 | 
|      const base::TimeTicks& timestamp) {
 | 
|    DCHECK_CURRENTLY_ON(BrowserThread::IO);
 | 
| @@ -614,17 +609,33 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
 | 
|  
 | 
|    int count = 0;
 | 
|    if (state_ == VIDEO_CAPTURE_STATE_STARTED) {
 | 
| +    if (!frame->metadata()->HasKey(media::VideoFrameMetadata::FRAME_RATE)) {
 | 
| +      frame->metadata()->SetDouble(media::VideoFrameMetadata::FRAME_RATE,
 | 
| +                                   video_capture_format_.frame_rate);
 | 
| +    }
 | 
| +    scoped_ptr<base::DictionaryValue> metadata(new base::DictionaryValue());
 | 
| +    frame->metadata()->MergeInternalValuesInto(metadata.get());
 | 
| +
 | 
|      for (const auto& client : controller_clients_) {
 | 
|        if (client->session_closed || client->paused)
 | 
|          continue;
 | 
|  
 | 
| +      scoped_ptr<base::DictionaryValue> copy_of_metadata;
 | 
| +      if (client == controller_clients_.back())
 | 
| +        copy_of_metadata = metadata.Pass();
 | 
| +      else
 | 
| +        copy_of_metadata.reset(metadata->DeepCopy());
 | 
| +
 | 
|        if (frame->format() == media::VideoFrame::NATIVE_TEXTURE) {
 | 
| +        DCHECK(frame->coded_size() == frame->visible_rect().size())
 | 
| +            << "Textures are always supposed to be tightly packed.";
 | 
|          client->event_handler->OnMailboxBufferReady(client->controller_id,
 | 
|                                                      buffer->id(),
 | 
|                                                      *frame->mailbox_holder(),
 | 
| -                                                    buffer_format,
 | 
| -                                                    timestamp);
 | 
| -      } else {
 | 
| +                                                    frame->coded_size(),
 | 
| +                                                    timestamp,
 | 
| +                                                    copy_of_metadata.Pass());
 | 
| +      } else if (frame->format() == media::VideoFrame::I420) {
 | 
|          bool is_new_buffer = client->known_buffers.insert(buffer->id()).second;
 | 
|          if (is_new_buffer) {
 | 
|            // On the first use of a buffer on a client, share the memory handle.
 | 
| @@ -636,8 +647,12 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
 | 
|          }
 | 
|  
 | 
|          client->event_handler->OnBufferReady(
 | 
| -            client->controller_id, buffer->id(), buffer_format,
 | 
| -            frame->visible_rect(), timestamp);
 | 
| +            client->controller_id, buffer->id(), frame->coded_size(),
 | 
| +            frame->visible_rect(), timestamp, copy_of_metadata.Pass());
 | 
| +      } else {
 | 
| +        // VideoFrame format not supported.
 | 
| +        NOTREACHED();
 | 
| +        break;
 | 
|        }
 | 
|  
 | 
|        bool inserted =
 | 
| @@ -650,14 +665,17 @@ void VideoCaptureController::DoIncomingCapturedVideoFrameOnIOThread(
 | 
|  
 | 
|    if (!has_received_frames_) {
 | 
|      UMA_HISTOGRAM_COUNTS("Media.VideoCapture.Width",
 | 
| -                         buffer_format.frame_size.width());
 | 
| +                         frame->visible_rect().width());
 | 
|      UMA_HISTOGRAM_COUNTS("Media.VideoCapture.Height",
 | 
| -                         buffer_format.frame_size.height());
 | 
| +                         frame->visible_rect().height());
 | 
|      UMA_HISTOGRAM_ASPECT_RATIO("Media.VideoCapture.AspectRatio",
 | 
| -                               buffer_format.frame_size.width(),
 | 
| -                               buffer_format.frame_size.height());
 | 
| -    UMA_HISTOGRAM_COUNTS("Media.VideoCapture.FrameRate",
 | 
| -                         buffer_format.frame_rate);
 | 
| +                               frame->visible_rect().width(),
 | 
| +                               frame->visible_rect().height());
 | 
| +    double frame_rate;
 | 
| +    if (!frame->metadata()->GetDouble(media::VideoFrameMetadata::FRAME_RATE,
 | 
| +                                      &frame_rate))
 | 
| +      frame_rate = video_capture_format_.frame_rate;
 | 
| +    UMA_HISTOGRAM_COUNTS("Media.VideoCapture.FrameRate", frame_rate);
 | 
|      has_received_frames_ = true;
 | 
|    }
 | 
|  
 | 
| 
 |