| Index: webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc
|
| diff --git a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc
|
| index 89c61cec3af9b84b507c23c27405f96544e420f4..efddb7213d6f47ebe9c730f24f28c2cd1e518b72 100644
|
| --- a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc
|
| +++ b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter_unittest.cc
|
| @@ -118,11 +118,11 @@ class MockVideoEncoder : public VideoEncoder {
|
| return 0;
|
| }
|
|
|
| - int32_t Encode(const VideoFrame& inputImage,
|
| - const CodecSpecificInfo* codecSpecificInfo,
|
| - const std::vector<FrameType>* frame_types) /* override */ {
|
| - return encode_return_value_;
|
| - }
|
| + MOCK_METHOD3(
|
| + Encode,
|
| + int32_t(const VideoFrame& inputImage,
|
| + const CodecSpecificInfo* codecSpecificInfo,
|
| + const std::vector<FrameType>* frame_types) /* override */);
|
|
|
| int32_t RegisterEncodeCompleteCallback(
|
| EncodedImageCallback* callback) /* override */ {
|
| @@ -160,15 +160,10 @@ class MockVideoEncoder : public VideoEncoder {
|
| supports_native_handle_ = enabled;
|
| }
|
|
|
| - void set_encode_return_value(int value) {
|
| - encode_return_value_ = value;
|
| - }
|
| -
|
| MOCK_CONST_METHOD0(ImplementationName, const char*());
|
|
|
| private:
|
| bool supports_native_handle_ = false;
|
| - int encode_return_value_ = WEBRTC_VIDEO_CODEC_OK;
|
| VideoCodec codec_;
|
| EncodedImageCallback* callback_;
|
| };
|
| @@ -452,9 +447,7 @@ TEST_F(TestSimulcastEncoderAdapterFake, SupportsImplementationName) {
|
| }
|
|
|
| TEST_F(TestSimulcastEncoderAdapterFake,
|
| - SupportsNativeHandleDisabledForMultipleStreams) {
|
| - // TODO(pbos): Implement actual test (verify that it works) when implemented
|
| - // for multiple streams.
|
| + SupportsNativeHandleForMultipleStreams) {
|
| TestVp8Simulcast::DefaultSettings(
|
| &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
|
| codec_.numberOfSimulcastStreams = 3;
|
| @@ -463,7 +456,47 @@ TEST_F(TestSimulcastEncoderAdapterFake,
|
| ASSERT_EQ(3u, helper_->factory()->encoders().size());
|
| for (MockVideoEncoder* encoder : helper_->factory()->encoders())
|
| encoder->set_supports_native_handle(true);
|
| + // If one encoder doesn't support it, then overall support is disabled.
|
| + helper_->factory()->encoders()[0]->set_supports_native_handle(false);
|
| EXPECT_FALSE(adapter_->SupportsNativeHandle());
|
| + // Once all do, then the adapter claims support.
|
| + helper_->factory()->encoders()[0]->set_supports_native_handle(true);
|
| + EXPECT_TRUE(adapter_->SupportsNativeHandle());
|
| +}
|
| +
|
| +class FakeNativeHandleBuffer : public NativeHandleBuffer {
|
| + public:
|
| + FakeNativeHandleBuffer(void* native_handle, int width, int height)
|
| + : NativeHandleBuffer(native_handle, width, height) {}
|
| + rtc::scoped_refptr<VideoFrameBuffer> NativeToI420Buffer() override {
|
| + RTC_NOTREACHED();
|
| + return nullptr;
|
| + }
|
| +};
|
| +
|
| +TEST_F(TestSimulcastEncoderAdapterFake,
|
| + NativeHandleForwardingForMultipleStreams) {
|
| + TestVp8Simulcast::DefaultSettings(
|
| + &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
|
| + codec_.numberOfSimulcastStreams = 3;
|
| + // High start bitrate, so all streams are enabled.
|
| + codec_.startBitrate = 3000;
|
| + EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
|
| + adapter_->RegisterEncodeCompleteCallback(this);
|
| + ASSERT_EQ(3u, helper_->factory()->encoders().size());
|
| + for (MockVideoEncoder* encoder : helper_->factory()->encoders())
|
| + encoder->set_supports_native_handle(true);
|
| + EXPECT_TRUE(adapter_->SupportsNativeHandle());
|
| +
|
| + rtc::scoped_refptr<VideoFrameBuffer> buffer(
|
| + new rtc::RefCountedObject<FakeNativeHandleBuffer>(this, 1280, 720));
|
| + VideoFrame input_frame(buffer, 100, 1000, kVideoRotation_180);
|
| + // Expect calls with the given video frame verbatim, since it's a texture
|
| + // frame and can't otherwise be modified/resized.
|
| + for (MockVideoEncoder* encoder : helper_->factory()->encoders())
|
| + EXPECT_CALL(*encoder, Encode(::testing::Ref(input_frame), _, _)).Times(1);
|
| + std::vector<FrameType> frame_types(3, kVideoFrameKey);
|
| + EXPECT_EQ(0, adapter_->Encode(input_frame, NULL, &frame_types));
|
| }
|
|
|
| TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) {
|
| @@ -474,8 +507,8 @@ TEST_F(TestSimulcastEncoderAdapterFake, TestFailureReturnCodesFromEncodeCalls) {
|
| adapter_->RegisterEncodeCompleteCallback(this);
|
| ASSERT_EQ(3u, helper_->factory()->encoders().size());
|
| // Tell the 2nd encoder to request software fallback.
|
| - helper_->factory()->encoders()[1]->set_encode_return_value(
|
| - WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE);
|
| + EXPECT_CALL(*helper_->factory()->encoders()[1], Encode(_, _, _))
|
| + .WillOnce(Return(WEBRTC_VIDEO_CODEC_FALLBACK_SOFTWARE));
|
|
|
| // Send a fake frame and assert the return is software fallback.
|
| VideoFrame input_frame;
|
|
|