Reland "Add Profile 2 configuration to VP9 Encoder and Decoder"
This is a reland of fc9c4e88b5569f0d2cd1c64cbc27fd969ce2db17 Original change's description: > Add Profile 2 configuration to VP9 Encoder and Decoder > > Bug: webrtc:9376 > Change-Id: I4f627fb2b6c146a90cfcaa815da459b09dc00003 > Reviewed-on: https://webrtc-review.googlesource.com/81980 > Commit-Queue: Emircan Uysaler <emircan@webrtc.org> > Reviewed-by: Niklas Enbom <niklas.enbom@webrtc.org> > Reviewed-by: Erik Språng <sprang@webrtc.org> > Reviewed-by: Jerome Jiang <jianj@google.com> > Cr-Commit-Position: refs/heads/master@{#23917} Bug: webrtc:9376 Change-Id: I21fc44865af4e381f99dbc5ae2baf4a53ce834ca TBR: niklas.enbom@webrtc.org Reviewed-on: https://webrtc-review.googlesource.com/88341 Commit-Queue: Emircan Uysaler <emircan@webrtc.org> Reviewed-by: Emircan Uysaler <emircan@webrtc.org> Reviewed-by: Erik Språng <sprang@webrtc.org> Cr-Commit-Position: refs/heads/master@{#23974}
This commit is contained in:
committed by
Commit Bot
parent
b2ecc3dc49
commit
cb853c8f90
@ -10,6 +10,7 @@
|
||||
|
||||
#include "api/video/i420_buffer.h"
|
||||
#include "common_video/libyuv/include/webrtc_libyuv.h"
|
||||
#include "media/base/vp9_profile.h"
|
||||
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
|
||||
#include "modules/video_coding/codecs/test/video_codec_unittest.h"
|
||||
#include "modules/video_coding/codecs/vp9/include/vp9.h"
|
||||
@ -460,4 +461,62 @@ TEST_F(TestVp9ImplFrameDropping, PreEncodeFrameDropping) {
|
||||
max_abs_framerate_error_fps);
|
||||
}
|
||||
|
||||
class TestVp9ImplProfile2 : public TestVp9Impl {
|
||||
protected:
|
||||
void SetUp() override {
|
||||
// Profile 2 might not be available on some platforms until
|
||||
// https://bugs.chromium.org/p/webm/issues/detail?id=1544 is solved.
|
||||
bool profile_2_is_supported = false;
|
||||
for (const auto& codec : SupportedVP9Codecs()) {
|
||||
if (ParseSdpForVP9Profile(codec.parameters)
|
||||
.value_or(VP9Profile::kProfile0) == VP9Profile::kProfile2) {
|
||||
profile_2_is_supported = true;
|
||||
}
|
||||
}
|
||||
if (!profile_2_is_supported)
|
||||
return;
|
||||
|
||||
TestVp9Impl::SetUp();
|
||||
input_frame_generator_ = test::FrameGenerator::CreateSquareGenerator(
|
||||
codec_settings_.width, codec_settings_.height,
|
||||
test::FrameGenerator::OutputType::I010, absl::optional<int>());
|
||||
}
|
||||
|
||||
std::unique_ptr<VideoEncoder> CreateEncoder() override {
|
||||
cricket::VideoCodec profile2_codec;
|
||||
profile2_codec.SetParam(kVP9FmtpProfileId,
|
||||
VP9ProfileToString(VP9Profile::kProfile2));
|
||||
return VP9Encoder::Create(profile2_codec);
|
||||
}
|
||||
|
||||
std::unique_ptr<VideoDecoder> CreateDecoder() override {
|
||||
return VP9Decoder::Create();
|
||||
}
|
||||
};
|
||||
|
||||
TEST_F(TestVp9ImplProfile2, EncodeDecode) {
|
||||
if (!encoder_)
|
||||
return;
|
||||
|
||||
VideoFrame* input_frame = NextInputFrame();
|
||||
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
|
||||
encoder_->Encode(*input_frame, nullptr, nullptr));
|
||||
EncodedImage encoded_frame;
|
||||
CodecSpecificInfo codec_specific_info;
|
||||
ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
|
||||
// First frame should be a key frame.
|
||||
encoded_frame._frameType = kVideoFrameKey;
|
||||
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
|
||||
decoder_->Decode(encoded_frame, false, nullptr, 0));
|
||||
std::unique_ptr<VideoFrame> decoded_frame;
|
||||
absl::optional<uint8_t> decoded_qp;
|
||||
ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
|
||||
ASSERT_TRUE(decoded_frame);
|
||||
|
||||
// TODO(emircan): Add PSNR for different color depths.
|
||||
EXPECT_GT(I420PSNR(*input_frame->video_frame_buffer()->ToI420(),
|
||||
*decoded_frame->video_frame_buffer()->ToI420()),
|
||||
31);
|
||||
}
|
||||
|
||||
} // namespace webrtc
|
||||
|
||||
Reference in New Issue
Block a user