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

Side by Side Diff: content/renderer/media/rtc_video_decoder_bridge_unittest.cc

Issue 13890012: Integrate VDA with WebRTC. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 7 years, 7 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 unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "base/message_loop.h"
7 #include "base/run_loop.h"
8 #include "base/threading/platform_thread.h"
9 #include "content/renderer/media/rtc_video_decoder_bridge.h"
10 #include "media/base/gmock_callback_support.h"
11 #include "media/base/mock_filters.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13
14 using ::testing::_;
15 using ::testing::AnyNumber;
16
17 namespace content {
18
19 class RTCVideoDecoderBridgeTest
20 : public ::testing::Test,
21 public base::PlatformThread::Delegate,
22 webrtc::DecodedImageCallback {
23 public:
24 RTCVideoDecoderBridgeTest()
25 : decoder_(new media::MockVideoDecoder()),
26 loop_idle_waiter_(false, false),
27 num_delivered_frames_(0),
28 num_delivered_encoded_image_(0),
29 loop_ready_waiter_(false, false),
30 thread_(base::kNullThreadHandle),
31 is_tearing_down_(false) {
32 memset(&codec_, 0, sizeof(codec_));
33 }
34
35 virtual void SetUp() OVERRIDE {
36 CHECK(base::PlatformThread::Create(0, this, &thread_));
37 loop_ready_waiter_.Wait();
38 bridge_.reset(new RTCVideoDecoderBridge(decoder_, loop_proxy_));
39 }
40
41 virtual void TearDown() OVERRIDE {
42 if (thread_ != base::kNullThreadHandle) {
43 {
44 base::AutoLock auto_lock(lock_);
45 is_tearing_down_ = true;
46 }
47 base::PlatformThread::Join(thread_);
48 }
49 }
50
51 virtual void ThreadMain() OVERRIDE {
52 MessageLoop message_loop;
53 loop_proxy_ = message_loop.message_loop_proxy();
54 loop_ready_waiter_.Signal();
55 LOG(INFO) << "ThreadMain()";
56 while (true) {
57 message_loop.RunUntilIdle();
58 loop_idle_waiter_.Signal();
59 loop_idle_waiter_.Reset();
60 base::AutoLock auto_lock(lock_);
61 if (is_tearing_down_) {
62 break;
63 }
64 }
65 }
66
67 virtual WebRtc_Word32 Decoded(webrtc::I420VideoFrame& decoded_image)
68 OVERRIDE {
69 num_delivered_frames_++;
70 return WEBRTC_VIDEO_CODEC_OK;
71 }
72
73 void Initialize() {
74 EXPECT_CALL(*decoder_, Initialize(_, _, _))
75 .WillOnce(media::RunCallback<1>(media::PIPELINE_OK));
76 EXPECT_CALL(*decoder_, Read(_))
77 .WillRepeatedly(
78 Invoke(this, &RTCVideoDecoderBridgeTest::FrameRequested));
79 EXPECT_CALL(*decoder_, Stop(_))
80 .WillRepeatedly(media::RunClosure<0>());
81 EXPECT_CALL(*decoder_, Reset(_))
82 .WillRepeatedly(media::RunClosure<0>());
83
84 codec_.codecType = webrtc::kVideoCodecVP8;
85 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, bridge_->InitDecode(&codec_, 1));
86 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
87 bridge_->RegisterDecodeCompleteCallback(this));
88 }
89
90 void FrameRequested(const media::VideoDecoder::ReadCB& read_cb) {
91 DCHECK_EQ(loop_proxy_, base::MessageLoopProxy::current());
92 EXPECT_TRUE(read_cb_.is_null());
93 read_cb_ = read_cb;
94 SimulateDecoding();
95 }
96
97 void SimulateDecoding() {
98 CHECK(!read_cb_.is_null());
99 base::AutoLock auto_lock(lock_);
100 if (num_delivered_encoded_image_ <= 0) {
101 return;
102 }
103 num_delivered_encoded_image_--;
104
105 loop_proxy_->PostTask(
106 FROM_HERE,
107 base::Bind(read_cb_, media::VideoDecoder::kOk,
108 media::VideoFrame::CreateEmptyFrame()));
109 read_cb_.Reset();
110 }
111
112 protected:
113 scoped_refptr<media::MockVideoDecoder> decoder_;
114 scoped_ptr<RTCVideoDecoderBridge> bridge_;
115 webrtc::VideoCodec codec_;
116 base::WaitableEvent loop_idle_waiter_;
117 int num_delivered_frames_;
118 int num_delivered_encoded_image_;
119
120 private:
121 scoped_refptr<base::MessageLoopProxy> loop_proxy_;
122 base::WaitableEvent loop_ready_waiter_;
123 base::PlatformThreadHandle thread_;
124
125 base::Lock lock_;
126 bool is_tearing_down_;
127 media::VideoDecoder::ReadCB read_cb_;
128 };
129
130 TEST_F(RTCVideoDecoderBridgeTest, InitDecodeReturnsErrorOnNonVP8Codec) {
131 codec_.codecType = webrtc::kVideoCodecI420;
132 EXPECT_NE(WEBRTC_VIDEO_CODEC_OK, bridge_->InitDecode(&codec_, 1));
133 }
134
135 TEST_F(RTCVideoDecoderBridgeTest, InitDecodeReturnsErrorOnFeedbackMode) {
136 codec_.codecType = webrtc::kVideoCodecVP8;
137 codec_.codecSpecific.VP8.feedbackModeOn = true;
138 EXPECT_NE(WEBRTC_VIDEO_CODEC_OK, bridge_->InitDecode(&codec_, 1));
139 }
140
141 TEST_F(RTCVideoDecoderBridgeTest, InitDecodeReturnsErrorOnDecoderInitFailure) {
142 EXPECT_CALL(*decoder_, Initialize(_, _, _))
143 .WillOnce(media::RunCallback<1>(media::DECODER_ERROR_NOT_SUPPORTED));
144
145 codec_.codecType = webrtc::kVideoCodecVP8;
146 EXPECT_NE(WEBRTC_VIDEO_CODEC_OK, bridge_->InitDecode(&codec_, 1));
147 }
148
149 TEST_F(RTCVideoDecoderBridgeTest, InitDecodeReturnsOkOnSuccessfulDecoderInit) {
150 Initialize();
151 }
152
153 TEST_F(RTCVideoDecoderBridgeTest, DecodeReturnsErrorBeforeInitDecode) {
154 webrtc::EncodedImage input_image;
155 EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED,
156 bridge_->Decode(input_image, false, NULL, NULL, 0));
157 }
158
159 TEST_F(RTCVideoDecoderBridgeTest, DecodeReturnsErrorOnDamagedBitstream) {
160 Initialize();
161 webrtc::EncodedImage input_image;
162 input_image._completeFrame = false;
163 EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
164 bridge_->Decode(input_image, false, NULL, NULL, 0));
165 }
166
167 TEST_F(RTCVideoDecoderBridgeTest, DecodeReturnsErrorOnMissingFrames) {
168 Initialize();
169 webrtc::EncodedImage input_image;
170 input_image._completeFrame = true;
171 EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR,
172 bridge_->Decode(input_image, true, NULL, NULL, 0));
173 }
174
175 TEST_F(RTCVideoDecoderBridgeTest, DecodeReturnsOkAndGetsDecodedFrame) {
176 Initialize();
177 webrtc::EncodedImage input_image;
178 input_image._completeFrame = true;
179 unsigned char data = 123;
180 input_image._buffer = &data;
181 input_image._length = sizeof(data);
182 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
183 bridge_->Decode(input_image, false, NULL, NULL, 0));
184 num_delivered_encoded_image_++; //XXX : lock?
185 loop_idle_waiter_.Wait();
186 SimulateDecoding();
187 loop_idle_waiter_.Wait();
188 // Check output.
189 EXPECT_EQ(1, num_delivered_frames_); //XXX: lock?
190 }
191
192 TEST_F(RTCVideoDecoderBridgeTest, ResetReturnsOk) {
193 Initialize();
194 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, bridge_->Reset());
195 }
196
197 TEST_F(RTCVideoDecoderBridgeTest, ReleaseReturnsOk) {
198 Initialize();
199 EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, bridge_->Release());
200 }
201
202 } // content
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698