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}
This commit is contained in:
pbos
2015-10-15 10:52:15 -07:00
committed by Commit bot
parent 4af0f1a098
commit 65e15bafaa
3 changed files with 54 additions and 5 deletions

View File

@ -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 @@ int SimulcastEncoderAdapter::GetTargetFramerate() {
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

View File

@ -58,6 +58,7 @@ class SimulcastEncoderAdapter : public VP8Encoder {
void OnDroppedFrame() override;
int GetTargetFramerate() override;
bool SupportsNativeHandle() const override;
private:
struct StreamInfo {

View File

@ -110,33 +110,38 @@ class MockVideoEncoder : public VideoEncoder {
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 @@ class MockVideoEncoder : public VideoEncoder {
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 @@ TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) {
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