| 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;
|
| }
|
|
|
|
|