| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/renderer/media/rtc_video_decoder.h" | 5 #include "content/renderer/media/rtc_video_decoder.h" |
| 6 | 6 |
| 7 #include <deque> | 7 #include <deque> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/memory/singleton.h" | 10 #include "base/memory/singleton.h" |
| 11 #include "base/message_loop.h" | 11 #include "base/message_loop.h" |
| 12 #include "base/string_util.h" | 12 #include "base/string_util.h" |
| 13 #include "media/base/data_buffer.h" | 13 #include "media/base/data_buffer.h" |
| 14 #include "media/base/filters.h" | 14 #include "media/base/filters.h" |
| 15 #include "media/base/limits.h" | 15 #include "media/base/limits.h" |
| 16 #include "media/base/mock_callback.h" | 16 #include "media/base/mock_callback.h" |
| 17 #include "media/base/mock_filter_host.h" | |
| 18 #include "media/base/mock_filters.h" | 17 #include "media/base/mock_filters.h" |
| 19 #include "media/base/video_frame.h" | 18 #include "media/base/video_frame.h" |
| 20 #include "testing/gtest/include/gtest/gtest.h" | 19 #include "testing/gtest/include/gtest/gtest.h" |
| 21 #include "third_party/libjingle/source/talk/session/phone/videoframe.h" | 20 #include "third_party/libjingle/source/talk/session/phone/videoframe.h" |
| 22 | 21 |
| 23 using ::testing::_; | 22 using ::testing::_; |
| 24 using ::testing::AnyNumber; | 23 using ::testing::AnyNumber; |
| 25 using ::testing::DoAll; | 24 using ::testing::DoAll; |
| 26 using ::testing::Message; | 25 using ::testing::Message; |
| 27 using ::testing::Return; | 26 using ::testing::Return; |
| 28 using ::testing::ReturnNull; | 27 using ::testing::ReturnNull; |
| 29 using ::testing::SetArgumentPointee; | 28 using ::testing::SetArgumentPointee; |
| 30 using ::testing::StrictMock; | 29 using ::testing::StrictMock; |
| 31 using ::testing::WithArg; | 30 using ::testing::WithArg; |
| 32 using ::testing::Invoke; | 31 using ::testing::Invoke; |
| 33 using media::MockStatisticsCB; | 32 using media::MockStatisticsCB; |
| 34 using media::MockVideoRenderer; | 33 using media::MockVideoRenderer; |
| 35 using media::MockFilterHost; | |
| 36 using media::NewExpectedClosure; | 34 using media::NewExpectedClosure; |
| 37 using media::NewExpectedStatusCB; | 35 using media::NewExpectedStatusCB; |
| 38 using media::PipelineStatistics; | 36 using media::PipelineStatistics; |
| 39 using media::PIPELINE_OK; | 37 using media::PIPELINE_OK; |
| 40 using media::StatisticsCB; | 38 using media::StatisticsCB; |
| 41 | 39 |
| 42 namespace { | 40 namespace { |
| 43 | 41 |
| 44 class NullVideoFrame : public cricket::VideoFrame { | 42 class NullVideoFrame : public cricket::VideoFrame { |
| 45 public: | 43 public: |
| 46 NullVideoFrame() {}; | 44 NullVideoFrame() {} |
| 47 virtual ~NullVideoFrame() {}; | 45 virtual ~NullVideoFrame() {} |
| 48 | 46 |
| 49 virtual bool Reset(uint32 fourcc, int w, int h, int dw, int dh, | 47 virtual bool Reset(uint32 fourcc, int w, int h, int dw, int dh, |
| 50 uint8 *sample, size_t sample_size, | 48 uint8 *sample, size_t sample_size, |
| 51 size_t pixel_width, size_t pixel_height, | 49 size_t pixel_width, size_t pixel_height, |
| 52 int64 elapsed_time, int64 time_stamp, int rotation) | 50 int64 elapsed_time, int64 time_stamp, int rotation) |
| 53 OVERRIDE { | 51 OVERRIDE { |
| 54 return true; | 52 return true; |
| 55 } | 53 } |
| 56 | 54 |
| 57 virtual size_t GetWidth() const OVERRIDE { return 0; } | 55 virtual size_t GetWidth() const OVERRIDE { return 0; } |
| (...skipping 70 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 128 static const PipelineStatistics kStatistics; | 126 static const PipelineStatistics kStatistics; |
| 129 | 127 |
| 130 RTCVideoDecoderTest() { | 128 RTCVideoDecoderTest() { |
| 131 decoder_ = new RTCVideoDecoder(&message_loop_, kUrl); | 129 decoder_ = new RTCVideoDecoder(&message_loop_, kUrl); |
| 132 renderer_ = new MockVideoRenderer(); | 130 renderer_ = new MockVideoRenderer(); |
| 133 read_cb_ = base::Bind(&RTCVideoDecoderTest::FrameReady, | 131 read_cb_ = base::Bind(&RTCVideoDecoderTest::FrameReady, |
| 134 base::Unretained(this)); | 132 base::Unretained(this)); |
| 135 | 133 |
| 136 DCHECK(decoder_); | 134 DCHECK(decoder_); |
| 137 | 135 |
| 138 // Inject mocks and prepare a demuxer stream. | |
| 139 decoder_->set_host(&host_); | |
| 140 | |
| 141 EXPECT_CALL(stats_callback_object_, OnStatistics(_)) | 136 EXPECT_CALL(stats_callback_object_, OnStatistics(_)) |
| 142 .Times(AnyNumber()); | 137 .Times(AnyNumber()); |
| 143 } | 138 } |
| 144 | 139 |
| 145 virtual ~RTCVideoDecoderTest() { | 140 virtual ~RTCVideoDecoderTest() { |
| 146 // Finish up any remaining tasks. | 141 // Finish up any remaining tasks. |
| 147 message_loop_.RunAllPending(); | 142 message_loop_.RunAllPending(); |
| 148 } | 143 } |
| 149 | 144 |
| 150 void InitializeDecoderSuccessfully() { | 145 void InitializeDecoderSuccessfully() { |
| 151 // Test successful initialization. | 146 // Test successful initialization. |
| 152 decoder_->Initialize( | 147 decoder_->Initialize( |
| 153 NULL, NewExpectedStatusCB(PIPELINE_OK), NewStatisticsCB()); | 148 NULL, NewExpectedStatusCB(PIPELINE_OK), NewStatisticsCB()); |
| 154 message_loop_.RunAllPending(); | 149 message_loop_.RunAllPending(); |
| 155 } | 150 } |
| 156 | 151 |
| 157 StatisticsCB NewStatisticsCB() { | 152 StatisticsCB NewStatisticsCB() { |
| 158 return base::Bind(&MockStatisticsCB::OnStatistics, | 153 return base::Bind(&MockStatisticsCB::OnStatistics, |
| 159 base::Unretained(&stats_callback_object_)); | 154 base::Unretained(&stats_callback_object_)); |
| 160 } | 155 } |
| 161 | 156 |
| 162 MOCK_METHOD1(FrameReady, void(scoped_refptr<media::VideoFrame>)); | 157 MOCK_METHOD2(FrameReady, void(media::VideoDecoder::DecoderStatus status, |
| 158 scoped_refptr<media::VideoFrame>)); |
| 163 | 159 |
| 164 // Fixture members. | 160 // Fixture members. |
| 165 scoped_refptr<RTCVideoDecoder> decoder_; | 161 scoped_refptr<RTCVideoDecoder> decoder_; |
| 166 scoped_refptr<MockVideoRenderer> renderer_; | 162 scoped_refptr<MockVideoRenderer> renderer_; |
| 167 MockStatisticsCB stats_callback_object_; | 163 MockStatisticsCB stats_callback_object_; |
| 168 StrictMock<MockFilterHost> host_; | |
| 169 MessageLoop message_loop_; | 164 MessageLoop message_loop_; |
| 170 media::VideoDecoder::ReadCB read_cb_; | 165 media::VideoDecoder::ReadCB read_cb_; |
| 171 | 166 |
| 172 private: | 167 private: |
| 173 DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderTest); | 168 DISALLOW_COPY_AND_ASSIGN(RTCVideoDecoderTest); |
| 174 }; | 169 }; |
| 175 | 170 |
| 176 const int RTCVideoDecoderTest::kWidth = 640; | 171 const int RTCVideoDecoderTest::kWidth = 640; |
| 177 const int RTCVideoDecoderTest::kHeight = 480; | 172 const int RTCVideoDecoderTest::kHeight = 480; |
| 178 const char* RTCVideoDecoderTest::kUrl = "media://remote/0"; | 173 const char* RTCVideoDecoderTest::kUrl = "media://remote/0"; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 197 | 192 |
| 198 message_loop_.RunAllPending(); | 193 message_loop_.RunAllPending(); |
| 199 EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); | 194 EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); |
| 200 } | 195 } |
| 201 | 196 |
| 202 TEST_F(RTCVideoDecoderTest, DoFlush) { | 197 TEST_F(RTCVideoDecoderTest, DoFlush) { |
| 203 const base::TimeDelta kZero; | 198 const base::TimeDelta kZero; |
| 204 | 199 |
| 205 InitializeDecoderSuccessfully(); | 200 InitializeDecoderSuccessfully(); |
| 206 | 201 |
| 207 EXPECT_CALL(*this, FrameReady(_)); | 202 EXPECT_CALL(*this, FrameReady(media::VideoDecoder::kOk, _)); |
| 208 decoder_->Read(read_cb_); | 203 decoder_->Read(read_cb_); |
| 209 decoder_->Pause(media::NewExpectedClosure()); | 204 decoder_->Pause(media::NewExpectedClosure()); |
| 210 decoder_->Flush(media::NewExpectedClosure()); | 205 decoder_->Flush(media::NewExpectedClosure()); |
| 211 | 206 |
| 212 message_loop_.RunAllPending(); | 207 message_loop_.RunAllPending(); |
| 213 EXPECT_EQ(RTCVideoDecoder::kPaused, decoder_->state_); | 208 EXPECT_EQ(RTCVideoDecoder::kPaused, decoder_->state_); |
| 214 } | 209 } |
| 215 | 210 |
| 216 TEST_F(RTCVideoDecoderTest, DoRenderFrame) { | 211 TEST_F(RTCVideoDecoderTest, DoRenderFrame) { |
| 217 const base::TimeDelta kZero; | 212 const base::TimeDelta kZero; |
| 218 EXPECT_CALL(host_, GetTime()).WillRepeatedly(Return(base::TimeDelta())); | |
| 219 | 213 |
| 220 InitializeDecoderSuccessfully(); | 214 InitializeDecoderSuccessfully(); |
| 221 | 215 |
| 222 NullVideoFrame video_frame; | 216 NullVideoFrame video_frame; |
| 223 | 217 |
| 224 for (size_t i = 0; i < media::limits::kMaxVideoFrames; ++i) { | 218 for (size_t i = 0; i < media::limits::kMaxVideoFrames; ++i) { |
| 225 decoder_->RenderFrame(&video_frame); | 219 decoder_->RenderFrame(&video_frame); |
| 226 } | 220 } |
| 227 | 221 |
| 228 message_loop_.RunAllPending(); | 222 message_loop_.RunAllPending(); |
| 229 EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); | 223 EXPECT_EQ(RTCVideoDecoder::kNormal, decoder_->state_); |
| 230 } | 224 } |
| 231 | 225 |
| 232 TEST_F(RTCVideoDecoderTest, DoSetSize) { | 226 TEST_F(RTCVideoDecoderTest, DoSetSize) { |
| 233 InitializeDecoderSuccessfully(); | 227 InitializeDecoderSuccessfully(); |
| 234 | 228 |
| 235 int new_width = kWidth * 2; | 229 int new_width = kWidth * 2; |
| 236 int new_height = kHeight * 2; | 230 int new_height = kHeight * 2; |
| 237 gfx::Size new_natural_size(new_width, new_height); | 231 gfx::Size new_natural_size(new_width, new_height); |
| 238 int new_reserved = 0; | 232 int new_reserved = 0; |
| 239 | 233 |
| 240 EXPECT_CALL(host_, | |
| 241 SetNaturalVideoSize(new_natural_size)).WillRepeatedly(Return()); | |
| 242 | |
| 243 decoder_->SetSize(new_width, new_height, new_reserved); | 234 decoder_->SetSize(new_width, new_height, new_reserved); |
| 244 | 235 |
| 245 EXPECT_EQ(new_width, decoder_->natural_size().width()); | 236 EXPECT_EQ(new_width, decoder_->natural_size().width()); |
| 246 EXPECT_EQ(new_height, decoder_->natural_size().height()); | 237 EXPECT_EQ(new_height, decoder_->natural_size().height()); |
| 247 | 238 |
| 248 message_loop_.RunAllPending(); | 239 message_loop_.RunAllPending(); |
| 249 } | 240 } |
| OLD | NEW |