Explicitly set encoder and decoder format in codec tests.
This allows to differentiate and test codecs of the same type but different implementations/settings. Bug: none Change-Id: I74f799b36411e63387513133ffc19a7f0c45d550 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/238165 Commit-Queue: Sergey Silkin <ssilkin@webrtc.org> Reviewed-by: Artem Titov <titovartem@webrtc.org> Reviewed-by: Åsa Persson <asapersson@webrtc.org> Cr-Commit-Position: refs/heads/main@{#35396}
This commit is contained in:

committed by
WebRTC LUCI CQ

parent
8498b7e7f6
commit
984cf9b837
@ -128,6 +128,14 @@ class VideoCodecTestFixture {
|
||||
// Name of the codec being tested.
|
||||
std::string codec_name;
|
||||
|
||||
// Encoder and decoder format and parameters. If provided, format is used to
|
||||
// instantiate the codec. If not provided, the test creates and uses the
|
||||
// default `SdpVideoFormat` based on `codec_name`.
|
||||
// Encoder and decoder name (`SdpVideoFormat::name`) should be the same as
|
||||
// `codec_name`.
|
||||
absl::optional<SdpVideoFormat> encoder_format;
|
||||
absl::optional<SdpVideoFormat> decoder_format;
|
||||
|
||||
// H.264 specific settings.
|
||||
struct H264CodecSettings {
|
||||
H264Profile profile = H264Profile::kProfileConstrainedBaseline;
|
||||
|
@ -150,6 +150,26 @@ std::string FilenameWithParams(
|
||||
std::to_string(config.codec_settings.startBitrate);
|
||||
}
|
||||
|
||||
SdpVideoFormat CreateSdpVideoFormat(
|
||||
const VideoCodecTestFixtureImpl::Config& config) {
|
||||
if (config.codec_settings.codecType == kVideoCodecH264) {
|
||||
const char* packetization_mode =
|
||||
config.h264_codec_settings.packetization_mode ==
|
||||
H264PacketizationMode::NonInterleaved
|
||||
? "1"
|
||||
: "0";
|
||||
SdpVideoFormat::Parameters codec_params = {
|
||||
{cricket::kH264FmtpProfileLevelId,
|
||||
*H264ProfileLevelIdToString(H264ProfileLevelId(
|
||||
config.h264_codec_settings.profile, H264Level::kLevel3_1))},
|
||||
{cricket::kH264FmtpPacketizationMode, packetization_mode}};
|
||||
|
||||
return SdpVideoFormat(config.codec_name, codec_params);
|
||||
}
|
||||
|
||||
return SdpVideoFormat(config.codec_name);
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
VideoCodecTestFixtureImpl::Config::Config() = default;
|
||||
@ -611,23 +631,21 @@ void VideoCodecTestFixtureImpl::VerifyVideoStatistic(
|
||||
}
|
||||
|
||||
bool VideoCodecTestFixtureImpl::CreateEncoderAndDecoder() {
|
||||
SdpVideoFormat::Parameters params;
|
||||
if (config_.codec_settings.codecType == kVideoCodecH264) {
|
||||
const char* packetization_mode =
|
||||
config_.h264_codec_settings.packetization_mode ==
|
||||
H264PacketizationMode::NonInterleaved
|
||||
? "1"
|
||||
: "0";
|
||||
params = {{cricket::kH264FmtpProfileLevelId,
|
||||
*H264ProfileLevelIdToString(H264ProfileLevelId(
|
||||
config_.h264_codec_settings.profile, H264Level::kLevel3_1))},
|
||||
{cricket::kH264FmtpPacketizationMode, packetization_mode}};
|
||||
} else {
|
||||
params = {};
|
||||
}
|
||||
SdpVideoFormat format(config_.codec_name, params);
|
||||
SdpVideoFormat encoder_format(CreateSdpVideoFormat(config_));
|
||||
SdpVideoFormat decoder_format = encoder_format;
|
||||
|
||||
encoder_ = encoder_factory_->CreateVideoEncoder(format);
|
||||
// Override encoder and decoder formats with explicitly provided ones.
|
||||
if (config_.encoder_format) {
|
||||
RTC_DCHECK_EQ(config_.encoder_format->name, config_.codec_name);
|
||||
encoder_format = *config_.encoder_format;
|
||||
}
|
||||
|
||||
if (config_.decoder_format) {
|
||||
RTC_DCHECK_EQ(config_.decoder_format->name, config_.codec_name);
|
||||
decoder_format = *config_.decoder_format;
|
||||
}
|
||||
|
||||
encoder_ = encoder_factory_->CreateVideoEncoder(encoder_format);
|
||||
EXPECT_TRUE(encoder_) << "Encoder not successfully created.";
|
||||
if (encoder_ == nullptr) {
|
||||
return false;
|
||||
@ -636,15 +654,13 @@ bool VideoCodecTestFixtureImpl::CreateEncoderAndDecoder() {
|
||||
const size_t num_simulcast_or_spatial_layers = std::max(
|
||||
config_.NumberOfSimulcastStreams(), config_.NumberOfSpatialLayers());
|
||||
for (size_t i = 0; i < num_simulcast_or_spatial_layers; ++i) {
|
||||
decoders_.push_back(std::unique_ptr<VideoDecoder>(
|
||||
decoder_factory_->CreateVideoDecoder(format)));
|
||||
}
|
||||
|
||||
for (const auto& decoder : decoders_) {
|
||||
std::unique_ptr<VideoDecoder> decoder =
|
||||
decoder_factory_->CreateVideoDecoder(decoder_format);
|
||||
EXPECT_TRUE(decoder) << "Decoder not successfully created.";
|
||||
if (decoder == nullptr) {
|
||||
return false;
|
||||
}
|
||||
decoders_.push_back(std::move(decoder));
|
||||
}
|
||||
|
||||
return true;
|
||||
|
Reference in New Issue
Block a user