Add native-handle support for single VP8 streams.

Implements SupportsNativeHandle() in SimulcastEncoderAdapter which works
when there's only a single encoder.

BUG=webrtc:5060
R=stefan@webrtc.org

Review URL: https://codereview.webrtc.org/1397653004

Cr-Commit-Position: refs/heads/master@{#10291}
diff --git a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.cc b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.cc
index 1b59be3..9ac2efa 100644
--- a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.cc
+++ b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.cc
@@ -15,6 +15,7 @@
 // NOTE(ajm): Path provided by gyp.
 #include "libyuv/scale.h"  // NOLINT
 
+#include "webrtc/base/checks.h"
 #include "webrtc/common.h"
 #include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
 
@@ -497,4 +498,13 @@
   return streaminfos_[0].encoder->GetTargetFramerate();
 }
 
+bool SimulcastEncoderAdapter::SupportsNativeHandle() const {
+  // We should not be calling this method before streaminfos_ are configured.
+  RTC_DCHECK(!streaminfos_.empty());
+  // TODO(pbos): Support textures when using more than one encoder.
+  if (streaminfos_.size() != 1)
+    return false;
+  return streaminfos_[0].encoder->SupportsNativeHandle();
+}
+
 }  // namespace webrtc
diff --git a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
index bca1e00..c00d8fb 100644
--- a/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
+++ b/webrtc/modules/video_coding/codecs/vp8/simulcast_encoder_adapter.h
@@ -58,6 +58,7 @@
   void OnDroppedFrame() override;
 
   int GetTargetFramerate() override;
+  bool SupportsNativeHandle() const override;
 
  private:
   struct StreamInfo {
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 7dc75ed..ed6541c 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
@@ -110,33 +110,38 @@
  public:
   int32_t InitEncode(const VideoCodec* codecSettings,
                      int32_t numberOfCores,
-                     size_t maxPayloadSize) {
+                     size_t maxPayloadSize) override {
     codec_ = *codecSettings;
     return 0;
   }
 
   int32_t Encode(const VideoFrame& inputImage,
                  const CodecSpecificInfo* codecSpecificInfo,
-                 const std::vector<VideoFrameType>* frame_types) {
+                 const std::vector<VideoFrameType>* frame_types) override {
     return 0;
   }
 
-  int32_t RegisterEncodeCompleteCallback(EncodedImageCallback* callback) {
+  int32_t RegisterEncodeCompleteCallback(
+      EncodedImageCallback* callback) override {
     callback_ = callback;
     return 0;
   }
 
-  int32_t Release() {
+  int32_t Release() override {
     return 0;
   }
 
-  int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) {
+  int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override {
     return 0;
   }
 
   MOCK_METHOD2(SetChannelParameters,
       int32_t(uint32_t packetLoss, int64_t rtt));
 
+  bool SupportsNativeHandle() const override {
+    return supports_native_handle_;
+  }
+
   virtual ~MockVideoEncoder() {
   }
 
@@ -152,7 +157,12 @@
     callback_->Encoded(image, &codecSpecificInfo, NULL);
   }
 
+  void set_supports_native_handle(bool enabled) {
+    supports_native_handle_ = enabled;
+  }
+
  private:
+  bool supports_native_handle_ = false;
   VideoCodec codec_;
   EncodedImageCallback* callback_;
 };
@@ -382,5 +392,33 @@
   EXPECT_EQ(2, simulcast_index);
 }
 
+TEST_F(TestSimulcastEncoderAdapterFake, SupportsNativeHandleForSingleStreams) {
+  TestVp8Simulcast::DefaultSettings(
+      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
+  codec_.numberOfSimulcastStreams = 1;
+  EXPECT_EQ(0, adapter_->InitEncode(&codec_, 1, 1200));
+  adapter_->RegisterEncodeCompleteCallback(this);
+  ASSERT_EQ(1u, helper_->factory()->encoders().size());
+  helper_->factory()->encoders()[0]->set_supports_native_handle(true);
+  EXPECT_TRUE(adapter_->SupportsNativeHandle());
+  helper_->factory()->encoders()[0]->set_supports_native_handle(false);
+  EXPECT_FALSE(adapter_->SupportsNativeHandle());
+}
+
+TEST_F(TestSimulcastEncoderAdapterFake,
+       SupportsNativeHandleDisabledForMultipleStreams) {
+  // TODO(pbos): Implement actual test (verify that it works) when implemented
+  // for multiple streams.
+  TestVp8Simulcast::DefaultSettings(
+      &codec_, static_cast<const int*>(kTestTemporalLayerProfile));
+  codec_.numberOfSimulcastStreams = 3;
+  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_FALSE(adapter_->SupportsNativeHandle());
+}
+
 }  // namespace testing
 }  // namespace webrtc