Pass SDP video parameters to encoder.
Bug: webrtc:11265 Change-Id: I4f3373793de697e9d89c22ba2d9be4bfe571beea Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/167201 Reviewed-by: Erik Språng <sprang@webrtc.org> Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Cr-Commit-Position: refs/heads/master@{#30359}
This commit is contained in:

committed by
Commit Bot

parent
7aa2edf936
commit
897776e36c
@ -243,7 +243,8 @@ int SimulcastEncoderAdapter::InitEncode(
|
|||||||
RTC_DCHECK_LT(highest_resolution_stream_index, number_of_streams);
|
RTC_DCHECK_LT(highest_resolution_stream_index, number_of_streams);
|
||||||
|
|
||||||
const SdpVideoFormat format(
|
const SdpVideoFormat format(
|
||||||
codec_.codecType == webrtc::kVideoCodecVP8 ? "VP8" : "H264");
|
codec_.codecType == webrtc::kVideoCodecVP8 ? "VP8" : "H264",
|
||||||
|
video_format_.parameters);
|
||||||
|
|
||||||
for (int i = 0; i < number_of_streams; ++i) {
|
for (int i = 0; i < number_of_streams; ++i) {
|
||||||
// If an existing encoder instance exists, reuse it.
|
// If an existing encoder instance exists, reuse it.
|
||||||
|
@ -196,6 +196,7 @@ class MockVideoEncoder : public VideoEncoder {
|
|||||||
explicit MockVideoEncoder(MockVideoEncoderFactory* factory)
|
explicit MockVideoEncoder(MockVideoEncoderFactory* factory)
|
||||||
: factory_(factory),
|
: factory_(factory),
|
||||||
scaling_settings_(VideoEncoder::ScalingSettings::kOff),
|
scaling_settings_(VideoEncoder::ScalingSettings::kOff),
|
||||||
|
video_format_("unknown"),
|
||||||
callback_(nullptr) {}
|
callback_(nullptr) {}
|
||||||
|
|
||||||
MOCK_METHOD1(SetFecControllerOverride,
|
MOCK_METHOD1(SetFecControllerOverride,
|
||||||
@ -298,8 +299,14 @@ class MockVideoEncoder : public VideoEncoder {
|
|||||||
supports_simulcast_ = supports_simulcast;
|
supports_simulcast_ = supports_simulcast;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void set_video_format(const SdpVideoFormat& video_format) {
|
||||||
|
video_format_ = video_format;
|
||||||
|
}
|
||||||
|
|
||||||
bool supports_simulcast() const { return supports_simulcast_; }
|
bool supports_simulcast() const { return supports_simulcast_; }
|
||||||
|
|
||||||
|
SdpVideoFormat video_format() const { return video_format_; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
MockVideoEncoderFactory* const factory_;
|
MockVideoEncoderFactory* const factory_;
|
||||||
bool supports_native_handle_ = false;
|
bool supports_native_handle_ = false;
|
||||||
@ -313,6 +320,7 @@ class MockVideoEncoder : public VideoEncoder {
|
|||||||
VideoEncoder::RateControlParameters last_set_rates_;
|
VideoEncoder::RateControlParameters last_set_rates_;
|
||||||
FramerateFractions fps_allocation_;
|
FramerateFractions fps_allocation_;
|
||||||
bool supports_simulcast_ = false;
|
bool supports_simulcast_ = false;
|
||||||
|
SdpVideoFormat video_format_;
|
||||||
|
|
||||||
VideoCodec codec_;
|
VideoCodec codec_;
|
||||||
EncodedImageCallback* callback_;
|
EncodedImageCallback* callback_;
|
||||||
@ -337,6 +345,7 @@ std::unique_ptr<VideoEncoder> MockVideoEncoderFactory::CreateVideoEncoder(
|
|||||||
encoder->set_requested_resolution_alignment(
|
encoder->set_requested_resolution_alignment(
|
||||||
requested_resolution_alignments_[encoders_.size()]);
|
requested_resolution_alignments_[encoders_.size()]);
|
||||||
encoder->set_supports_simulcast(supports_simulcast_);
|
encoder->set_supports_simulcast(supports_simulcast_);
|
||||||
|
encoder->set_video_format(format);
|
||||||
encoders_.push_back(encoder.get());
|
encoders_.push_back(encoder.get());
|
||||||
return encoder;
|
return encoder;
|
||||||
}
|
}
|
||||||
@ -369,16 +378,19 @@ void MockVideoEncoderFactory::set_init_encode_return_value(int32_t value) {
|
|||||||
|
|
||||||
class TestSimulcastEncoderAdapterFakeHelper {
|
class TestSimulcastEncoderAdapterFakeHelper {
|
||||||
public:
|
public:
|
||||||
explicit TestSimulcastEncoderAdapterFakeHelper(bool use_fallback_factory)
|
explicit TestSimulcastEncoderAdapterFakeHelper(
|
||||||
|
bool use_fallback_factory,
|
||||||
|
const SdpVideoFormat& video_format)
|
||||||
: primary_factory_(new MockVideoEncoderFactory()),
|
: primary_factory_(new MockVideoEncoderFactory()),
|
||||||
fallback_factory_(use_fallback_factory ? new MockVideoEncoderFactory()
|
fallback_factory_(use_fallback_factory ? new MockVideoEncoderFactory()
|
||||||
: nullptr) {}
|
: nullptr),
|
||||||
|
video_format_(video_format) {}
|
||||||
|
|
||||||
// Can only be called once as the SimulcastEncoderAdapter will take the
|
// Can only be called once as the SimulcastEncoderAdapter will take the
|
||||||
// ownership of |factory_|.
|
// ownership of |factory_|.
|
||||||
VideoEncoder* CreateMockEncoderAdapter() {
|
VideoEncoder* CreateMockEncoderAdapter() {
|
||||||
return new SimulcastEncoderAdapter(
|
return new SimulcastEncoderAdapter(primary_factory_.get(),
|
||||||
primary_factory_.get(), fallback_factory_.get(), SdpVideoFormat("VP8"));
|
fallback_factory_.get(), video_format_);
|
||||||
}
|
}
|
||||||
|
|
||||||
MockVideoEncoderFactory* factory() { return primary_factory_.get(); }
|
MockVideoEncoderFactory* factory() { return primary_factory_.get(); }
|
||||||
@ -389,6 +401,7 @@ class TestSimulcastEncoderAdapterFakeHelper {
|
|||||||
private:
|
private:
|
||||||
std::unique_ptr<MockVideoEncoderFactory> primary_factory_;
|
std::unique_ptr<MockVideoEncoderFactory> primary_factory_;
|
||||||
std::unique_ptr<MockVideoEncoderFactory> fallback_factory_;
|
std::unique_ptr<MockVideoEncoderFactory> fallback_factory_;
|
||||||
|
SdpVideoFormat video_format_;
|
||||||
};
|
};
|
||||||
|
|
||||||
static const int kTestTemporalLayerProfile[3] = {3, 2, 1};
|
static const int kTestTemporalLayerProfile[3] = {3, 2, 1};
|
||||||
@ -410,7 +423,7 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test,
|
|||||||
|
|
||||||
void SetUp() override {
|
void SetUp() override {
|
||||||
helper_ = std::make_unique<TestSimulcastEncoderAdapterFakeHelper>(
|
helper_ = std::make_unique<TestSimulcastEncoderAdapterFakeHelper>(
|
||||||
use_fallback_factory_);
|
use_fallback_factory_, SdpVideoFormat("VP8", sdp_video_parameters_));
|
||||||
adapter_.reset(helper_->CreateMockEncoderAdapter());
|
adapter_.reset(helper_->CreateMockEncoderAdapter());
|
||||||
last_encoded_image_width_ = -1;
|
last_encoded_image_width_ = -1;
|
||||||
last_encoded_image_height_ = -1;
|
last_encoded_image_height_ = -1;
|
||||||
@ -528,6 +541,7 @@ class TestSimulcastEncoderAdapterFake : public ::testing::Test,
|
|||||||
int last_encoded_image_simulcast_index_;
|
int last_encoded_image_simulcast_index_;
|
||||||
std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
|
std::unique_ptr<SimulcastRateAllocator> rate_allocator_;
|
||||||
bool use_fallback_factory_;
|
bool use_fallback_factory_;
|
||||||
|
SdpVideoFormat::Parameters sdp_video_parameters_;
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
|
TEST_F(TestSimulcastEncoderAdapterFake, InitEncode) {
|
||||||
@ -1323,6 +1337,16 @@ TEST_F(TestSimulcastEncoderAdapterFake, SupportsSimulcast) {
|
|||||||
EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
|
EXPECT_EQ(0, adapter_->Encode(input_frame, &frame_types));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(TestSimulcastEncoderAdapterFake, PassesSdpVideoFormatToEncoder) {
|
||||||
|
sdp_video_parameters_ = {{"test_param", "test_value"}};
|
||||||
|
SetUp();
|
||||||
|
SetupCodec();
|
||||||
|
std::vector<MockVideoEncoder*> encoders = helper_->factory()->encoders();
|
||||||
|
ASSERT_GT(encoders.size(), 0u);
|
||||||
|
EXPECT_EQ(encoders[0]->video_format(),
|
||||||
|
SdpVideoFormat("VP8", sdp_video_parameters_));
|
||||||
|
}
|
||||||
|
|
||||||
TEST_F(TestSimulcastEncoderAdapterFake, SupportsFallback) {
|
TEST_F(TestSimulcastEncoderAdapterFake, SupportsFallback) {
|
||||||
// Enable support for fallback encoder factory and re-setup.
|
// Enable support for fallback encoder factory and re-setup.
|
||||||
use_fallback_factory_ = true;
|
use_fallback_factory_ = true;
|
||||||
|
Reference in New Issue
Block a user