Index: content/renderer/media/rtc_video_decoder_unittest.cc |
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 de9717ad59631a72dc7835bd4be57fc7e41ae678..0000000000000000000000000000000000000000 |
--- a/content/renderer/media/rtc_video_decoder_unittest.cc |
+++ /dev/null |
@@ -1,328 +0,0 @@ |
-// Copyright 2013 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 <stdint.h> |
-#include <string.h> |
- |
-#include "base/bind.h" |
-#include "base/location.h" |
-#include "base/single_thread_task_runner.h" |
-#include "base/synchronization/waitable_event.h" |
-#include "base/threading/thread.h" |
-#include "base/threading/thread_task_runner_handle.h" |
-#include "content/renderer/media/rtc_video_decoder.h" |
-#include "media/base/gmock_callback_support.h" |
-#include "media/renderers/mock_gpu_video_accelerator_factories.h" |
-#include "media/video/mock_video_decode_accelerator.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-#if defined(OS_WIN) |
-#include "base/command_line.h" |
-#include "content/public/common/content_switches.h" |
-#endif // defined(OS_WIN) |
- |
-using ::testing::_; |
-using ::testing::Invoke; |
-using ::testing::Return; |
-using ::testing::SaveArg; |
-using ::testing::Values; |
-using ::testing::WithArgs; |
- |
-namespace content { |
- |
-namespace { |
- |
-static const int kMinResolutionWidth = 16; |
-static const int kMinResolutionHeight = 16; |
-static const int kMaxResolutionWidth = 1920; |
-static const int kMaxResolutionHeight = 1088; |
- |
-} // namespace |
- |
-// TODO(wuchengli): add MockSharedMemory so more functions can be tested. |
-class RTCVideoDecoderTest |
- : public ::testing::TestWithParam<webrtc::VideoCodecType>, |
- webrtc::DecodedImageCallback { |
- public: |
- RTCVideoDecoderTest() |
- : mock_gpu_factories_( |
- new media::MockGpuVideoAcceleratorFactories(nullptr)), |
- vda_thread_("vda_thread"), |
- idle_waiter_(base::WaitableEvent::ResetPolicy::AUTOMATIC, |
- base::WaitableEvent::InitialState::NOT_SIGNALED) { |
- memset(&codec_, 0, sizeof(codec_)); |
- } |
- |
- void SetUp() override { |
- ASSERT_TRUE(vda_thread_.Start()); |
- vda_task_runner_ = vda_thread_.task_runner(); |
- mock_vda_ = new media::MockVideoDecodeAccelerator; |
- |
- media::VideoDecodeAccelerator::SupportedProfile supported_profile; |
- supported_profile.min_resolution.SetSize(kMinResolutionWidth, |
- kMinResolutionHeight); |
- supported_profile.max_resolution.SetSize(kMaxResolutionWidth, |
- kMaxResolutionHeight); |
- supported_profile.profile = media::H264PROFILE_MAIN; |
- capabilities_.supported_profiles.push_back(supported_profile); |
- supported_profile.profile = media::VP8PROFILE_ANY; |
- capabilities_.supported_profiles.push_back(supported_profile); |
- |
- EXPECT_CALL(*mock_gpu_factories_.get(), GetTaskRunner()) |
- .WillRepeatedly(Return(vda_task_runner_)); |
- EXPECT_CALL(*mock_gpu_factories_.get(), |
- GetVideoDecodeAcceleratorCapabilities()) |
- .WillRepeatedly(Return(capabilities_)); |
- EXPECT_CALL(*mock_gpu_factories_.get(), DoCreateVideoDecodeAccelerator()) |
- .WillRepeatedly(Return(mock_vda_)); |
- EXPECT_CALL(*mock_vda_, Initialize(_, _)) |
- .Times(1) |
- .WillRepeatedly(Return(true)); |
- EXPECT_CALL(*mock_vda_, Destroy()).Times(1); |
- |
-#if defined(OS_WIN) |
- base::CommandLine::ForCurrentProcess()->AppendSwitch( |
- switches::kEnableWin7WebRtcHWH264Decoding); |
-#endif // defined(OS_WIN) |
- } |
- |
- void TearDown() override { |
- DVLOG(2) << "TearDown"; |
- EXPECT_TRUE(vda_thread_.IsRunning()); |
- RunUntilIdle(); // Wait until all callbascks complete. |
- vda_task_runner_->DeleteSoon(FROM_HERE, rtc_decoder_.release()); |
- // Make sure the decoder is released before stopping the thread. |
- RunUntilIdle(); |
- vda_thread_.Stop(); |
- } |
- |
- int32_t Decoded(webrtc::VideoFrame& decoded_image) override { |
- DVLOG(2) << "Decoded"; |
- EXPECT_EQ(vda_task_runner_, base::ThreadTaskRunnerHandle::Get()); |
- return WEBRTC_VIDEO_CODEC_OK; |
- } |
- |
- void CreateDecoder(webrtc::VideoCodecType codec_type) { |
- DVLOG(2) << "CreateDecoder"; |
- codec_.codecType = codec_type; |
- rtc_decoder_ = |
- RTCVideoDecoder::Create(codec_type, mock_gpu_factories_.get()); |
- } |
- |
- void Initialize() { |
- DVLOG(2) << "Initialize"; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_decoder_->InitDecode(&codec_, 1)); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
- rtc_decoder_->RegisterDecodeCompleteCallback(this)); |
- } |
- |
- void NotifyResetDone() { |
- DVLOG(2) << "NotifyResetDone"; |
- vda_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::NotifyResetDone, |
- base::Unretained(rtc_decoder_.get()))); |
- } |
- |
- void NotifyError(media::VideoDecodeAccelerator::Error error) { |
- DVLOG(2) << "NotifyError"; |
- vda_task_runner_->PostTask( |
- FROM_HERE, |
- base::Bind(&RTCVideoDecoder::NotifyError, |
- base::Unretained(rtc_decoder_.get()), error)); |
- } |
- |
- void RunUntilIdle() { |
- DVLOG(2) << "RunUntilIdle"; |
- vda_task_runner_->PostTask(FROM_HERE, |
- base::Bind(&base::WaitableEvent::Signal, |
- base::Unretained(&idle_waiter_))); |
- idle_waiter_.Wait(); |
- } |
- |
- void SetUpResetVDA() { |
- mock_vda_after_reset_ = new media::MockVideoDecodeAccelerator; |
- EXPECT_CALL(*mock_gpu_factories_.get(), DoCreateVideoDecodeAccelerator()) |
- .WillRepeatedly(Return(mock_vda_after_reset_)); |
- EXPECT_CALL(*mock_vda_after_reset_, Initialize(_, _)) |
- .Times(1) |
- .WillRepeatedly(Return(true)); |
- EXPECT_CALL(*mock_vda_after_reset_, Destroy()).Times(1); |
- } |
- |
- protected: |
- std::unique_ptr<media::MockGpuVideoAcceleratorFactories> mock_gpu_factories_; |
- media::MockVideoDecodeAccelerator* mock_vda_; |
- media::MockVideoDecodeAccelerator* mock_vda_after_reset_; |
- std::unique_ptr<RTCVideoDecoder> rtc_decoder_; |
- webrtc::VideoCodec codec_; |
- base::Thread vda_thread_; |
- media::VideoDecodeAccelerator::Capabilities capabilities_; |
- |
- private: |
- scoped_refptr<base::SingleThreadTaskRunner> vda_task_runner_; |
- |
- base::Lock lock_; |
- base::WaitableEvent idle_waiter_; |
-}; |
- |
-TEST_F(RTCVideoDecoderTest, CreateReturnsNullOnUnsupportedCodec) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- std::unique_ptr<RTCVideoDecoder> null_rtc_decoder(RTCVideoDecoder::Create( |
- webrtc::kVideoCodecI420, mock_gpu_factories_.get())); |
- EXPECT_EQ(NULL, null_rtc_decoder.get()); |
-} |
- |
-TEST_P(RTCVideoDecoderTest, CreateAndInitSucceeds) { |
- const webrtc::VideoCodecType codec_type = GetParam(); |
- CreateDecoder(codec_type); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_decoder_->InitDecode(&codec_, 1)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, InitDecodeReturnsErrorOnFeedbackMode) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- codec_.codecSpecific.VP8.feedbackModeOn = true; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR, rtc_decoder_->InitDecode(&codec_, 1)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, DecodeReturnsErrorWithoutInitDecode) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- webrtc::EncodedImage input_image; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_UNINITIALIZED, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 0)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, DecodeReturnsErrorOnIncompleteFrame) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- Initialize(); |
- webrtc::EncodedImage input_image; |
- input_image._completeFrame = false; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 0)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, DecodeReturnsErrorOnMissingFrames) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- Initialize(); |
- webrtc::EncodedImage input_image; |
- input_image._completeFrame = true; |
- bool missingFrames = true; |
- EXPECT_EQ( |
- WEBRTC_VIDEO_CODEC_ERROR, |
- rtc_decoder_->Decode(input_image, missingFrames, nullptr, nullptr, 0)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, ReleaseReturnsOk) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- Initialize(); |
- EXPECT_CALL(*mock_vda_, Reset()) |
- .WillOnce(Invoke(this, &RTCVideoDecoderTest::NotifyResetDone)); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_decoder_->Release()); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, InitDecodeAfterRelease) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- EXPECT_CALL(*mock_vda_, Reset()) |
- .WillRepeatedly(Invoke(this, &RTCVideoDecoderTest::NotifyResetDone)); |
- Initialize(); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_decoder_->Release()); |
- Initialize(); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, rtc_decoder_->Release()); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, IsBufferAfterReset) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- EXPECT_TRUE(rtc_decoder_->IsBufferAfterReset(0, RTCVideoDecoder::ID_INVALID)); |
- EXPECT_TRUE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_LAST, |
- RTCVideoDecoder::ID_INVALID)); |
- EXPECT_FALSE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_HALF - 2, |
- RTCVideoDecoder::ID_HALF + 2)); |
- EXPECT_TRUE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_HALF + 2, |
- RTCVideoDecoder::ID_HALF - 2)); |
- |
- EXPECT_FALSE(rtc_decoder_->IsBufferAfterReset(0, 0)); |
- EXPECT_TRUE(rtc_decoder_->IsBufferAfterReset(0, RTCVideoDecoder::ID_LAST)); |
- EXPECT_FALSE( |
- rtc_decoder_->IsBufferAfterReset(0, RTCVideoDecoder::ID_HALF - 2)); |
- EXPECT_TRUE( |
- rtc_decoder_->IsBufferAfterReset(0, RTCVideoDecoder::ID_HALF + 2)); |
- |
- EXPECT_FALSE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_LAST, 0)); |
- EXPECT_FALSE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_LAST, |
- RTCVideoDecoder::ID_HALF - 2)); |
- EXPECT_TRUE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_LAST, |
- RTCVideoDecoder::ID_HALF + 2)); |
- EXPECT_FALSE(rtc_decoder_->IsBufferAfterReset(RTCVideoDecoder::ID_LAST, |
- RTCVideoDecoder::ID_LAST)); |
-} |
- |
-TEST_F(RTCVideoDecoderTest, IsFirstBufferAfterReset) { |
- CreateDecoder(webrtc::kVideoCodecVP8); |
- EXPECT_TRUE( |
- rtc_decoder_->IsFirstBufferAfterReset(0, RTCVideoDecoder::ID_INVALID)); |
- EXPECT_FALSE( |
- rtc_decoder_->IsFirstBufferAfterReset(1, RTCVideoDecoder::ID_INVALID)); |
- EXPECT_FALSE(rtc_decoder_->IsFirstBufferAfterReset(0, 0)); |
- EXPECT_TRUE(rtc_decoder_->IsFirstBufferAfterReset(1, 0)); |
- EXPECT_FALSE(rtc_decoder_->IsFirstBufferAfterReset(2, 0)); |
- |
- EXPECT_FALSE(rtc_decoder_->IsFirstBufferAfterReset(RTCVideoDecoder::ID_HALF, |
- RTCVideoDecoder::ID_HALF)); |
- EXPECT_TRUE(rtc_decoder_->IsFirstBufferAfterReset( |
- RTCVideoDecoder::ID_HALF + 1, RTCVideoDecoder::ID_HALF)); |
- EXPECT_FALSE(rtc_decoder_->IsFirstBufferAfterReset( |
- RTCVideoDecoder::ID_HALF + 2, RTCVideoDecoder::ID_HALF)); |
- |
- EXPECT_FALSE(rtc_decoder_->IsFirstBufferAfterReset(RTCVideoDecoder::ID_LAST, |
- RTCVideoDecoder::ID_LAST)); |
- EXPECT_TRUE( |
- rtc_decoder_->IsFirstBufferAfterReset(0, RTCVideoDecoder::ID_LAST)); |
- EXPECT_FALSE( |
- rtc_decoder_->IsFirstBufferAfterReset(1, RTCVideoDecoder::ID_LAST)); |
-} |
- |
- |
-TEST_P(RTCVideoDecoderTest, GetVDAErrorCounterForTesting) { |
- const webrtc::VideoCodecType codec_type = GetParam(); |
- CreateDecoder(codec_type); |
- Initialize(); |
- |
- webrtc::EncodedImage input_image; |
- input_image._completeFrame = true; |
- input_image._encodedWidth = kMinResolutionWidth; |
- input_image._encodedHeight = kMaxResolutionHeight; |
- input_image._frameType = webrtc::kVideoFrameDelta; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 0)); |
- RunUntilIdle(); |
- |
- // Notify the decoder about a platform error. |
- NotifyError(media::VideoDecodeAccelerator::PLATFORM_FAILURE); |
- RunUntilIdle(); |
- EXPECT_EQ(1, rtc_decoder_->GetVDAErrorCounterForTesting()); |
- |
- // Expect decode call to reset decoder, and set up a new VDA to track it. |
- SetUpResetVDA(); |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 0)); |
- EXPECT_EQ(1, rtc_decoder_->GetVDAErrorCounterForTesting()); |
- |
- // Decoder expects a keyframe after reset, so drops any other frames. |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_ERROR, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 0)); |
- EXPECT_EQ(1, rtc_decoder_->GetVDAErrorCounterForTesting()); |
- |
- // Decoder resets error counter after a successfull decode. |
- input_image._frameType = webrtc::kVideoFrameKey; |
- EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK, |
- rtc_decoder_->Decode(input_image, false, nullptr, nullptr, 10)); |
- EXPECT_EQ(0, rtc_decoder_->GetVDAErrorCounterForTesting()); |
-} |
- |
-INSTANTIATE_TEST_CASE_P(CodecProfiles, |
- RTCVideoDecoderTest, |
- Values(webrtc::kVideoCodecVP8, |
- webrtc::kVideoCodecH264)); |
- |
-} // content |