| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/memory/ref_counted.h" | 8 #include "base/memory/ref_counted.h" |
| 9 #include "base/memory/scoped_ptr.h" | 9 #include "base/memory/scoped_ptr.h" |
| 10 #include "media/base/video_frame.h" | 10 #include "media/base/video_frame.h" |
| (...skipping 27 matching lines...) Expand all Loading... |
| 38 return; | 38 return; |
| 39 } | 39 } |
| 40 callback.Run(shm.Pass()); | 40 callback.Run(shm.Pass()); |
| 41 } | 41 } |
| 42 | 42 |
| 43 class TestVideoEncoderCallback | 43 class TestVideoEncoderCallback |
| 44 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> { | 44 : public base::RefCountedThreadSafe<TestVideoEncoderCallback> { |
| 45 public: | 45 public: |
| 46 TestVideoEncoderCallback() {} | 46 TestVideoEncoderCallback() {} |
| 47 | 47 |
| 48 void SetExpectedResult(bool expected_key_frame, | 48 void SetExpectedResult(uint32 expected_frame_id, |
| 49 uint8 expected_frame_id, | 49 uint32 expected_last_referenced_frame_id, |
| 50 uint8 expected_last_referenced_frame_id, | |
| 51 const base::TimeTicks& expected_capture_time) { | 50 const base::TimeTicks& expected_capture_time) { |
| 52 expected_key_frame_ = expected_key_frame; | |
| 53 expected_frame_id_ = expected_frame_id; | 51 expected_frame_id_ = expected_frame_id; |
| 54 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id; | 52 expected_last_referenced_frame_id_ = expected_last_referenced_frame_id; |
| 55 expected_capture_time_ = expected_capture_time; | 53 expected_capture_time_ = expected_capture_time; |
| 56 } | 54 } |
| 57 | 55 |
| 58 void DeliverEncodedVideoFrame( | 56 void DeliverEncodedVideoFrame( |
| 59 scoped_ptr<transport::EncodedVideoFrame> encoded_frame, | 57 scoped_ptr<transport::EncodedFrame> encoded_frame) { |
| 60 const base::TimeTicks& capture_time) { | 58 if (expected_frame_id_ == expected_last_referenced_frame_id_) { |
| 61 EXPECT_EQ(expected_key_frame_, encoded_frame->key_frame); | 59 EXPECT_EQ(transport::EncodedFrame::KEY, encoded_frame->relationship); |
| 60 } else { |
| 61 EXPECT_EQ(transport::EncodedFrame::DEPENDENT, |
| 62 encoded_frame->relationship); |
| 63 } |
| 62 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); | 64 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); |
| 63 EXPECT_EQ(expected_last_referenced_frame_id_, | 65 EXPECT_EQ(expected_last_referenced_frame_id_, |
| 64 encoded_frame->last_referenced_frame_id); | 66 encoded_frame->referenced_frame_id); |
| 65 EXPECT_EQ(expected_capture_time_, capture_time); | 67 EXPECT_EQ(expected_capture_time_, encoded_frame->reference_time); |
| 66 } | 68 } |
| 67 | 69 |
| 68 protected: | 70 protected: |
| 69 virtual ~TestVideoEncoderCallback() {} | 71 virtual ~TestVideoEncoderCallback() {} |
| 70 | 72 |
| 71 private: | 73 private: |
| 72 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; | 74 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; |
| 73 | 75 |
| 74 bool expected_key_frame_; | 76 bool expected_key_frame_; |
| 75 uint8 expected_frame_id_; | 77 uint32 expected_frame_id_; |
| 76 uint8 expected_last_referenced_frame_id_; | 78 uint32 expected_last_referenced_frame_id_; |
| 77 base::TimeTicks expected_capture_time_; | 79 base::TimeTicks expected_capture_time_; |
| 78 | 80 |
| 79 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); | 81 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); |
| 80 }; | 82 }; |
| 81 } // namespace | 83 } // namespace |
| 82 | 84 |
| 83 class ExternalVideoEncoderTest : public ::testing::Test { | 85 class ExternalVideoEncoderTest : public ::testing::Test { |
| 84 protected: | 86 protected: |
| 85 ExternalVideoEncoderTest() | 87 ExternalVideoEncoderTest() |
| 86 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { | 88 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 | 140 |
| 139 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { | 141 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { |
| 140 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 142 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 141 | 143 |
| 142 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 144 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 143 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 145 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 144 test_video_encoder_callback_.get()); | 146 test_video_encoder_callback_.get()); |
| 145 | 147 |
| 146 base::TimeTicks capture_time; | 148 base::TimeTicks capture_time; |
| 147 capture_time += base::TimeDelta::FromMilliseconds(33); | 149 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 148 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 150 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 149 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 151 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 150 video_frame_, capture_time, frame_encoded_callback)); | 152 video_frame_, capture_time, frame_encoded_callback)); |
| 151 task_runner_->RunTasks(); | 153 task_runner_->RunTasks(); |
| 152 | 154 |
| 153 for (int i = 0; i < 6; ++i) { | 155 for (int i = 0; i < 6; ++i) { |
| 154 capture_time += base::TimeDelta::FromMilliseconds(33); | 156 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 155 test_video_encoder_callback_->SetExpectedResult( | 157 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
| 156 false, i + 1, i, capture_time); | |
| 157 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 158 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 158 video_frame_, capture_time, frame_encoded_callback)); | 159 video_frame_, capture_time, frame_encoded_callback)); |
| 159 task_runner_->RunTasks(); | 160 task_runner_->RunTasks(); |
| 160 } | 161 } |
| 161 // We need to run the task to cleanup the GPU instance. | 162 // We need to run the task to cleanup the GPU instance. |
| 162 video_encoder_.reset(NULL); | 163 video_encoder_.reset(NULL); |
| 163 task_runner_->RunTasks(); | 164 task_runner_->RunTasks(); |
| 164 } | 165 } |
| 165 | 166 |
| 166 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { | 167 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { |
| 167 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 168 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 168 | 169 |
| 169 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 170 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 170 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 171 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 171 test_video_encoder_callback_.get()); | 172 test_video_encoder_callback_.get()); |
| 172 | 173 |
| 173 base::TimeTicks capture_time; | 174 base::TimeTicks capture_time; |
| 174 capture_time += base::TimeDelta::FromMilliseconds(33); | 175 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 175 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 176 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 176 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 177 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 177 video_frame_, capture_time, frame_encoded_callback)); | 178 video_frame_, capture_time, frame_encoded_callback)); |
| 178 task_runner_->RunTasks(); | 179 task_runner_->RunTasks(); |
| 179 | 180 |
| 180 video_encoder_->SkipNextFrame(true); | 181 video_encoder_->SkipNextFrame(true); |
| 181 for (int i = 0; i < 2; ++i) { | 182 for (int i = 0; i < 2; ++i) { |
| 182 capture_time += base::TimeDelta::FromMilliseconds(33); | 183 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 183 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( | 184 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( |
| 184 video_frame_, capture_time, frame_encoded_callback)); | 185 video_frame_, capture_time, frame_encoded_callback)); |
| 185 task_runner_->RunTasks(); | 186 task_runner_->RunTasks(); |
| 186 } | 187 } |
| 187 | 188 |
| 188 video_encoder_->SkipNextFrame(false); | 189 video_encoder_->SkipNextFrame(false); |
| 189 for (int i = 0; i < 2; ++i) { | 190 for (int i = 0; i < 2; ++i) { |
| 190 capture_time += base::TimeDelta::FromMilliseconds(33); | 191 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 191 test_video_encoder_callback_->SetExpectedResult( | 192 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
| 192 false, i + 1, i, capture_time); | |
| 193 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 193 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 194 video_frame_, capture_time, frame_encoded_callback)); | 194 video_frame_, capture_time, frame_encoded_callback)); |
| 195 task_runner_->RunTasks(); | 195 task_runner_->RunTasks(); |
| 196 } | 196 } |
| 197 // We need to run the task to cleanup the GPU instance. | 197 // We need to run the task to cleanup the GPU instance. |
| 198 video_encoder_.reset(NULL); | 198 video_encoder_.reset(NULL); |
| 199 task_runner_->RunTasks(); | 199 task_runner_->RunTasks(); |
| 200 } | 200 } |
| 201 | 201 |
| 202 TEST_F(ExternalVideoEncoderTest, StreamHeader) { | 202 TEST_F(ExternalVideoEncoderTest, StreamHeader) { |
| 203 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 203 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 204 | 204 |
| 205 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 205 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 206 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 206 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 207 test_video_encoder_callback_.get()); | 207 test_video_encoder_callback_.get()); |
| 208 | 208 |
| 209 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. | 209 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. |
| 210 fake_vea_->SendDummyFrameForTesting(false); | 210 fake_vea_->SendDummyFrameForTesting(false); |
| 211 | 211 |
| 212 // Verify the first returned bitstream buffer is still a key frame. | 212 // Verify the first returned bitstream buffer is still a key frame. |
| 213 base::TimeTicks capture_time; | 213 base::TimeTicks capture_time; |
| 214 capture_time += base::TimeDelta::FromMilliseconds(33); | 214 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 215 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 215 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 216 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 216 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 217 video_frame_, capture_time, frame_encoded_callback)); | 217 video_frame_, capture_time, frame_encoded_callback)); |
| 218 task_runner_->RunTasks(); | 218 task_runner_->RunTasks(); |
| 219 | 219 |
| 220 // We need to run the task to cleanup the GPU instance. | 220 // We need to run the task to cleanup the GPU instance. |
| 221 video_encoder_.reset(NULL); | 221 video_encoder_.reset(NULL); |
| 222 task_runner_->RunTasks(); | 222 task_runner_->RunTasks(); |
| 223 } | 223 } |
| 224 | 224 |
| 225 } // namespace cast | 225 } // namespace cast |
| 226 } // namespace media | 226 } // namespace media |
| OLD | NEW |