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

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

Issue 131763002: Adds MediaStreamSource, MediaStreamAudioSource and MediaStreamVideoCaptureDeviceSource (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Rebased Created 6 years, 11 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/media_stream_video_source.cc
diff --git a/content/renderer/media/media_stream_video_source.cc b/content/renderer/media/media_stream_video_source.cc
index a9912cdeca0073441ec573488ccc36c864e687e2..61efae4008fa1b9c27074ba115c8145deffb4266 100644
--- a/content/renderer/media/media_stream_video_source.cc
+++ b/content/renderer/media/media_stream_video_source.cc
@@ -4,7 +4,9 @@
#include "content/renderer/media/media_stream_video_source.h"
+#include "base/logging.h"
#include "content/renderer/media/media_stream_dependency_factory.h"
+#include "content/renderer/media/rtc_media_constraints.h"
#include "media/base/video_frame.h"
#include "third_party/libjingle/source/talk/app/webrtc/remotevideocapturer.h"
#include "third_party/libjingle/source/talk/media/webrtc/webrtcvideoframe.h"
@@ -13,16 +15,50 @@ namespace content {
MediaStreamVideoSource::MediaStreamVideoSource(
MediaStreamDependencyFactory* factory)
- : factory_(factory),
+ : initializing_(false),
+ factory_(factory),
width_(0),
height_(0),
first_frame_timestamp_(media::kNoTimestamp()) {
DCHECK(factory_);
}
+MediaStreamVideoSource::~MediaStreamVideoSource() {
+ if (initializing_) {
+ adapter_->UnregisterObserver(this);
+ }
+}
+
void MediaStreamVideoSource::AddTrack(
const blink::WebMediaStreamTrack& track,
- const blink::WebMediaConstraints& constraints) {
+ const blink::WebMediaConstraints& constraints,
+ const ConstraintsCallback& callback) {
+ if (!adapter_) {
+ // Create the webrtc::MediaStreamVideoSourceInterface adapter.
+ InitAdapter(constraints);
+ DCHECK(adapter_);
+
+ current_constraints_ = constraints;
+ initializing_ = true;
+ // Register to the adapter to get notified when it has been started
+ // successfully.
+ adapter_->RegisterObserver(this);
+ }
+
+ // TODO(perkj): Currently, reconfiguring the source is not supported. For now
+ // we ignore if |constraints| do not match the constraints that was used
+ // when the source was started
+
+ // There might be multiple tracks attaching to the source while it is being
+ // configured.
+ constraints_callbacks_.push_back(callback);
+ TriggerConstraintsCallbackOnStateChange();
+
+ // TODO(perkj): Use the MediaStreamDependencyFactory for now to create the
+ // MediaStreamVideoTrack since creation is currently still depending on
+ // libjingle. The webrtc video track implementation will attach to the
+ // webrtc::VideoSourceInterface returned by GetAdapter() to receive video
+ // frames.
factory_->CreateNativeMediaStreamTrack(track);
}
@@ -31,12 +67,12 @@ void MediaStreamVideoSource::RemoveTrack(
// TODO(ronghuawu): What should be done here? Do we really need RemoveTrack?
}
-void MediaStreamVideoSource::Init() {
- if (!adapter_) {
- const webrtc::MediaConstraintsInterface* constraints = NULL;
- adapter_ = factory_->CreateVideoSource(new webrtc::RemoteVideoCapturer(),
- constraints);
- }
+void MediaStreamVideoSource::InitAdapter(
+ const blink::WebMediaConstraints& constraints) {
+ DCHECK(!adapter_);
+ RTCMediaConstraints webrtc_constraints(constraints);
+ adapter_ = factory_->CreateVideoSource(new webrtc::RemoteVideoCapturer(),
+ &webrtc_constraints);
}
void MediaStreamVideoSource::SetReadyState(
@@ -79,7 +115,29 @@ void MediaStreamVideoSource::DeliverVideoFrame(
input->RenderFrame(&cricket_frame);
}
-MediaStreamVideoSource::~MediaStreamVideoSource() {
+void MediaStreamVideoSource::OnChanged() {
+ DCHECK(CalledOnValidThread());
+ TriggerConstraintsCallbackOnStateChange();
+}
+
+void MediaStreamVideoSource::TriggerConstraintsCallbackOnStateChange() {
+ if (adapter_->state() == webrtc::MediaSourceInterface::kInitializing)
+ return;
+
+ if (initializing_) {
+ adapter_->UnregisterObserver(this);
+ initializing_ = false;
+ }
+
+ std::vector<ConstraintsCallback> callbacks;
+ callbacks.swap(constraints_callbacks_);
+
+ bool success = (adapter_->state() == webrtc::MediaSourceInterface::kLive);
+ for (std::vector<ConstraintsCallback>::iterator it = callbacks.begin();
+ it != callbacks.end(); ++it) {
+ if (!it->is_null())
+ it->Run(this, success);
+ }
}
} // namespace content
« no previous file with comments | « content/renderer/media/media_stream_video_source.h ('k') | content/renderer/media/media_stream_video_source_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698