Index: content/renderer/pepper/pepper_media_stream_video_track_host.cc |
diff --git a/content/renderer/pepper/pepper_media_stream_video_track_host.cc b/content/renderer/pepper/pepper_media_stream_video_track_host.cc |
index edcb5dbf9161f404cb0e84de16e303f3a031ee24..c645bd8f74893275ae824a457fdbe75aa87890d4 100644 |
--- a/content/renderer/pepper/pepper_media_stream_video_track_host.cc |
+++ b/content/renderer/pepper/pepper_media_stream_video_track_host.cc |
@@ -11,6 +11,7 @@ |
#include "base/macros.h" |
#include "base/rand_util.h" |
#include "base/strings/utf_string_conversions.h" |
+#include "content/renderer/media/media_stream_video_source.h" |
#include "content/renderer/media/media_stream_video_track.h" |
#include "media/base/bind_to_current_loop.h" |
#include "media/base/video_util.h" |
@@ -234,7 +235,6 @@ PepperMediaStreamVideoTrackHost::PepperMediaStreamVideoTrackHost( |
plugin_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN), |
frame_data_size_(0), |
type_(kRead), |
- output_started_(false), |
weak_factory_(this) { |
DCHECK(!track_.isNull()); |
} |
@@ -249,7 +249,6 @@ PepperMediaStreamVideoTrackHost::PepperMediaStreamVideoTrackHost( |
plugin_frame_format_(PP_VIDEOFRAME_FORMAT_UNKNOWN), |
frame_data_size_(0), |
type_(kWrite), |
- output_started_(false), |
weak_factory_(this) { |
InitBlinkTrack(); |
DCHECK(!track_.isNull()); |
@@ -322,7 +321,7 @@ int32_t PepperMediaStreamVideoTrackHost::OnHostMsgEnqueueBuffer( |
int32_t PepperMediaStreamVideoTrackHost::SendFrameToTrack(int32_t index) { |
DCHECK_EQ(type_, kWrite); |
- if (output_started_) { |
+ if (frame_deliverer_) { |
// Sends the frame to blink video track. |
ppapi::MediaStreamBuffer::Video* pp_frame = |
&(buffer_manager()->GetBufferPointer(index)->video); |
@@ -410,36 +409,48 @@ void PepperMediaStreamVideoTrackHost::OnVideoFrame( |
SendEnqueueBufferMessageToPlugin(index); |
} |
-void PepperMediaStreamVideoTrackHost::GetCurrentSupportedFormats( |
- int max_requested_width, int max_requested_height, |
- double max_requested_frame_rate, |
- const VideoCaptureDeviceFormatsCB& callback) { |
- if (type_ != kWrite) { |
- DVLOG(1) << "GetCurrentSupportedFormats is only supported in output mode."; |
- callback.Run(media::VideoCaptureFormats()); |
- return; |
+class PepperMediaStreamVideoTrackHost::VideoSource final |
+ : public MediaStreamVideoSource { |
+ public: |
+ explicit VideoSource(base::WeakPtr<PepperMediaStreamVideoTrackHost> host) |
+ : host_(std::move(host)) {} |
+ |
+ ~VideoSource() final { StopSourceImpl(); } |
+ |
+ void GetCurrentSupportedFormats( |
+ int max_requested_width, int max_requested_height, |
+ double max_requested_frame_rate, |
+ const VideoCaptureDeviceFormatsCB& callback) final { |
+ media::VideoCaptureFormats formats; |
+ if (host_) { |
+ formats.push_back(media::VideoCaptureFormat( |
+ host_->plugin_frame_size_, |
+ kDefaultOutputFrameRate, |
+ ToPixelFormat(host_->plugin_frame_format_))); |
+ } |
+ callback.Run(formats); |
} |
- media::VideoCaptureFormats formats; |
- formats.push_back( |
- media::VideoCaptureFormat(plugin_frame_size_, |
- kDefaultOutputFrameRate, |
- ToPixelFormat(plugin_frame_format_))); |
- callback.Run(formats); |
-} |
+ void StartSourceImpl( |
+ const media::VideoCaptureFormat& format, |
+ const blink::WebMediaConstraints& constraints, |
+ const VideoCaptureDeliverFrameCB& frame_callback) final { |
+ if (host_) { |
+ host_->frame_deliverer_ = |
+ new FrameDeliverer(io_task_runner(), frame_callback); |
+ } |
+ } |
-void PepperMediaStreamVideoTrackHost::StartSourceImpl( |
- const media::VideoCaptureFormat& format, |
- const blink::WebMediaConstraints& constraints, |
- const VideoCaptureDeliverFrameCB& frame_callback) { |
- output_started_ = true; |
- frame_deliverer_ = new FrameDeliverer(io_task_runner(), frame_callback); |
-} |
+ void StopSourceImpl() final { |
+ if (host_) |
+ host_->frame_deliverer_ = nullptr; |
+ } |
-void PepperMediaStreamVideoTrackHost::StopSourceImpl() { |
- output_started_ = false; |
- frame_deliverer_ = NULL; |
-} |
+ private: |
+ const base::WeakPtr<PepperMediaStreamVideoTrackHost> host_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(VideoSource); |
+}; |
void PepperMediaStreamVideoTrackHost::DidConnectPendingHostToResource() { |
if (!MediaStreamVideoSink::connected_track().isNull()) |
@@ -511,17 +522,21 @@ void PepperMediaStreamVideoTrackHost::InitBlinkTrack() { |
blink::WebMediaStreamSource::TypeVideo, |
base::UTF8ToUTF16(kPepperVideoSourceName), |
false /* remote */); |
- webkit_source.setExtraData(this); |
+ MediaStreamVideoSource* const source = |
+ new VideoSource(weak_factory_.GetWeakPtr()); |
+ webkit_source.setExtraData(source); // Takes ownership of |source|. |
const bool enabled = true; |
blink::WebMediaConstraints constraints; |
constraints.initialize(); |
track_ = MediaStreamVideoTrack::CreateVideoTrack( |
- this, constraints, |
+ source, constraints, |
base::Bind( |
&PepperMediaStreamVideoTrackHost::OnTrackStarted, |
base::Unretained(this)), |
enabled); |
+ // Note: The call to CreateVideoTrack() returned a track that holds a |
+ // ref-counted reference to |webkit_source| (and, implicitly, |source|). |
} |
void PepperMediaStreamVideoTrackHost::OnTrackStarted( |