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:
@ -15,6 +15,7 @@
|
|||||||
// NOTE(ajm): Path provided by gyp.
|
// NOTE(ajm): Path provided by gyp.
|
||||||
#include "libyuv/scale.h" // NOLINT
|
#include "libyuv/scale.h" // NOLINT
|
||||||
|
|
||||||
|
#include "webrtc/base/checks.h"
|
||||||
#include "webrtc/common.h"
|
#include "webrtc/common.h"
|
||||||
#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
|
#include "webrtc/modules/video_coding/codecs/vp8/screenshare_layers.h"
|
||||||
|
|
||||||
@ -497,4 +498,13 @@ int SimulcastEncoderAdapter::GetTargetFramerate() {
|
|||||||
return streaminfos_[0].encoder->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
|
} // namespace webrtc
|
||||||
|
@ -58,6 +58,7 @@ class SimulcastEncoderAdapter : public VP8Encoder {
|
|||||||
void OnDroppedFrame() override;
|
void OnDroppedFrame() override;
|
||||||
|
|
||||||
int GetTargetFramerate() override;
|
int GetTargetFramerate() override;
|
||||||
|
bool SupportsNativeHandle() const override;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
struct StreamInfo {
|
struct StreamInfo {
|
||||||
|
@ -110,33 +110,38 @@ class MockVideoEncoder : public VideoEncoder {
|
|||||||
public:
|
public:
|
||||||
int32_t InitEncode(const VideoCodec* codecSettings,
|
int32_t InitEncode(const VideoCodec* codecSettings,
|
||||||
int32_t numberOfCores,
|
int32_t numberOfCores,
|
||||||
size_t maxPayloadSize) {
|
size_t maxPayloadSize) override {
|
||||||
codec_ = *codecSettings;
|
codec_ = *codecSettings;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Encode(const VideoFrame& inputImage,
|
int32_t Encode(const VideoFrame& inputImage,
|
||||||
const CodecSpecificInfo* codecSpecificInfo,
|
const CodecSpecificInfo* codecSpecificInfo,
|
||||||
const std::vector<VideoFrameType>* frame_types) {
|
const std::vector<VideoFrameType>* frame_types) override {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t RegisterEncodeCompleteCallback(EncodedImageCallback* callback) {
|
int32_t RegisterEncodeCompleteCallback(
|
||||||
|
EncodedImageCallback* callback) override {
|
||||||
callback_ = callback;
|
callback_ = callback;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t Release() {
|
int32_t Release() override {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) {
|
int32_t SetRates(uint32_t newBitRate, uint32_t frameRate) override {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
MOCK_METHOD2(SetChannelParameters,
|
MOCK_METHOD2(SetChannelParameters,
|
||||||
int32_t(uint32_t packetLoss, int64_t rtt));
|
int32_t(uint32_t packetLoss, int64_t rtt));
|
||||||
|
|
||||||
|
bool SupportsNativeHandle() const override {
|
||||||
|
return supports_native_handle_;
|
||||||
|
}
|
||||||
|
|
||||||
virtual ~MockVideoEncoder() {
|
virtual ~MockVideoEncoder() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -152,7 +157,12 @@ class MockVideoEncoder : public VideoEncoder {
|
|||||||
callback_->Encoded(image, &codecSpecificInfo, NULL);
|
callback_->Encoded(image, &codecSpecificInfo, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_supports_native_handle(bool enabled) {
|
||||||
|
supports_native_handle_ = enabled;
|
||||||
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
bool supports_native_handle_ = false;
|
||||||
VideoCodec codec_;
|
VideoCodec codec_;
|
||||||
EncodedImageCallback* callback_;
|
EncodedImageCallback* callback_;
|
||||||
};
|
};
|
||||||
@ -382,5 +392,33 @@ TEST_F(TestSimulcastEncoderAdapterFake, EncodedCallbackForDifferentEncoders) {
|
|||||||
EXPECT_EQ(2, simulcast_index);
|
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 testing
|
||||||
} // namespace webrtc
|
} // namespace webrtc
|
||||||
|
Reference in New Issue
Block a user