Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3274)

Unified Diff: content/browser/renderer_host/media/video_capture_controller.cc

Issue 955253002: Add metadata to media::VideoFrame and plumb it through IPC/MediaStream. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: tommi's nits addressed Created 5 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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;
}

Powered by Google App Engine
This is Rietveld 408576698