| 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_base_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_base_frame_id_ = expected_base_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) { | |
| 61 EXPECT_EQ(expected_key_frame_, encoded_frame->key_frame); | |
| 62 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); | 58 EXPECT_EQ(expected_frame_id_, encoded_frame->frame_id); |
| 63 EXPECT_EQ(expected_last_referenced_frame_id_, | 59 EXPECT_EQ(expected_base_frame_id_, encoded_frame->base_frame_id); |
| 64 encoded_frame->last_referenced_frame_id); | 60 EXPECT_EQ(expected_capture_time_, encoded_frame->reference_time); |
| 65 EXPECT_EQ(expected_capture_time_, capture_time); | |
| 66 } | 61 } |
| 67 | 62 |
| 68 protected: | 63 protected: |
| 69 virtual ~TestVideoEncoderCallback() {} | 64 virtual ~TestVideoEncoderCallback() {} |
| 70 | 65 |
| 71 private: | 66 private: |
| 72 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; | 67 friend class base::RefCountedThreadSafe<TestVideoEncoderCallback>; |
| 73 | 68 |
| 74 bool expected_key_frame_; | 69 bool expected_key_frame_; |
| 75 uint8 expected_frame_id_; | 70 uint32 expected_frame_id_; |
| 76 uint8 expected_last_referenced_frame_id_; | 71 uint32 expected_base_frame_id_; |
| 77 base::TimeTicks expected_capture_time_; | 72 base::TimeTicks expected_capture_time_; |
| 78 | 73 |
| 79 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); | 74 DISALLOW_COPY_AND_ASSIGN(TestVideoEncoderCallback); |
| 80 }; | 75 }; |
| 81 } // namespace | 76 } // namespace |
| 82 | 77 |
| 83 class ExternalVideoEncoderTest : public ::testing::Test { | 78 class ExternalVideoEncoderTest : public ::testing::Test { |
| 84 protected: | 79 protected: |
| 85 ExternalVideoEncoderTest() | 80 ExternalVideoEncoderTest() |
| 86 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { | 81 : test_video_encoder_callback_(new TestVideoEncoderCallback()) { |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 138 | 133 |
| 139 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { | 134 TEST_F(ExternalVideoEncoderTest, EncodePattern30fpsRunningOutOfAck) { |
| 140 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 135 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 141 | 136 |
| 142 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 137 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 143 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 138 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 144 test_video_encoder_callback_.get()); | 139 test_video_encoder_callback_.get()); |
| 145 | 140 |
| 146 base::TimeTicks capture_time; | 141 base::TimeTicks capture_time; |
| 147 capture_time += base::TimeDelta::FromMilliseconds(33); | 142 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 148 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 143 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 149 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 144 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 150 video_frame_, capture_time, frame_encoded_callback)); | 145 video_frame_, capture_time, frame_encoded_callback)); |
| 151 task_runner_->RunTasks(); | 146 task_runner_->RunTasks(); |
| 152 | 147 |
| 153 for (int i = 0; i < 6; ++i) { | 148 for (int i = 0; i < 6; ++i) { |
| 154 capture_time += base::TimeDelta::FromMilliseconds(33); | 149 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 155 test_video_encoder_callback_->SetExpectedResult( | 150 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
| 156 false, i + 1, i, capture_time); | |
| 157 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 151 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 158 video_frame_, capture_time, frame_encoded_callback)); | 152 video_frame_, capture_time, frame_encoded_callback)); |
| 159 task_runner_->RunTasks(); | 153 task_runner_->RunTasks(); |
| 160 } | 154 } |
| 161 // We need to run the task to cleanup the GPU instance. | 155 // We need to run the task to cleanup the GPU instance. |
| 162 video_encoder_.reset(NULL); | 156 video_encoder_.reset(NULL); |
| 163 task_runner_->RunTasks(); | 157 task_runner_->RunTasks(); |
| 164 } | 158 } |
| 165 | 159 |
| 166 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { | 160 TEST_F(ExternalVideoEncoderTest, SkipNextFrame) { |
| 167 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 161 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 168 | 162 |
| 169 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 163 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 170 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 164 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 171 test_video_encoder_callback_.get()); | 165 test_video_encoder_callback_.get()); |
| 172 | 166 |
| 173 base::TimeTicks capture_time; | 167 base::TimeTicks capture_time; |
| 174 capture_time += base::TimeDelta::FromMilliseconds(33); | 168 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 175 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 169 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 176 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 170 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 177 video_frame_, capture_time, frame_encoded_callback)); | 171 video_frame_, capture_time, frame_encoded_callback)); |
| 178 task_runner_->RunTasks(); | 172 task_runner_->RunTasks(); |
| 179 | 173 |
| 180 video_encoder_->SkipNextFrame(true); | 174 video_encoder_->SkipNextFrame(true); |
| 181 for (int i = 0; i < 2; ++i) { | 175 for (int i = 0; i < 2; ++i) { |
| 182 capture_time += base::TimeDelta::FromMilliseconds(33); | 176 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 183 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( | 177 EXPECT_FALSE(video_encoder_->EncodeVideoFrame( |
| 184 video_frame_, capture_time, frame_encoded_callback)); | 178 video_frame_, capture_time, frame_encoded_callback)); |
| 185 task_runner_->RunTasks(); | 179 task_runner_->RunTasks(); |
| 186 } | 180 } |
| 187 | 181 |
| 188 video_encoder_->SkipNextFrame(false); | 182 video_encoder_->SkipNextFrame(false); |
| 189 for (int i = 0; i < 2; ++i) { | 183 for (int i = 0; i < 2; ++i) { |
| 190 capture_time += base::TimeDelta::FromMilliseconds(33); | 184 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 191 test_video_encoder_callback_->SetExpectedResult( | 185 test_video_encoder_callback_->SetExpectedResult(i + 1, i, capture_time); |
| 192 false, i + 1, i, capture_time); | |
| 193 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 186 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 194 video_frame_, capture_time, frame_encoded_callback)); | 187 video_frame_, capture_time, frame_encoded_callback)); |
| 195 task_runner_->RunTasks(); | 188 task_runner_->RunTasks(); |
| 196 } | 189 } |
| 197 // We need to run the task to cleanup the GPU instance. | 190 // We need to run the task to cleanup the GPU instance. |
| 198 video_encoder_.reset(NULL); | 191 video_encoder_.reset(NULL); |
| 199 task_runner_->RunTasks(); | 192 task_runner_->RunTasks(); |
| 200 } | 193 } |
| 201 | 194 |
| 202 TEST_F(ExternalVideoEncoderTest, StreamHeader) { | 195 TEST_F(ExternalVideoEncoderTest, StreamHeader) { |
| 203 task_runner_->RunTasks(); // Run the initializer on the correct thread. | 196 task_runner_->RunTasks(); // Run the initializer on the correct thread. |
| 204 | 197 |
| 205 VideoEncoder::FrameEncodedCallback frame_encoded_callback = | 198 VideoEncoder::FrameEncodedCallback frame_encoded_callback = |
| 206 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, | 199 base::Bind(&TestVideoEncoderCallback::DeliverEncodedVideoFrame, |
| 207 test_video_encoder_callback_.get()); | 200 test_video_encoder_callback_.get()); |
| 208 | 201 |
| 209 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. | 202 // Force the FakeVideoEncodeAccelerator to return a dummy non-key frame first. |
| 210 fake_vea_->SendDummyFrameForTesting(false); | 203 fake_vea_->SendDummyFrameForTesting(false); |
| 211 | 204 |
| 212 // Verify the first returned bitstream buffer is still a key frame. | 205 // Verify the first returned bitstream buffer is still a key frame. |
| 213 base::TimeTicks capture_time; | 206 base::TimeTicks capture_time; |
| 214 capture_time += base::TimeDelta::FromMilliseconds(33); | 207 capture_time += base::TimeDelta::FromMilliseconds(33); |
| 215 test_video_encoder_callback_->SetExpectedResult(true, 0, 0, capture_time); | 208 test_video_encoder_callback_->SetExpectedResult(0, 0, capture_time); |
| 216 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( | 209 EXPECT_TRUE(video_encoder_->EncodeVideoFrame( |
| 217 video_frame_, capture_time, frame_encoded_callback)); | 210 video_frame_, capture_time, frame_encoded_callback)); |
| 218 task_runner_->RunTasks(); | 211 task_runner_->RunTasks(); |
| 219 | 212 |
| 220 // We need to run the task to cleanup the GPU instance. | 213 // We need to run the task to cleanup the GPU instance. |
| 221 video_encoder_.reset(NULL); | 214 video_encoder_.reset(NULL); |
| 222 task_runner_->RunTasks(); | 215 task_runner_->RunTasks(); |
| 223 } | 216 } |
| 224 | 217 |
| 225 } // namespace cast | 218 } // namespace cast |
| 226 } // namespace media | 219 } // namespace media |
| OLD | NEW |