Move HdrMetadata to ColorSpace

Move HdrMetadata to ColorSpace as part of preparing for joint transmission
of these two objects.

Bug: webrtc:8651
Change-Id: Ie948011a2c0106d5967cb5ef3b9565217e798272
Reviewed-on: https://webrtc-review.googlesource.com/c/111481
Commit-Queue: Johannes Kron <kron@webrtc.org>
Reviewed-by: Niels Moller <nisse@webrtc.org>
Reviewed-by: Åsa Persson <asapersson@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#25730}
This commit is contained in:
Johannes Kron
2018-11-21 10:18:18 +01:00
committed by Commit Bot
parent ecf6315a7f
commit 4749e4e221
9 changed files with 104 additions and 59 deletions

View File

@ -56,7 +56,7 @@ TEST_F(TestH264Impl, MAYBE_EncodeDecode) {
ASSERT_TRUE(decoded_frame);
EXPECT_GT(I420PSNR(input_frame, decoded_frame.get()), 36);
const ColorSpace color_space = decoded_frame->color_space().value();
const ColorSpace color_space = *decoded_frame->color_space();
EXPECT_EQ(ColorSpace::PrimaryID::kInvalid, color_space.primaries());
EXPECT_EQ(ColorSpace::TransferID::kInvalid, color_space.transfer());
EXPECT_EQ(ColorSpace::MatrixID::kInvalid, color_space.matrix());

View File

@ -105,7 +105,7 @@ class TestVp9Impl : public VideoCodecUnitTest {
}
}
HdrMetadata CreateTestHdrMetadata() {
HdrMetadata CreateTestHdrMetadata() const {
// Random but reasonable HDR metadata.
HdrMetadata hdr_metadata;
hdr_metadata.mastering_metadata.luminance_max = 2000.0;
@ -122,6 +122,15 @@ class TestVp9Impl : public VideoCodecUnitTest {
hdr_metadata.max_frame_average_light_level = 1789;
return hdr_metadata;
}
ColorSpace CreateTestColorSpace() const {
HdrMetadata hdr_metadata = CreateTestHdrMetadata();
ColorSpace color_space(ColorSpace::PrimaryID::kBT709,
ColorSpace::TransferID::kGAMMA22,
ColorSpace::MatrixID::kSMPTE2085,
ColorSpace::RangeID::kFull, &hdr_metadata);
return color_space;
}
};
// Disabled on ios as flake, see https://crbug.com/webrtc/7057
@ -146,7 +155,7 @@ TEST_F(TestVp9Impl, EncodeDecode) {
ASSERT_TRUE(decoded_frame);
EXPECT_GT(I420PSNR(input_frame, decoded_frame.get()), 36);
const ColorSpace color_space = decoded_frame->color_space().value();
const ColorSpace color_space = *decoded_frame->color_space();
EXPECT_EQ(ColorSpace::PrimaryID::kInvalid, color_space.primaries());
EXPECT_EQ(ColorSpace::TransferID::kInvalid, color_space.transfer());
EXPECT_EQ(ColorSpace::MatrixID::kInvalid, color_space.matrix());
@ -175,28 +184,28 @@ TEST_F(TestVp9Impl, EncodedRotationEqualsInputRotation) {
EXPECT_EQ(kVideoRotation_90, encoded_frame.rotation_);
}
TEST_F(TestVp9Impl, EncodedHdrMetadataEqualsInputHdrMetadata) {
// Video frame without HDR metadata.
TEST_F(TestVp9Impl, EncodedColorSpaceEqualsInputColorSpace) {
// Video frame without explicit color space information.
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));
EXPECT_FALSE(encoded_frame.HdrMetadata());
EXPECT_FALSE(encoded_frame.ColorSpace());
// Video frame with HDR metadata.
HdrMetadata hdr_metadata = CreateTestHdrMetadata();
// Video frame with explicit color space information.
ColorSpace color_space = CreateTestColorSpace();
VideoFrame input_frame_w_hdr =
VideoFrame::Builder()
.set_video_frame_buffer(input_frame->video_frame_buffer())
.set_hdr_metadata(&hdr_metadata)
.set_color_space(&color_space)
.build();
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
encoder_->Encode(input_frame_w_hdr, nullptr, nullptr));
ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
EXPECT_TRUE(encoded_frame.HdrMetadata());
EXPECT_EQ(hdr_metadata, *encoded_frame.HdrMetadata());
ASSERT_TRUE(encoded_frame.ColorSpace());
EXPECT_EQ(*encoded_frame.ColorSpace(), color_space);
}
TEST_F(TestVp9Impl, DecodedHdrMetadataEqualsEncodedHdrMetadata) {
@ -206,24 +215,27 @@ TEST_F(TestVp9Impl, DecodedHdrMetadataEqualsEncodedHdrMetadata) {
CodecSpecificInfo codec_specific_info;
ASSERT_TRUE(WaitForEncodedFrame(&encoded_frame, &codec_specific_info));
// Encoded frame without HDR metadata.
// Encoded frame without explicit color space information.
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);
EXPECT_FALSE(decoded_frame->hdr_metadata());
// Color space present from encoded bitstream.
ASSERT_TRUE(decoded_frame->color_space());
// No HDR metadata present.
EXPECT_FALSE(decoded_frame->color_space()->hdr_metadata());
// Encoded frame with HDR metadata.
HdrMetadata hdr_metadata = CreateTestHdrMetadata();
encoded_frame.SetHdrMetadata(&hdr_metadata);
// Encoded frame with explicit color space information.
ColorSpace color_space = CreateTestColorSpace();
encoded_frame.SetColorSpace(&color_space);
EXPECT_EQ(WEBRTC_VIDEO_CODEC_OK,
decoder_->Decode(encoded_frame, false, nullptr, 0));
ASSERT_TRUE(WaitForDecodedFrame(&decoded_frame, &decoded_qp));
ASSERT_TRUE(decoded_frame);
ASSERT_TRUE(decoded_frame->hdr_metadata());
EXPECT_EQ(hdr_metadata, *decoded_frame->hdr_metadata());
ASSERT_TRUE(decoded_frame->color_space());
EXPECT_EQ(color_space, *decoded_frame->color_space());
}
TEST_F(TestVp9Impl, DecodedQpEqualsEncodedQp) {

View File

@ -1199,7 +1199,7 @@ int VP9EncoderImpl::GetEncodedLayerFrame(const vpx_codec_cx_pkt* pkt) {
int qp = -1;
vpx_codec_control(encoder_, VP8E_GET_LAST_QUANTIZER, &qp);
encoded_image_.qp_ = qp;
encoded_image_.SetHdrMetadata(input_image_->hdr_metadata());
encoded_image_.SetColorSpace(input_image_->color_space());
return WEBRTC_VIDEO_CODEC_OK;
}
@ -1339,7 +1339,7 @@ int VP9DecoderImpl::Decode(const EncodedImage& input_image,
vpx_codec_control(decoder_, VPXD_GET_LAST_QUANTIZER, &qp);
RTC_DCHECK_EQ(vpx_ret, VPX_CODEC_OK);
int ret = ReturnFrame(img, input_image.Timestamp(), input_image.ntp_time_ms_,
qp, input_image.HdrMetadata());
qp, input_image.ColorSpace());
if (ret != 0) {
return ret;
}
@ -1350,7 +1350,7 @@ int VP9DecoderImpl::ReturnFrame(const vpx_image_t* img,
uint32_t timestamp,
int64_t ntp_time_ms,
int qp,
const HdrMetadata* hdr_metadata) {
const ColorSpace* explicit_color_space) {
if (img == nullptr) {
// Decoder OK and nullptr image => No show frame.
return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
@ -1392,16 +1392,21 @@ int VP9DecoderImpl::ReturnFrame(const vpx_image_t* img,
return WEBRTC_VIDEO_CODEC_NO_OUTPUT;
}
VideoFrame decoded_image = VideoFrame::Builder()
.set_video_frame_buffer(img_wrapped_buffer)
.set_timestamp_ms(0)
.set_timestamp_rtp(timestamp)
.set_ntp_time_ms(ntp_time_ms)
.set_rotation(webrtc::kVideoRotation_0)
.set_color_space(ExtractVP9ColorSpace(
img->cs, img->range, img->bit_depth))
.set_hdr_metadata(hdr_metadata)
.build();
auto builder = VideoFrame::Builder()
.set_video_frame_buffer(img_wrapped_buffer)
.set_timestamp_ms(0)
.set_timestamp_rtp(timestamp)
.set_ntp_time_ms(ntp_time_ms)
.set_rotation(webrtc::kVideoRotation_0);
if (explicit_color_space) {
builder.set_color_space(explicit_color_space);
} else {
builder.set_color_space(
ExtractVP9ColorSpace(img->cs, img->range, img->bit_depth));
}
VideoFrame decoded_image = builder.build();
decode_complete_callback_->Decoded(decoded_image, absl::nullopt, qp);
return WEBRTC_VIDEO_CODEC_OK;
}

View File

@ -170,7 +170,7 @@ class VP9DecoderImpl : public VP9Decoder {
uint32_t timestamp,
int64_t ntp_time_ms,
int qp,
const HdrMetadata* hdr_metadata);
const ColorSpace* explicit_color_space);
// Memory pool used to share buffers between libvpx and webrtc.
Vp9FrameBufferPool frame_buffer_pool_;