diff options
author | wuchengli@chromium.org <wuchengli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-01 04:17:32 +0000 |
---|---|---|
committer | wuchengli@chromium.org <wuchengli@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-03-01 04:17:32 +0000 |
commit | b3d080fcfc874742ab6dd8ca8f7ea8acced4da5b (patch) | |
tree | 83b285f36bff466bf5169ad551cc26092ae552bb /content/renderer | |
parent | dcc87fb5d6e2e3758054d8bcf473f3d39daafa87 (diff) | |
download | chromium_src-b3d080fcfc874742ab6dd8ca8f7ea8acced4da5b.zip chromium_src-b3d080fcfc874742ab6dd8ca8f7ea8acced4da5b.tar.gz chromium_src-b3d080fcfc874742ab6dd8ca8f7ea8acced4da5b.tar.bz2 |
Delete old RTCVideoDecoder code path.
Remove leftover codepath from the pre-WebMediaPlayerMS days.
BUG=chromium:177572
TEST=Try apprtc.appspot.com/?debug=loopback on link.
Review URL: https://chromiumcodereview.appspot.com/12320078
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@185460 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'content/renderer')
-rw-r--r-- | content/renderer/media/media_stream_impl.cc | 36 | ||||
-rw-r--r-- | content/renderer/media/media_stream_impl.h | 10 | ||||
-rw-r--r-- | content/renderer/media/media_stream_impl_unittest.cc | 12 | ||||
-rw-r--r-- | content/renderer/media/rtc_video_decoder.cc | 199 | ||||
-rw-r--r-- | content/renderer/media/rtc_video_decoder.h | 98 | ||||
-rw-r--r-- | content/renderer/media/rtc_video_decoder_unittest.cc | 338 | ||||
-rw-r--r-- | content/renderer/media/rtc_video_renderer.h | 3 | ||||
-rw-r--r-- | content/renderer/render_view_impl.cc | 7 |
8 files changed, 5 insertions, 698 deletions
diff --git a/content/renderer/media/media_stream_impl.cc b/content/renderer/media/media_stream_impl.cc index 88206a7..df4b10b 100644 --- a/content/renderer/media/media_stream_impl.cc +++ b/content/renderer/media/media_stream_impl.cc @@ -14,7 +14,6 @@ #include "content/renderer/media/media_stream_dispatcher.h" #include "content/renderer/media/media_stream_extra_data.h" #include "content/renderer/media/media_stream_source_extra_data.h" -#include "content/renderer/media/rtc_video_decoder.h" #include "content/renderer/media/rtc_video_renderer.h" #include "content/renderer/media/video_capture_impl_manager.h" #include "content/renderer/media/webrtc_audio_capturer.h" @@ -245,25 +244,6 @@ MediaStreamImpl::GetVideoFrameProvider( return NULL; } -scoped_refptr<media::VideoDecoder> MediaStreamImpl::GetVideoDecoder( - const GURL& url, - const scoped_refptr<base::MessageLoopProxy>& message_loop) { - DCHECK(CalledOnValidThread()); - WebKit::WebMediaStream descriptor(GetMediaStream(url)); - - if (descriptor.isNull() || !descriptor.extraData()) - return NULL; // This is not a valid stream. - - DVLOG(1) << "MediaStreamImpl::GetVideoDecoder stream:" - << UTF16ToUTF8(descriptor.label()); - - webrtc::MediaStreamInterface* stream = GetNativeMediaStream(descriptor); - if (stream) - return CreateVideoDecoder(stream, message_loop); - NOTREACHED(); - return NULL; -} - scoped_refptr<webkit_media::MediaStreamAudioRenderer> MediaStreamImpl::GetAudioRenderer(const GURL& url) { DCHECK(CalledOnValidThread()); @@ -534,22 +514,6 @@ MediaStreamImpl::CreateVideoFrameProvider( repaint_cb); } -scoped_refptr<media::VideoDecoder> MediaStreamImpl::CreateVideoDecoder( - webrtc::MediaStreamInterface* stream, - const scoped_refptr<base::MessageLoopProxy>& message_loop) { - if (stream->GetVideoTracks().empty()) - return NULL; - - - DVLOG(1) << "MediaStreamImpl::CreateRemoteVideoDecoder label:" - << stream->label(); - - return new RTCVideoDecoder( - message_loop, - base::MessageLoopProxy::current(), - stream->GetVideoTracks()[0].get()); -} - scoped_refptr<WebRtcAudioRenderer> MediaStreamImpl::CreateRemoteAudioRenderer( webrtc::MediaStreamInterface* stream) { if (stream->GetAudioTracks().empty()) diff --git a/content/renderer/media/media_stream_impl.h b/content/renderer/media/media_stream_impl.h index 667b0b1..1845ca0 100644 --- a/content/renderer/media/media_stream_impl.h +++ b/content/renderer/media/media_stream_impl.h @@ -24,10 +24,6 @@ #include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" #include "webkit/media/media_stream_client.h" -namespace base{ -class MessageLoopProxy; -} - namespace webkit_media { class MediaStreamAudioRenderer; } @@ -81,9 +77,6 @@ class CONTENT_EXPORT MediaStreamImpl const GURL& url, const base::Closure& error_cb, const webkit_media::VideoFrameProvider::RepaintCB& repaint_cb) OVERRIDE; - virtual scoped_refptr<media::VideoDecoder> GetVideoDecoder( - const GURL& url, - const scoped_refptr<base::MessageLoopProxy>& message_loop) OVERRIDE; virtual scoped_refptr<webkit_media::MediaStreamAudioRenderer> GetAudioRenderer(const GURL& url) OVERRIDE; @@ -169,9 +162,6 @@ class CONTENT_EXPORT MediaStreamImpl webrtc::MediaStreamInterface* stream, const base::Closure& error_cb, const webkit_media::VideoFrameProvider::RepaintCB& repaint_cb); - scoped_refptr<media::VideoDecoder> CreateVideoDecoder( - webrtc::MediaStreamInterface* stream, - const scoped_refptr<base::MessageLoopProxy>& message_loop); scoped_refptr<WebRtcAudioRenderer> CreateRemoteAudioRenderer( webrtc::MediaStreamInterface* stream); scoped_refptr<WebRtcLocalAudioRenderer> CreateLocalAudioRenderer( diff --git a/content/renderer/media/media_stream_impl_unittest.cc b/content/renderer/media/media_stream_impl_unittest.cc index 5fe8650..3cf0cc4 100644 --- a/content/renderer/media/media_stream_impl_unittest.cc +++ b/content/renderer/media/media_stream_impl_unittest.cc @@ -3,14 +3,12 @@ // found in the LICENSE file. #include "base/memory/scoped_ptr.h" -#include "base/message_loop.h" #include "base/utf_string_conversions.h" #include "content/renderer/media/media_stream_extra_data.h" #include "content/renderer/media/media_stream_impl.h" #include "content/renderer/media/mock_media_stream_dependency_factory.h" #include "content/renderer/media/mock_media_stream_dispatcher.h" #include "content/renderer/media/video_capture_impl_manager.h" -#include "media/base/video_decoder.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebMediaStream.h" #include "third_party/WebKit/Source/Platform/chromium/public/WebMediaStreamSource.h" @@ -159,22 +157,12 @@ class MediaStreamImplTest : public ::testing::Test { TEST_F(MediaStreamImplTest, LocalMediaStream) { // Test a stream with both audio and video. WebKit::WebMediaStream mixed_desc = RequestLocalMediaStream(true, true); - // Create a renderer for the stream. - scoped_refptr<media::VideoDecoder> mixed_decoder( - ms_impl_->GetVideoDecoder(GURL(), base::MessageLoopProxy::current())); - EXPECT_TRUE(mixed_decoder.get() != NULL); // Test a stream with audio only. WebKit::WebMediaStream audio_desc = RequestLocalMediaStream(true, false); - scoped_refptr<media::VideoDecoder> audio_decoder( - ms_impl_->GetVideoDecoder(GURL(), base::MessageLoopProxy::current())); - EXPECT_TRUE(audio_decoder.get() == NULL); // Test a stream with video only. WebKit::WebMediaStream video_desc = RequestLocalMediaStream(false, true); - scoped_refptr<media::VideoDecoder> video_decoder( - ms_impl_->GetVideoDecoder(GURL(), base::MessageLoopProxy::current())); - EXPECT_TRUE(video_decoder.get() != NULL); // Stop generated local streams. ms_impl_->OnLocalMediaStreamStop(mixed_desc.label().utf8()); diff --git a/content/renderer/media/rtc_video_decoder.cc b/content/renderer/media/rtc_video_decoder.cc deleted file mode 100644 index d795daf..0000000 --- a/content/renderer/media/rtc_video_decoder.cc +++ /dev/null @@ -1,199 +0,0 @@ -// Copyright (c) 2012 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/rtc_video_decoder.h" - -#include <algorithm> - -#include "base/bind.h" -#include "base/callback.h" -#include "base/message_loop.h" -#include "media/base/demuxer.h" -#include "media/base/limits.h" -#include "media/base/video_frame.h" -#include "media/base/video_util.h" -#include "third_party/libjingle/source/talk/base/timeutils.h" -#include "third_party/libjingle/source/talk/media/base/videoframe.h" - -using media::CopyUPlane; -using media::CopyVPlane; -using media::CopyYPlane; -using media::DemuxerStream; -using media::kNoTimestamp; -using media::PIPELINE_OK; -using media::PipelineStatusCB; -using media::StatisticsCB; -using media::VideoDecoder; - -namespace content { - -RTCVideoDecoder::RTCVideoDecoder(base::TaskRunner* video_decoder_thread, - base::TaskRunner* main_thread, - webrtc::VideoTrackInterface* video_track) - : video_decoder_thread_(video_decoder_thread), - main_thread_(main_thread), - visible_size_(640, 480), - state_(kUnInitialized), - got_first_frame_(false), - video_track_(video_track) { -} - -void RTCVideoDecoder::Initialize(const scoped_refptr<DemuxerStream>& stream, - const PipelineStatusCB& status_cb, - const StatisticsCB& statistics_cb) { - main_thread_->PostTask( - FROM_HERE, - base::Bind(&RTCVideoDecoder::RegisterToVideoTrack, this)); - if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { - video_decoder_thread_->PostTask( - FROM_HERE, - base::Bind(&RTCVideoDecoder::Initialize, this, - stream, status_cb, statistics_cb)); - return; - } - - state_ = kNormal; - status_cb.Run(PIPELINE_OK); - - // TODO(acolwell): Implement stats. -} - -void RTCVideoDecoder::Read(const ReadCB& read_cb) { - if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { - video_decoder_thread_->PostTask( - FROM_HERE, - base::Bind(&RTCVideoDecoder::Read, this, read_cb)); - return; - } - - base::AutoLock auto_lock(lock_); - CHECK(read_cb_.is_null()); - - if (state_ == kStopped) { - read_cb.Run(kOk, NULL); - return; - } - - read_cb_ = read_cb; -} - -void RTCVideoDecoder::Reset(const base::Closure& closure) { - if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { - video_decoder_thread_->PostTask( - FROM_HERE, - base::Bind(&RTCVideoDecoder::Reset, this, closure)); - return; - } - - CancelPendingRead(); - closure.Run(); -} - -void RTCVideoDecoder::Stop(const base::Closure& closure) { - main_thread_->PostTask( - FROM_HERE, - base::Bind(&RTCVideoDecoder::DeregisterFromVideoTrack, this)); - if (!video_decoder_thread_->RunsTasksOnCurrentThread()) { - video_decoder_thread_->PostTask( - FROM_HERE, base::Bind(&RTCVideoDecoder::Stop, this, closure)); - return; - } - - state_ = kStopped; - CancelPendingRead(); - closure.Run(); -} - -void RTCVideoDecoder::SetSize(int width, int height) { - visible_size_.SetSize(width, height); -} - -// TODO(wjia): this function can be split into two parts so that the |lock_| -// can be removed. -// First creates media::VideoFrame, then post a task onto |message_loop_| -// to deliver that frame. -void RTCVideoDecoder::RenderFrame(const cricket::VideoFrame* frame) { - // Called from libjingle thread. - DCHECK(frame); - - base::TimeDelta timestamp = base::TimeDelta::FromMilliseconds( - frame->GetTimeStamp() / talk_base::kNumNanosecsPerMillisec); - - ReadCB read_cb; - { - base::AutoLock auto_lock(lock_); - if (read_cb_.is_null() || state_ != kNormal) { - // TODO(ronghuawu): revisit TS adjustment when crbug.com/111672 is - // resolved. - if (got_first_frame_) { - start_time_ += timestamp - last_frame_timestamp_; - } - last_frame_timestamp_ = timestamp; - return; - } - std::swap(read_cb, read_cb_); - } - - // Rebase timestamp with zero as starting point. - if (!got_first_frame_) { - start_time_ = timestamp; - got_first_frame_ = true; - } - - // Always allocate a new frame. - // - // TODO(scherkus): migrate this to proper buffer recycling. - scoped_refptr<media::VideoFrame> video_frame = - media::VideoFrame::CreateFrame(media::VideoFrame::YV12, - visible_size_, - gfx::Rect(visible_size_), - visible_size_, - timestamp - start_time_); - last_frame_timestamp_ = timestamp; - - // Aspect ratio unsupported; DCHECK when there are non-square pixels. - DCHECK_EQ(frame->GetPixelWidth(), 1u); - DCHECK_EQ(frame->GetPixelHeight(), 1u); - - int y_rows = frame->GetHeight(); - int uv_rows = frame->GetHeight() / 2; // YV12 format. - CopyYPlane(frame->GetYPlane(), frame->GetYPitch(), y_rows, video_frame); - CopyUPlane(frame->GetUPlane(), frame->GetUPitch(), uv_rows, video_frame); - CopyVPlane(frame->GetVPlane(), frame->GetVPitch(), uv_rows, video_frame); - - read_cb.Run(kOk, video_frame); -} - -void RTCVideoDecoder::CancelPendingRead() { - DCHECK(video_decoder_thread_->RunsTasksOnCurrentThread()); - ReadCB read_cb; - { - base::AutoLock auto_lock(lock_); - std::swap(read_cb, read_cb_); - } - - if (!read_cb.is_null()) { - read_cb.Run(kOk, NULL); - } -} - -void RTCVideoDecoder::RegisterToVideoTrack() { - DCHECK(main_thread_->RunsTasksOnCurrentThread()); - if (video_track_) - video_track_->AddRenderer(this); -} - -void RTCVideoDecoder::DeregisterFromVideoTrack() { - DCHECK(main_thread_->RunsTasksOnCurrentThread()); - if (video_track_) { - video_track_->RemoveRenderer(this); - video_track_ = NULL; - } -} - -RTCVideoDecoder::~RTCVideoDecoder() { - DCHECK_NE(kNormal, state_); -} - -} // namespace content diff --git a/content/renderer/media/rtc_video_decoder.h b/content/renderer/media/rtc_video_decoder.h deleted file mode 100644 index 39cfd81..0000000 --- a/content/renderer/media/rtc_video_decoder.h +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) 2012 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. - -#ifndef CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ -#define CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ - -#include <string> - -#include "base/compiler_specific.h" -#include "base/gtest_prod_util.h" -#include "base/synchronization/lock.h" -#include "base/task_runner.h" -#include "base/time.h" -#include "content/common/content_export.h" -#include "media/base/video_decoder.h" -#include "third_party/libjingle/source/talk/app/webrtc/mediastreaminterface.h" - - -namespace cricket { -class VideoFrame; -} // namespace cricket - -namespace content { - -// RTCVideoDecoder is a media::VideoDecoder designed for rendering -// Video MediaStreamTracks, -// http://dev.w3.org/2011/webrtc/editor/getusermedia.html#mediastreamtrack -// RTCVideoDecoder implements webrtc::VideoRendererInterface in order to render -// video frames provided from a webrtc::VideoTrackInteface. -// RTCVideoDecoder register itself to the Video Track when the decoder is -// initialized and deregisters itself when it is stopped. -// Calls to webrtc::VideoTrackInterface must occur on the main render thread. -class CONTENT_EXPORT RTCVideoDecoder - : public media::VideoDecoder, - NON_EXPORTED_BASE(public webrtc::VideoRendererInterface) { - public: - RTCVideoDecoder(base::TaskRunner* video_decoder_thread, // For video decoder - base::TaskRunner* main_thread, // For accessing VideoTracks. - webrtc::VideoTrackInterface* video_track); - - // media::VideoDecoder implementation. - virtual void Initialize(const scoped_refptr<media::DemuxerStream>& stream, - const media::PipelineStatusCB& status_cb, - const media::StatisticsCB& statistics_cb) OVERRIDE; - virtual void Read(const ReadCB& read_cb) OVERRIDE; - virtual void Reset(const base::Closure& closure) OVERRIDE; - virtual void Stop(const base::Closure& closure) OVERRIDE; - - // webrtc::VideoRendererInterface implementation - virtual void SetSize(int width, int height) OVERRIDE; - virtual void RenderFrame(const cricket::VideoFrame* frame) OVERRIDE; - - protected: - virtual ~RTCVideoDecoder(); - - private: - friend class RTCVideoDecoderTest; - FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, Initialize_Successful); - FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, DoReset); - FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, DoRenderFrame); - FRIEND_TEST_ALL_PREFIXES(RTCVideoDecoderTest, DoSetSize); - - enum DecoderState { - kUnInitialized, - kNormal, - kStopped - }; - - void CancelPendingRead(); - - // Register this RTCVideoDecoder to get VideoFrames from the - // webrtc::VideoTrack in |video_track_|. - // This is done on the |main_thread_|. - void RegisterToVideoTrack(); - void DeregisterFromVideoTrack(); - - scoped_refptr<base::TaskRunner> video_decoder_thread_; - scoped_refptr<base::TaskRunner> main_thread_; - gfx::Size visible_size_; - std::string url_; - DecoderState state_; - ReadCB read_cb_; - bool got_first_frame_; - base::TimeDelta last_frame_timestamp_; - base::TimeDelta start_time_; - // The video track the renderer is connected to. - scoped_refptr<webrtc::VideoTrackInterface> video_track_; - - // Used for accessing |read_cb_| from another thread. - base::Lock lock_; - - DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoder); -}; - -} // namespace content - -#endif // CONTENT_RENDERER_MEDIA_RTC_VIDEO_DECODER_H_ diff --git a/content/renderer/media/rtc_video_decoder_unittest.cc b/content/renderer/media/rtc_video_decoder_unittest.cc deleted file mode 100644 index 042d390..0000000 --- a/content/renderer/media/rtc_video_decoder_unittest.cc +++ /dev/null @@ -1,338 +0,0 @@ -// Copyright (c) 2012 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/rtc_video_decoder.h" - -#include <deque> - -#include "base/bind.h" -#include "base/memory/singleton.h" -#include "base/message_loop.h" -#include "base/string_util.h" -#include "media/base/data_buffer.h" -#include "media/base/limits.h" -#include "media/base/mock_filters.h" -#include "media/base/test_helpers.h" -#include "media/base/video_frame.h" -#include "testing/gtest/include/gtest/gtest.h" -#include "third_party/libjingle/source/talk/media/base/videoframe.h" - -using ::testing::_; -using ::testing::AnyNumber; -using ::testing::DoAll; -using ::testing::Message; -using ::testing::Return; -using ::testing::ReturnNull; -using ::testing::SetArgumentPointee; -using ::testing::StrictMock; -using ::testing::WithArg; -using ::testing::Invoke; -using media::MockStatisticsCB; -using media::MockVideoRenderer; -using media::NewExpectedClosure; -using media::NewExpectedStatusCB; -using media::PipelineStatistics; -using media::PIPELINE_OK; -using media::StatisticsCB; - -namespace content { -namespace { - -class NullVideoFrame : public cricket::VideoFrame { - public: - NullVideoFrame() {} - virtual ~NullVideoFrame() {} - - virtual bool Reset(uint32 fourcc, int w, int h, int dw, int dh, - uint8 *sample, size_t sample_size, - size_t pixel_width, size_t pixel_height, - int64 elapsed_time, int64 time_stamp, int rotation) - OVERRIDE { - return true; - } - - virtual size_t GetWidth() const OVERRIDE { return 0; } - virtual size_t GetHeight() const OVERRIDE { return 0; } - virtual const uint8 *GetYPlane() const OVERRIDE { return NULL; } - virtual const uint8 *GetUPlane() const OVERRIDE { return NULL; } - virtual const uint8 *GetVPlane() const OVERRIDE { return NULL; } - virtual uint8 *GetYPlane() OVERRIDE { return NULL; } - virtual uint8 *GetUPlane() OVERRIDE { return NULL; } - virtual uint8 *GetVPlane() OVERRIDE { return NULL; } - virtual int32 GetYPitch() const OVERRIDE { return 0; } - virtual int32 GetUPitch() const OVERRIDE { return 0; } - virtual int32 GetVPitch() const OVERRIDE { return 0; } - - virtual size_t GetPixelWidth() const OVERRIDE { return 1; } - virtual size_t GetPixelHeight() const OVERRIDE { return 1; } - virtual int64 GetElapsedTime() const OVERRIDE { return 0; } - virtual int64 GetTimeStamp() const OVERRIDE { return 0; } - virtual void SetElapsedTime(int64 elapsed_time) OVERRIDE {} - virtual void SetTimeStamp(int64 time_stamp) OVERRIDE {} - - virtual int GetRotation() const OVERRIDE { return 0; } - - virtual VideoFrame *Copy() const OVERRIDE { return NULL; } - - virtual bool MakeExclusive() OVERRIDE { return true; } - - virtual size_t CopyToBuffer(uint8 *buffer, size_t size) const OVERRIDE { - return 0; - } - - virtual size_t ConvertToRgbBuffer(uint32 to_fourcc, uint8 *buffer, - size_t size, - int stride_rgb) const OVERRIDE { - return 0; - } - - virtual void StretchToPlanes(uint8 *y, uint8 *u, uint8 *v, - int32 pitchY, int32 pitchU, int32 pitchV, - size_t width, size_t height, - bool interpolate, bool crop) const OVERRIDE { - } - - virtual size_t StretchToBuffer(size_t w, size_t h, uint8 *buffer, size_t size, - bool interpolate, bool crop) const OVERRIDE { - return 0; - } - - virtual void StretchToFrame(VideoFrame *target, bool interpolate, - bool crop) const OVERRIDE { - } - - virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate, - bool crop) const OVERRIDE { - return NULL; - } - - protected: - virtual VideoFrame* CreateEmptyFrame(int w, int h, - size_t pixel_width, size_t pixel_height, - int64 elapsed_time, - int64 time_stamp) const OVERRIDE { - return NULL; - } -}; - -class MockVideoTrack : public webrtc::VideoTrackInterface { - public: - static MockVideoTrack* Create() { - return new talk_base::RefCountedObject<MockVideoTrack>(); - } - - virtual std::string kind() const OVERRIDE { - NOTIMPLEMENTED(); - return ""; - } - virtual std::string id() const OVERRIDE { - NOTIMPLEMENTED(); - return ""; - } - virtual bool enabled() const OVERRIDE { - NOTIMPLEMENTED(); - return false; - } - virtual TrackState state() const OVERRIDE { - NOTIMPLEMENTED(); - return kEnded; - } - virtual bool set_enabled(bool enable) OVERRIDE { - NOTIMPLEMENTED(); - return false; - } - virtual bool set_state(TrackState new_state) OVERRIDE { - NOTIMPLEMENTED(); - return false; - } - virtual void RegisterObserver(webrtc::ObserverInterface* observer) OVERRIDE { - NOTIMPLEMENTED(); - } - virtual void UnregisterObserver( - webrtc::ObserverInterface* observer) OVERRIDE { - NOTIMPLEMENTED(); - } - virtual webrtc::VideoSourceInterface* GetSource() const OVERRIDE { - NOTIMPLEMENTED(); - return NULL; - } - MOCK_METHOD1(AddRenderer, void(webrtc::VideoRendererInterface* renderer)); - MOCK_METHOD1(RemoveRenderer, void(webrtc::VideoRendererInterface* renderer)); - - virtual cricket::VideoRenderer* FrameInput() OVERRIDE { - NOTIMPLEMENTED(); - return NULL; - } - - protected: - MockVideoTrack() {} - ~MockVideoTrack() {} -}; - -} // namespace - -class RTCVideoDecoderTest : public testing::Test { - protected: - static const int kWidth; - static const int kHeight; - static const PipelineStatistics kStatistics; - - RTCVideoDecoderTest() { - } - - virtual ~RTCVideoDecoderTest() { - } - - virtual void SetUp() OVERRIDE { - video_track_ = MockVideoTrack::Create(); - decoder_ = new RTCVideoDecoder(message_loop_.message_loop_proxy(), - message_loop_.message_loop_proxy(), - video_track_); - read_cb_ = base::Bind(&RTCVideoDecoderTest::FrameReady, - base::Unretained(this)); - - DCHECK(decoder_); - - EXPECT_CALL(statistics_cb_, OnStatistics(_)) - .Times(AnyNumber()); - } - - virtual void TearDown() OVERRIDE { - if (decoder_->state_ == RTCVideoDecoder::kStopped) - return; - Stop(); - } - - void InitializeDecoderSuccessfully() { - EXPECT_CALL(*video_track_, AddRenderer(decoder_.get())); - // Test successful initialization. - decoder_->Initialize( - NULL, NewExpectedStatusCB(PIPELINE_OK), NewStatisticsCB()); - message_loop_.RunUntilIdle(); - } - - void Stop() { - EXPECT_CALL(*video_track_, RemoveRenderer(decoder_.get())); - decoder_->Stop(media::NewExpectedClosure()); - - message_loop_.RunUntilIdle(); - EXPECT_EQ(RTCVideoDecoder::kStopped, decoder_->state_); - } - - StatisticsCB NewStatisticsCB() { - return base::Bind(&MockStatisticsCB::OnStatistics, - base::Unretained(&statistics_cb_)); - } - - void RenderFrame() { - NullVideoFrame video_frame; - decoder_->RenderFrame(&video_frame); - } - - MOCK_METHOD2(FrameReady, void(media::VideoDecoder::Status status, - const scoped_refptr<media::VideoFrame>&)); - - // Fixture members. - scoped_refptr<MockVideoTrack> video_track_; - scoped_refptr<RTCVideoDecoder> decoder_; - MockStatisticsCB statistics_cb_; - MessageLoop message_loop_; - media::VideoDecoder::ReadCB read_cb_; - - private: - DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderTest); -}; - -const int RTCVideoDecoderTest::kWidth = 640; -const int RTCVideoDecoderTest::kHeight = 480; -const PipelineStatistics RTCVideoDecoderTest::kStatistics; - -MATCHER_P2(HasSize, width, height, "") { - EXPECT_EQ(arg->coded_size().width(), width); - EXPECT_EQ(arg->coded_size().height(), height); - EXPECT_EQ(arg->visible_rect().x(), 0); - EXPECT_EQ(arg->visible_rect().y(), 0); - EXPECT_EQ(arg->visible_rect().width(), width); - EXPECT_EQ(arg->visible_rect().height(), height); - EXPECT_EQ(arg->natural_size().width(), width); - EXPECT_EQ(arg->natural_size().height(), height); - return (arg->coded_size().width() == width) && - (arg->coded_size().height() == height) && - (arg->visible_rect().x() == 0) && - (arg->visible_rect().y() == 0) && - (arg->visible_rect().width() == width) && - (arg->visible_rect().height() == height) && - (arg->natural_size().width() == width) && - (arg->natural_size().height() == height); -} - -TEST_F(RTCVideoDecoderTest, Initialize_Successful) { - InitializeDecoderSuccessfully(); - - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - HasSize(kWidth, kHeight))); - decoder_->Read(read_cb_); - RenderFrame(); -} - -TEST_F(RTCVideoDecoderTest, DoReset) { - InitializeDecoderSuccessfully(); - - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - scoped_refptr<media::VideoFrame>())); - decoder_->Read(read_cb_); - decoder_->Reset(media::NewExpectedClosure()); - - message_loop_.RunUntilIdle(); - EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); -} - -TEST_F(RTCVideoDecoderTest, DoRenderFrame) { - InitializeDecoderSuccessfully(); - - for (size_t i = 0; i < media::limits::kMaxVideoFrames; ++i) - RenderFrame(); - - message_loop_.RunUntilIdle(); - EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); -} - -TEST_F(RTCVideoDecoderTest, DoSetSize) { - InitializeDecoderSuccessfully(); - - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - HasSize(kWidth, kHeight))); - decoder_->Read(read_cb_); - RenderFrame(); - message_loop_.RunUntilIdle(); - - int new_width = kWidth * 2; - int new_height = kHeight * 2; - decoder_->SetSize(new_width, new_height); - - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - HasSize(new_width, new_height))); - decoder_->Read(read_cb_); - RenderFrame(); - message_loop_.RunUntilIdle(); -} - -TEST_F(RTCVideoDecoderTest, ReadAndShutdown) { - // Test all the Read requests can be fullfilled (which is needed in order to - // teardown the pipeline) even when there's no input frame. - InitializeDecoderSuccessfully(); - - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - scoped_refptr<media::VideoFrame>())); - decoder_->Read(read_cb_); - Stop(); - - // Any read after stopping should be immediately satisfied. - EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, - scoped_refptr<media::VideoFrame>())); - decoder_->Read(read_cb_); - message_loop_.RunUntilIdle(); -} - -} // namespace content diff --git a/content/renderer/media/rtc_video_renderer.h b/content/renderer/media/rtc_video_renderer.h index ea0ac50..49a3091 100644 --- a/content/renderer/media/rtc_video_renderer.h +++ b/content/renderer/media/rtc_video_renderer.h @@ -25,6 +25,9 @@ namespace content { // RTCVideoRenderer register itself to the Video Track when the // VideoFrameProvider is started and deregisters itself when it is stopped. // Calls to webrtc::VideoTrackInterface must occur on the main thread. +// TODO(wuchengli): Add unit test. See the link below for reference. +// http://src.chromium.org/viewvc/chrome/trunk/src/content/renderer/media/rtc_vi +// deo_decoder_unittest.cc?revision=180591&view=markup class CONTENT_EXPORT RTCVideoRenderer : NON_EXPORTED_BASE(public webkit_media::VideoFrameProvider), NON_EXPORTED_BASE(public webrtc::VideoRendererInterface), diff --git a/content/renderer/render_view_impl.cc b/content/renderer/render_view_impl.cc index 03c642a..61554f7 100644 --- a/content/renderer/render_view_impl.cc +++ b/content/renderer/render_view_impl.cc @@ -2703,10 +2703,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( const CommandLine* cmd_line = CommandLine::ForCurrentProcess(); #if defined(ENABLE_WEBRTC) - // TODO(wjia): when all patches related to WebMediaPlayerMS have been - // landed, remove the switch. Refer to crbug.com/142988. - if (!cmd_line->HasSwitch(switches::kDisableWebMediaPlayerMS) && - MediaStreamImpl::CheckMediaStream(url)) { + if (MediaStreamImpl::CheckMediaStream(url)) { EnsureMediaStreamImpl(); return new webkit_media::WebMediaPlayerMS( frame, client, AsWeakPtr(), media_stream_impl_, new RenderMediaLog()); @@ -2789,7 +2786,7 @@ WebMediaPlayer* RenderViewImpl::createMediaPlayer( } webkit_media::WebMediaPlayerParams params( - sink, gpu_factories, media_stream_impl_, new RenderMediaLog()); + sink, gpu_factories, new RenderMediaLog()); WebMediaPlayer* media_player = GetContentClient()->renderer()->OverrideCreateWebMediaPlayer( this, frame, client, AsWeakPtr(), params); |