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

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

Issue 16320005: Define EncodedVideoSource and RtcCapturedEncodingVideoCapturer. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . 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/captured_encoded_video_source_impl.cc
diff --git a/content/renderer/media/captured_encoded_video_source_impl.cc b/content/renderer/media/captured_encoded_video_source_impl.cc
new file mode 100644
index 0000000000000000000000000000000000000000..6cc48d126a715dae6a5f752fdf7199d695716333
--- /dev/null
+++ b/content/renderer/media/captured_encoded_video_source_impl.cc
@@ -0,0 +1,245 @@
+// Copyright (c) 2013 The Chromium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "content/renderer/media/captured_encoded_video_source_impl.h"
+
+#include "base/logging.h"
+#include "base/message_loop_proxy.h"
+#include "content/common/media/encoded_video_source_messages.h"
+#include "ipc/ipc_sender.h"
+
+using logging::LOG_INFO;
+using logging::LOG_WARNING;
+
+namespace content {
+
+CapturedEncodedVideoBitstreamImpl::CapturedEncodedVideoBitstreamImpl(
+ CapturedEncodedVideoSourceImpl* source,
+ media::EncodedVideoBitstream::Client* client)
+ : source_(source), client_(client) {
+}
+
+CapturedEncodedVideoBitstreamImpl::~CapturedEncodedVideoBitstreamImpl() {
+ source_->CloseBitstream(this);
Ami GONE FROM CHROMIUM 2013/06/08 00:18:01 This implies that a bitstream can close before the
hshi1 2013/06/11 19:51:22 N/A (file removed)
+}
+
+void CapturedEncodedVideoBitstreamImpl::TryConfigure(
+ const media::RuntimeVideoEncodingParameters& params) {
+ source_->TrySetBitstreamConfig(this, params);
+}
+
+void CapturedEncodedVideoBitstreamImpl::NotifyStreaming(
+ const media::VideoEncodingParameters& params,
+ const std::map<int, base::SharedMemoryHandle>& buffers) {
+ std::map<int, base::SharedMemoryHandle>::const_iterator it;
+ for (it = buffers.begin(); it != buffers.end(); ++it) {
+ int buffer_id = it->first;
+ buffers_[buffer_id] = new base::SharedMemory(it->second, true);
+ }
+ client_->OnBitstreamStreaming(this, params);
+}
+
+void CapturedEncodedVideoBitstreamImpl::NotifyRemoved() {
+ std::map<int, base::SharedMemory*>::iterator it;
+ for (it = buffers_.begin(); it != buffers_.end(); ++it) {
+ if (it->second) {
+ it->second->Close();
+ delete it->second;
+ }
+ }
+ buffers_.clear();
+ client_->OnBitstreamRemoved(this);
+}
+
+void CapturedEncodedVideoBitstreamImpl::NotifyConfigChanged(
+ const media::RuntimeVideoEncodingParameters& params) {
+ client_->OnBitstreamConfigChanged(this, params);
+}
+
+void CapturedEncodedVideoBitstreamImpl::NotifyBitstreamReady(
+ int buffer_id,
+ size_t size,
+ const media::BufferEncodingMetadata& metadata) {
+ if (buffers_.find(buffer_id) != buffers_.end()) {
+ base::SharedMemory* shm = buffers_[buffer_id];
+ if (shm->Map(size)) {
+ scoped_refptr<media::EncodedBitstreamBuffer> buffer =
+ new media::EncodedBitstreamBuffer(
+ buffer_id, (uint8*)shm->memory(), size, metadata);
+ client_->OnBitstreamReady(this, buffer);
+ shm->Unmap();
+ }
+ }
+}
+
+CapturedEncodedVideoSourceImpl::CapturedEncodedVideoSourceImpl()
+ : stream_index_(0) {
+}
+
+CapturedEncodedVideoSourceImpl::~CapturedEncodedVideoSourceImpl() {
+}
+
+media::VideoEncodingCapability
+ CapturedEncodedVideoSourceImpl::GetCapabilities() {
+ return capability_;
+}
+
+#define DISPATCH_TO0(loop, func, obj) \
+ loop->PostTask(FROM_HERE, base::Bind(&func, obj))
+#define DISPATCH_TO1(loop, func, obj, param) \
+ loop->PostTask(FROM_HERE, base::Bind(&func, obj, param))
+#define DISPATCH_TO2(loop, func, obj, param1, param2) \
+ loop->PostTask(FROM_HERE, base::Bind(&func, obj, param1, param2))
+#define DISPATCH_TO3(loop, func, obj, param1, param2, param3) \
+ loop->PostTask(FROM_HERE, base::Bind(&func, obj, param1, param2, param3))
+
+void CapturedEncodedVideoSourceImpl::OnCapabilityAvailable(
+ const media::VideoEncodingCapability& capability) {
+ set_encoding_capabilities(capability);
+ FOR_EACH_OBSERVER(media::EncodedVideoSource::Observer,
+ capabilities_observers_,
+ OnCapabilitiesAvailable(this));
+}
+
+void CapturedEncodedVideoSourceImpl::AddCapabilitiesObserver(
+ Observer* observer) {
+ capabilities_observers_.AddObserver(observer);
+}
+
+void CapturedEncodedVideoSourceImpl::RemoveCapabilitiesObserver(
+ Observer* observer) {
+ capabilities_observers_.RemoveObserver(observer);
+}
+
+void CapturedEncodedVideoSourceImpl::StartFetchCapabilities() {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_GetCapability";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoSourceImpl::SendToIo,
+ base::Unretained(this),
+ new EncodedVideoSourceHostMsg_GetCapability(device_id()));
+}
+
+scoped_refptr<media::EncodedVideoBitstream>
+ CapturedEncodedVideoSourceImpl::OpenBitstream(
+ media::EncodedVideoBitstream::Client* client,
+ const media::VideoEncodingParameters& params) {
+ scoped_refptr<CapturedEncodedVideoBitstreamImpl> bitstream(
+ new CapturedEncodedVideoBitstreamImpl(this, client));
+ bitstreams_[stream_index_] = bitstream;
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_AddBitstream";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoSourceImpl::SendToIo,
+ base::Unretained(this),
+ new EncodedVideoSourceHostMsg_CreateBitstream(device_id(),
+ stream_index_,
+ params));
+ return bitstreams_[stream_index_++];
+}
+
+void CapturedEncodedVideoSourceImpl::CloseBitstream(
+ scoped_refptr<media::EncodedVideoBitstream> bitstream) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_RemoveBitstream";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoSourceImpl::SendToIo,
+ base::Unretained(this),
+ new EncodedVideoSourceHostMsg_DestroyBitstream(
+ device_id(), FindStreamId(bitstream)));
+}
+
+void CapturedEncodedVideoSourceImpl::ReturnBitstreamBuffer(
+ scoped_refptr<media::EncodedVideoBitstream> bitstream,
+ scoped_refptr<const media::EncodedBitstreamBuffer> buffer) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_BitstreamBufferConsumed";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoSourceImpl::SendToIo,
+ base::Unretained(this),
+ new EncodedVideoSourceHostMsg_BitstreamBufferConsumed(
+ device_id(), FindStreamId(bitstream), buffer->buffer_id()));
+}
+
+void CapturedEncodedVideoSourceImpl::OnBitstreamCreated(
+ int stream_id,
+ const media::VideoEncodingParameters& params,
+ const std::map<int, base::SharedMemoryHandle>& buffers) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_BitstreamAdded";
+ DISPATCH_TO2(app_loop_proxy(),
+ CapturedEncodedVideoBitstreamImpl::NotifyStreaming,
+ FindBitstream(stream_id),
+ params,
+ buffers);
+}
+
+void CapturedEncodedVideoSourceImpl::OnBitstreamDestroyed(int stream_id) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_BitstreamRemoved";
+ DISPATCH_TO0(app_loop_proxy(),
+ CapturedEncodedVideoBitstreamImpl::NotifyRemoved,
+ FindBitstream(stream_id));
+}
+
+void CapturedEncodedVideoSourceImpl::OnBitstreamConfigChanged(
+ int stream_id, const media::RuntimeVideoEncodingParameters& params) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_ConfigChanged";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoBitstreamImpl::NotifyConfigChanged,
+ FindBitstream(stream_id),
+ params);
+}
+
+void CapturedEncodedVideoSourceImpl::OnBitstreamReady(
+ int stream_id,
+ int buffer_id,
+ size_t size,
+ const media::BufferEncodingMetadata& metadata) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_BitstreamReady";
+ DISPATCH_TO3(app_loop_proxy(),
+ CapturedEncodedVideoBitstreamImpl::NotifyBitstreamReady,
+ FindBitstream(stream_id),
+ buffer_id,
+ size,
+ metadata);
+}
+
+void CapturedEncodedVideoSourceImpl::TrySetBitstreamConfig(
+ scoped_refptr<CapturedEncodedVideoBitstreamImpl> bitstream,
+ const media::RuntimeVideoEncodingParameters& params) {
+ DVLOG(LOG_INFO) << ": EncodedVideoSourceHostMsg_TrySetBitstreamConfig";
+ DISPATCH_TO1(app_loop_proxy(),
+ CapturedEncodedVideoSourceImpl::SendToIo,
+ base::Unretained(this),
+ new EncodedVideoSourceHostMsg_TryConfigureBitstream(
+ device_id(), FindStreamId(bitstream), params));
+}
+
+scoped_refptr<CapturedEncodedVideoBitstreamImpl>
+ CapturedEncodedVideoSourceImpl::FindBitstream(int stream_id) {
+ std::map<int, scoped_refptr<CapturedEncodedVideoBitstreamImpl> >::iterator it;
+ it = bitstreams_.find(stream_id);
+ if (it == bitstreams_.end()) {
+ DVLOG(LOG_WARNING) << ": Unknown video stream id coming to Renderer.";
+ return NULL;
+ }
+ return it->second;
+}
+
+int CapturedEncodedVideoSourceImpl::FindStreamId(
+ scoped_refptr<media::EncodedVideoBitstream> bitstream) {
+ std::map<int, scoped_refptr<CapturedEncodedVideoBitstreamImpl> >::iterator it;
+ for (it = bitstreams_.begin(); it != bitstreams_.end(); it++) {
+ if (it->second == bitstream) {
+ return it->first;
+ }
+ }
+ DVLOG(LOG_WARNING) << ": Unknown bitstream in Renderer.";
+ DCHECK(false); // Should never happen.
+ return -1;
+}
+
+void CapturedEncodedVideoSourceImpl::SendToIo(IPC::Message* message) {
+ io_loop_proxy()->PostTask(FROM_HERE,
+ base::Bind(base::IgnoreResult(&CapturedEncodedVideoSourceImpl::Send),
+ base::Unretained(this), message));
+}
+
+} // namespace content
+

Powered by Google App Engine
This is Rietveld 408576698