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

Unified Diff: content/renderer/media/video_capture_impl.cc

Issue 16320005: Define EncodedVideoSource and RtcCapturedEncodingVideoCapturer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rename encoded_video_source_messages to encoded_video_capture_messages. Add buffer_size in OnOpened… Created 7 years, 6 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/renderer/media/video_capture_impl.cc
diff --git a/content/renderer/media/video_capture_impl.cc b/content/renderer/media/video_capture_impl.cc
index c6b7bf27cd5a4f8bfe7599368b14f54211c8952f..374b56b235dcef0d4f40380385f1293b0b40dd7d 100644
--- a/content/renderer/media/video_capture_impl.cc
+++ b/content/renderer/media/video_capture_impl.cc
@@ -5,8 +5,10 @@
#include "content/renderer/media/video_capture_impl.h"
#include "base/bind.h"
+#include "base/callback_helpers.h"
#include "base/stl_util.h"
#include "content/child/child_process.h"
+#include "content/common/media/encoded_video_capture_messages.h"
#include "content/common/media/video_capture_messages.h"
#include "media/base/limits.h"
@@ -58,7 +60,8 @@ VideoCaptureImpl::VideoCaptureImpl(
video_type_(media::VideoCaptureCapability::kI420),
device_info_available_(false),
suspended_(false),
- state_(VIDEO_CAPTURE_STATE_STOPPED) {
+ state_(VIDEO_CAPTURE_STATE_STOPPED),
+ bitstream_buffer_size_(0) {
DCHECK(filter);
memset(&current_params_, 0, sizeof(current_params_));
memset(&device_info_, 0, sizeof(device_info_));
@@ -101,6 +104,84 @@ void VideoCaptureImpl::StopCapture(media::VideoCapture::EventHandler* handler) {
base::Unretained(this), handler));
}
+void VideoCaptureImpl::RequestCapabilities(
+ const media::EncodedVideoSource::RequestCapabilitiesCallback& callback) {
+ DCHECK(callback_.is_null());
+ callback_ = callback;
+
+ // Invoke callback immediately if capabilities are already available.
+ if (!capabilities_.empty())
+ base::ResetAndReturn(&callback_).Run(capabilities_);
+}
+
+void VideoCaptureImpl::StartFetchCapabilities() {
+ Send(new EncodedVideoCaptureHostMsg_GetCapabilities(device_id_));
+}
+
+void VideoCaptureImpl::OpenBitstream(
+ media::EncodedVideoSource::Client* client,
+ const media::VideoEncodingParameters& params) {
+ DCHECK(!client_);
+ client_ = client;
+ Send(new EncodedVideoCaptureHostMsg_OpenBitstream(device_id_, params));
+}
+
+void VideoCaptureImpl::CloseBitstream() {
+ Send(new EncodedVideoCaptureHostMsg_CloseBitstream(device_id_));
+ client_ = NULL;
+}
+
+void VideoCaptureImpl::ReturnBitstreamBuffer(
+ scoped_refptr<const media::EncodedBitstreamBuffer> buffer) {
+ Send(new EncodedVideoCaptureHostMsg_BitstreamBufferConsumed(
+ device_id_, buffer->buffer_id()));
+}
+
+void VideoCaptureImpl::TrySetBitstreamConfig(
+ const media::RuntimeVideoEncodingParameters& params) {
+ Send(new EncodedVideoCaptureHostMsg_TryConfigureBitstream(
+ device_id_, params));
+}
+
+void VideoCaptureImpl::OnEncodingCapabilitiesAvailable(
+ const media::VideoEncodingCapabilities& capabilities) {
+ capabilities_ = capabilities;
sheu 2013/06/12 22:35:05 This is why we do that little trampoline thing thr
hshi1 2013/06/13 00:25:31 I've changed this so that we always update capabil
+ if (!callback_.is_null())
+ base::ResetAndReturn(&callback_).Run(capabilities_);
+}
+
+void VideoCaptureImpl::OnEncodedBitstreamOpened(
+ const media::VideoEncodingParameters& params,
+ const std::vector<base::SharedMemoryHandle>& buffers,
+ int buffer_size) {
+ capture_message_loop_proxy_->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureImpl::DoNotifyBitstreamOpenedOnCaptureThread,
+ base::Unretained(this), params, buffers, buffer_size));
+}
+
+void VideoCaptureImpl::OnEncodedBitstreamClosed() {
+ capture_message_loop_proxy_->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureImpl::DoNotifyBitstreamClosedOnCaptureThread,
+ base::Unretained(this)));
+}
+
+void VideoCaptureImpl::OnEncodingConfigChanged(
+ const media::RuntimeVideoEncodingParameters& params) {
+ capture_message_loop_proxy_->PostTask(FROM_HERE,
+ base::Bind(
+ &VideoCaptureImpl::DoNotifyBitstreamConfigChangedOnCaptureThread,
+ base::Unretained(this), params));
+}
+
+void VideoCaptureImpl::OnEncodedBufferReady(
+ int buffer_id,
+ int size,
+ const media::BufferEncodingMetadata& metadata) {
+ capture_message_loop_proxy_->PostTask(FROM_HERE,
+ base::Bind(&VideoCaptureImpl::DoNotifyBitstreamBufferReadyOnCaptureThread,
+ base::Unretained(this), buffer_id, size, metadata));
+}
+
void VideoCaptureImpl::FeedBuffer(scoped_refptr<VideoFrameBuffer> buffer) {
capture_message_loop_proxy_->PostTask(FROM_HERE,
base::Bind(&VideoCaptureImpl::DoFeedBufferOnCaptureThread,
@@ -306,6 +387,7 @@ void VideoCaptureImpl::DoStateChangedOnCaptureThread(VideoCaptureState state) {
switch (state) {
case VIDEO_CAPTURE_STATE_STARTED:
+ StartFetchCapabilities();
break;
case VIDEO_CAPTURE_STATE_STOPPED:
state_ = VIDEO_CAPTURE_STATE_STOPPED;
@@ -380,6 +462,45 @@ void VideoCaptureImpl::DoSuspendCaptureOnCaptureThread(bool suspend) {
suspended_ = suspend;
}
+void VideoCaptureImpl::DoNotifyBitstreamOpenedOnCaptureThread(
+ const media::VideoEncodingParameters& params,
+ const std::vector<base::SharedMemoryHandle>& buffers,
+ int buffer_size) {
+ DCHECK(bitstream_buffers_.empty());
+ bitstream_buffer_size_ = buffer_size;
+ for (size_t i = 0; i < buffers.size(); ++i) {
+ base::SharedMemory* shm = new base::SharedMemory(buffers[i], true);
+ DCHECK(shm->Map(buffer_size));
+ bitstream_buffers_.push_back(shm);
+ }
+ client_->OnOpened(params);
+}
+
+void VideoCaptureImpl::DoNotifyBitstreamClosedOnCaptureThread() {
+ for (size_t i = 0; i < bitstream_buffers_.size(); ++i)
+ bitstream_buffers_[i]->Close();
+ bitstream_buffers_.clear();
sheu 2013/06/12 22:35:05 I think we leak base::SharedMemory objects at this
hshi1 2013/06/13 00:25:31 Done.
+ client_->OnClosed();
+}
+
+void VideoCaptureImpl::DoNotifyBitstreamConfigChangedOnCaptureThread(
+ const media::RuntimeVideoEncodingParameters& params) {
+ client_->OnConfigChanged(params);
+}
+
+void VideoCaptureImpl::DoNotifyBitstreamBufferReadyOnCaptureThread(
+ int buffer_id,
+ int size,
+ const media::BufferEncodingMetadata& metadata) {
+ if (buffer_id >= 0 && buffer_id < (int)bitstream_buffers_.size()) {
+ base::SharedMemory* shm = bitstream_buffers_[buffer_id];
+ scoped_refptr<media::EncodedBitstreamBuffer> buffer =
+ new media::EncodedBitstreamBuffer(
+ buffer_id, (uint8*)shm->memory(), size, metadata);
sheu 2013/06/12 22:35:05 What are the lifetime semantics of the shared memo
hshi1 2013/06/13 00:25:31 The EBB object is passed linearly from one point t
sheu 2013/06/13 05:36:51 I'm confident that you've got the lifetime nailed
+ client_->OnBufferReady(buffer);
+ }
+}
+
void VideoCaptureImpl::StopDevice() {
DCHECK(capture_message_loop_proxy_->BelongsToCurrentThread());

Powered by Google App Engine
This is Rietveld 408576698