summaryrefslogtreecommitdiff
path: root/chromium/third_party/webrtc/api/video
diff options
context:
space:
mode:
authorAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-12 14:27:29 +0200
committerAllan Sandfeld Jensen <allan.jensen@qt.io>2020-10-13 09:35:20 +0000
commitc30a6232df03e1efbd9f3b226777b07e087a1122 (patch)
treee992f45784689f373bcc38d1b79a239ebe17ee23 /chromium/third_party/webrtc/api/video
parent7b5b123ac58f58ffde0f4f6e488bcd09aa4decd3 (diff)
downloadqtwebengine-chromium-85-based.tar.gz
BASELINE: Update Chromium to 85.0.4183.14085-based
Change-Id: Iaa42f4680837c57725b1344f108c0196741f6057 Reviewed-by: Allan Sandfeld Jensen <allan.jensen@qt.io>
Diffstat (limited to 'chromium/third_party/webrtc/api/video')
-rw-r--r--chromium/third_party/webrtc/api/video/BUILD.gn44
-rw-r--r--chromium/third_party/webrtc/api/video/OWNERS1
-rw-r--r--chromium/third_party/webrtc/api/video/test/BUILD.gn2
-rw-r--r--chromium/third_party/webrtc/api/video/test/mock_recordable_encoded_frame.h19
-rw-r--r--chromium/third_party/webrtc/api/video/video_adaptation_counters.cc9
-rw-r--r--chromium/third_party/webrtc/api/video/video_adaptation_counters.h4
-rw-r--r--chromium/third_party/webrtc/api/video/video_frame_marking.h29
-rw-r--r--chromium/third_party/webrtc/api/video/video_frame_metadata.cc28
-rw-r--r--chromium/third_party/webrtc/api/video/video_frame_metadata.h59
-rw-r--r--chromium/third_party/webrtc/api/video/video_frame_metadata_unittest.cc120
-rw-r--r--chromium/third_party/webrtc/api/video/video_stream_encoder_interface.h11
11 files changed, 280 insertions, 46 deletions
diff --git a/chromium/third_party/webrtc/api/video/BUILD.gn b/chromium/third_party/webrtc/api/video/BUILD.gn
index 290c2f2abba..ee7e51d4c42 100644
--- a/chromium/third_party/webrtc/api/video/BUILD.gn
+++ b/chromium/third_party/webrtc/api/video/BUILD.gn
@@ -21,7 +21,6 @@ rtc_library("video_rtp_headers") {
"hdr_metadata.h",
"video_content_type.cc",
"video_content_type.h",
- "video_frame_marking.h",
"video_rotation.h",
"video_timing.cc",
"video_timing.h",
@@ -31,8 +30,8 @@ rtc_library("video_rtp_headers") {
"..:array_view",
"../../rtc_base:rtc_base_approved",
"../../rtc_base/system:rtc_export",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_library("video_frame") {
@@ -56,8 +55,8 @@ rtc_library("video_frame") {
"../../rtc_base:checks",
"../../rtc_base:rtc_base_approved",
"../../rtc_base/system:rtc_export",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
if (is_android) {
@@ -141,8 +140,8 @@ rtc_library("encoded_image") {
"../../rtc_base:deprecation",
"../../rtc_base:rtc_base_approved",
"../../rtc_base/system:rtc_export",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_library("encoded_frame") {
@@ -173,8 +172,8 @@ rtc_library("video_bitrate_allocation") {
"../../rtc_base:safe_conversions",
"../../rtc_base:stringutils",
"../../rtc_base/system:rtc_export",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_library("video_bitrate_allocator") {
@@ -209,8 +208,8 @@ rtc_source_set("video_stream_decoder") {
"../task_queue",
"../units:time_delta",
"../video_codecs:video_codecs_api",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_library("video_stream_decoder_create") {
@@ -237,7 +236,10 @@ rtc_library("video_adaptation") {
"video_adaptation_reason.h",
]
- deps = [ "../../rtc_base:checks" ]
+ deps = [
+ "../../rtc_base:checks",
+ "../../rtc_base:stringutils",
+ ]
}
rtc_source_set("video_stream_encoder") {
@@ -256,10 +258,29 @@ rtc_source_set("video_stream_encoder") {
":video_codec_constants",
":video_frame",
"..:rtp_parameters",
+ "..:scoped_refptr",
"../:fec_controller_api",
"../:rtp_parameters",
+ "../adaptation:resource_adaptation_api",
"../units:data_rate",
"../video_codecs:video_codecs_api",
+ ]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
+}
+
+rtc_source_set("video_frame_metadata") {
+ visibility = [ "*" ]
+ sources = [
+ "video_frame_metadata.cc",
+ "video_frame_metadata.h",
+ ]
+ deps = [
+ "..:array_view",
+ "../../modules/rtp_rtcp:rtp_video_header",
+ "../transport/rtp:dependency_descriptor",
+ ]
+ absl_deps = [
+ "//third_party/abseil-cpp/absl/container:inlined_vector",
"//third_party/abseil-cpp/absl/types:optional",
]
}
@@ -299,16 +320,21 @@ rtc_library("builtin_video_bitrate_allocator_factory") {
"../../modules/video_coding:video_coding_utility",
"../../modules/video_coding:webrtc_vp9_helpers",
"../video_codecs:video_codecs_api",
- "//third_party/abseil-cpp/absl/base:core_headers",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/base:core_headers" ]
}
if (rtc_include_tests) {
rtc_library("video_unittests") {
testonly = true
- sources = [ "video_stream_decoder_create_unittest.cc" ]
+ sources = [
+ "video_frame_metadata_unittest.cc",
+ "video_stream_decoder_create_unittest.cc",
+ ]
deps = [
+ ":video_frame_metadata",
":video_stream_decoder_create",
+ "../../modules/rtp_rtcp:rtp_video_header",
"../../test:test_support",
"../task_queue:default_task_queue_factory",
"../video_codecs:builtin_video_decoder_factory",
diff --git a/chromium/third_party/webrtc/api/video/OWNERS b/chromium/third_party/webrtc/api/video/OWNERS
index 315f85e7d00..e4a16c360a1 100644
--- a/chromium/third_party/webrtc/api/video/OWNERS
+++ b/chromium/third_party/webrtc/api/video/OWNERS
@@ -1,3 +1,4 @@
+brandtr@webrtc.org
magjed@webrtc.org
nisse@webrtc.org
diff --git a/chromium/third_party/webrtc/api/video/test/BUILD.gn b/chromium/third_party/webrtc/api/video/test/BUILD.gn
index 5f697a081c8..5633371102b 100644
--- a/chromium/third_party/webrtc/api/video/test/BUILD.gn
+++ b/chromium/third_party/webrtc/api/video/test/BUILD.gn
@@ -21,8 +21,8 @@ rtc_library("rtc_api_video_unittests") {
"..:video_frame",
"..:video_rtp_headers",
"../../../test:test_support",
- "//third_party/abseil-cpp/absl/types:optional",
]
+ absl_deps = [ "//third_party/abseil-cpp/absl/types:optional" ]
}
rtc_source_set("mock_recordable_encoded_frame") {
diff --git a/chromium/third_party/webrtc/api/video/test/mock_recordable_encoded_frame.h b/chromium/third_party/webrtc/api/video/test/mock_recordable_encoded_frame.h
index 1788a493c6d..2178932d2a6 100644
--- a/chromium/third_party/webrtc/api/video/test/mock_recordable_encoded_frame.h
+++ b/chromium/third_party/webrtc/api/video/test/mock_recordable_encoded_frame.h
@@ -17,13 +17,18 @@
namespace webrtc {
class MockRecordableEncodedFrame : public RecordableEncodedFrame {
public:
- MOCK_CONST_METHOD0(encoded_buffer,
- rtc::scoped_refptr<const EncodedImageBufferInterface>());
- MOCK_CONST_METHOD0(color_space, absl::optional<webrtc::ColorSpace>());
- MOCK_CONST_METHOD0(codec, VideoCodecType());
- MOCK_CONST_METHOD0(is_key_frame, bool());
- MOCK_CONST_METHOD0(resolution, EncodedResolution());
- MOCK_CONST_METHOD0(render_time, Timestamp());
+ MOCK_METHOD(rtc::scoped_refptr<const EncodedImageBufferInterface>,
+ encoded_buffer,
+ (),
+ (const, override));
+ MOCK_METHOD(absl::optional<webrtc::ColorSpace>,
+ color_space,
+ (),
+ (const, override));
+ MOCK_METHOD(VideoCodecType, codec, (), (const, override));
+ MOCK_METHOD(bool, is_key_frame, (), (const, override));
+ MOCK_METHOD(EncodedResolution, resolution, (), (const, override));
+ MOCK_METHOD(Timestamp, render_time, (), (const, override));
};
} // namespace webrtc
#endif // API_VIDEO_TEST_MOCK_RECORDABLE_ENCODED_FRAME_H_
diff --git a/chromium/third_party/webrtc/api/video/video_adaptation_counters.cc b/chromium/third_party/webrtc/api/video/video_adaptation_counters.cc
index 25e0bee1ff8..df1769d5d46 100644
--- a/chromium/third_party/webrtc/api/video/video_adaptation_counters.cc
+++ b/chromium/third_party/webrtc/api/video/video_adaptation_counters.cc
@@ -10,6 +10,8 @@
#include "api/video/video_adaptation_counters.h"
+#include "rtc_base/strings/string_builder.h"
+
namespace webrtc {
bool VideoAdaptationCounters::operator==(
@@ -30,4 +32,11 @@ VideoAdaptationCounters VideoAdaptationCounters::operator+(
fps_adaptations + other.fps_adaptations);
}
+std::string VideoAdaptationCounters::ToString() const {
+ rtc::StringBuilder ss;
+ ss << "{ res=" << resolution_adaptations << " fps=" << fps_adaptations
+ << " }";
+ return ss.Release();
+}
+
} // namespace webrtc
diff --git a/chromium/third_party/webrtc/api/video/video_adaptation_counters.h b/chromium/third_party/webrtc/api/video/video_adaptation_counters.h
index eff0baaa21f..2dea902f2f1 100644
--- a/chromium/third_party/webrtc/api/video/video_adaptation_counters.h
+++ b/chromium/third_party/webrtc/api/video/video_adaptation_counters.h
@@ -11,6 +11,8 @@
#ifndef API_VIDEO_VIDEO_ADAPTATION_COUNTERS_H_
#define API_VIDEO_VIDEO_ADAPTATION_COUNTERS_H_
+#include <string>
+
#include "rtc_base/checks.h"
namespace webrtc {
@@ -33,6 +35,8 @@ struct VideoAdaptationCounters {
VideoAdaptationCounters operator+(const VideoAdaptationCounters& other) const;
+ std::string ToString() const;
+
int resolution_adaptations;
int fps_adaptations;
};
diff --git a/chromium/third_party/webrtc/api/video/video_frame_marking.h b/chromium/third_party/webrtc/api/video/video_frame_marking.h
deleted file mode 100644
index 2a34852f1d6..00000000000
--- a/chromium/third_party/webrtc/api/video/video_frame_marking.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (c) 2018 The WebRTC project authors. All Rights Reserved.
- *
- * Use of this source code is governed by a BSD-style license
- * that can be found in the LICENSE file in the root of the source
- * tree. An additional intellectual property rights grant can be found
- * in the file PATENTS. All contributing project authors may
- * be found in the AUTHORS file in the root of the source tree.
- */
-
-#ifndef API_VIDEO_VIDEO_FRAME_MARKING_H_
-#define API_VIDEO_VIDEO_FRAME_MARKING_H_
-
-namespace webrtc {
-
-struct FrameMarking {
- bool start_of_frame;
- bool end_of_frame;
- bool independent_frame;
- bool discardable_frame;
- bool base_layer_sync;
- uint8_t temporal_id;
- uint8_t layer_id;
- uint8_t tl0_pic_idx;
-};
-
-} // namespace webrtc
-
-#endif // API_VIDEO_VIDEO_FRAME_MARKING_H_
diff --git a/chromium/third_party/webrtc/api/video/video_frame_metadata.cc b/chromium/third_party/webrtc/api/video/video_frame_metadata.cc
new file mode 100644
index 00000000000..df82875eb95
--- /dev/null
+++ b/chromium/third_party/webrtc/api/video/video_frame_metadata.cc
@@ -0,0 +1,28 @@
+/*
+ * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/video/video_frame_metadata.h"
+
+#include "modules/rtp_rtcp/source/rtp_video_header.h"
+
+namespace webrtc {
+
+VideoFrameMetadata::VideoFrameMetadata(const RTPVideoHeader& header)
+ : width_(header.width), height_(header.height) {
+ if (header.generic) {
+ frame_id_ = header.generic->frame_id;
+ spatial_index_ = header.generic->spatial_index;
+ temporal_index_ = header.generic->temporal_index;
+ frame_dependencies_ = header.generic->dependencies;
+ decode_target_indications_ = header.generic->decode_target_indications;
+ }
+}
+
+} // namespace webrtc
diff --git a/chromium/third_party/webrtc/api/video/video_frame_metadata.h b/chromium/third_party/webrtc/api/video/video_frame_metadata.h
new file mode 100644
index 00000000000..2e9309841b0
--- /dev/null
+++ b/chromium/third_party/webrtc/api/video/video_frame_metadata.h
@@ -0,0 +1,59 @@
+/*
+ * Copyright 2020 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#ifndef API_VIDEO_VIDEO_FRAME_METADATA_H_
+#define API_VIDEO_VIDEO_FRAME_METADATA_H_
+
+#include <cstdint>
+
+#include "absl/container/inlined_vector.h"
+#include "absl/types/optional.h"
+#include "api/array_view.h"
+#include "api/transport/rtp/dependency_descriptor.h"
+
+namespace webrtc {
+
+struct RTPVideoHeader;
+
+// A subset of metadata from the RTP video header, exposed in insertable streams
+// API.
+class VideoFrameMetadata {
+ public:
+ explicit VideoFrameMetadata(const RTPVideoHeader& header);
+ VideoFrameMetadata(const VideoFrameMetadata&) = default;
+ VideoFrameMetadata& operator=(const VideoFrameMetadata&) = default;
+
+ uint16_t GetWidth() const { return width_; }
+ uint16_t GetHeight() const { return height_; }
+ absl::optional<int64_t> GetFrameId() const { return frame_id_; }
+ int GetSpatialIndex() const { return spatial_index_; }
+ int GetTemporalIndex() const { return temporal_index_; }
+
+ rtc::ArrayView<const int64_t> GetFrameDependencies() const {
+ return frame_dependencies_;
+ }
+
+ rtc::ArrayView<const DecodeTargetIndication> GetDecodeTargetIndications()
+ const {
+ return decode_target_indications_;
+ }
+
+ private:
+ int16_t width_;
+ int16_t height_;
+ absl::optional<int64_t> frame_id_;
+ int spatial_index_ = 0;
+ int temporal_index_ = 0;
+ absl::InlinedVector<int64_t, 5> frame_dependencies_;
+ absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications_;
+};
+} // namespace webrtc
+
+#endif // API_VIDEO_VIDEO_FRAME_METADATA_H_
diff --git a/chromium/third_party/webrtc/api/video/video_frame_metadata_unittest.cc b/chromium/third_party/webrtc/api/video/video_frame_metadata_unittest.cc
new file mode 100644
index 00000000000..7a808e1ea9b
--- /dev/null
+++ b/chromium/third_party/webrtc/api/video/video_frame_metadata_unittest.cc
@@ -0,0 +1,120 @@
+/*
+ * Copyright (c) 2020 The WebRTC project authors. All Rights Reserved.
+ *
+ * Use of this source code is governed by a BSD-style license
+ * that can be found in the LICENSE file in the root of the source
+ * tree. An additional intellectual property rights grant can be found
+ * in the file PATENTS. All contributing project authors may
+ * be found in the AUTHORS file in the root of the source tree.
+ */
+
+#include "api/video/video_frame_metadata.h"
+
+#include "modules/rtp_rtcp/source/rtp_video_header.h"
+#include "test/gmock.h"
+#include "test/gtest.h"
+
+namespace webrtc {
+namespace {
+
+using ::testing::ElementsAre;
+using ::testing::IsEmpty;
+
+TEST(VideoFrameMetadata, GetWidthReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ video_header.width = 1280u;
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_EQ(metadata.GetWidth(), video_header.width);
+}
+
+TEST(VideoFrameMetadata, GetHeightReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ video_header.height = 720u;
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_EQ(metadata.GetHeight(), video_header.height);
+}
+
+TEST(VideoFrameMetadata, GetFrameIdReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ RTPVideoHeader::GenericDescriptorInfo& generic =
+ video_header.generic.emplace();
+ generic.frame_id = 10;
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_EQ(metadata.GetFrameId().value(), 10);
+}
+
+TEST(VideoFrameMetadata, HasNoFrameIdForHeaderWithoutGeneric) {
+ RTPVideoHeader video_header;
+ VideoFrameMetadata metadata(video_header);
+ ASSERT_FALSE(video_header.generic);
+ EXPECT_EQ(metadata.GetFrameId(), absl::nullopt);
+}
+
+TEST(VideoFrameMetadata, GetSpatialIndexReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ RTPVideoHeader::GenericDescriptorInfo& generic =
+ video_header.generic.emplace();
+ generic.spatial_index = 2;
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_EQ(metadata.GetSpatialIndex(), 2);
+}
+
+TEST(VideoFrameMetadata, SpatialIndexIsZeroForHeaderWithoutGeneric) {
+ RTPVideoHeader video_header;
+ VideoFrameMetadata metadata(video_header);
+ ASSERT_FALSE(video_header.generic);
+ EXPECT_EQ(metadata.GetSpatialIndex(), 0);
+}
+
+TEST(VideoFrameMetadata, GetTemporalIndexReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ RTPVideoHeader::GenericDescriptorInfo& generic =
+ video_header.generic.emplace();
+ generic.temporal_index = 3;
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_EQ(metadata.GetTemporalIndex(), 3);
+}
+
+TEST(VideoFrameMetadata, TemporalIndexIsZeroForHeaderWithoutGeneric) {
+ RTPVideoHeader video_header;
+ VideoFrameMetadata metadata(video_header);
+ ASSERT_FALSE(video_header.generic);
+ EXPECT_EQ(metadata.GetTemporalIndex(), 0);
+}
+
+TEST(VideoFrameMetadata, GetFrameDependenciesReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ RTPVideoHeader::GenericDescriptorInfo& generic =
+ video_header.generic.emplace();
+ generic.dependencies = {5, 6, 7};
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_THAT(metadata.GetFrameDependencies(), ElementsAre(5, 6, 7));
+}
+
+TEST(VideoFrameMetadata, FrameDependencyVectorIsEmptyForHeaderWithoutGeneric) {
+ RTPVideoHeader video_header;
+ VideoFrameMetadata metadata(video_header);
+ ASSERT_FALSE(video_header.generic);
+ EXPECT_THAT(metadata.GetFrameDependencies(), IsEmpty());
+}
+
+TEST(VideoFrameMetadata, GetDecodeTargetIndicationsReturnsCorrectValue) {
+ RTPVideoHeader video_header;
+ RTPVideoHeader::GenericDescriptorInfo& generic =
+ video_header.generic.emplace();
+ generic.decode_target_indications = {DecodeTargetIndication::kSwitch};
+ VideoFrameMetadata metadata(video_header);
+ EXPECT_THAT(metadata.GetDecodeTargetIndications(),
+ ElementsAre(DecodeTargetIndication::kSwitch));
+}
+
+TEST(VideoFrameMetadata,
+ DecodeTargetIndicationsVectorIsEmptyForHeaderWithoutGeneric) {
+ RTPVideoHeader video_header;
+ VideoFrameMetadata metadata(video_header);
+ ASSERT_FALSE(video_header.generic);
+ EXPECT_THAT(metadata.GetDecodeTargetIndications(), IsEmpty());
+}
+
+} // namespace
+} // namespace webrtc
diff --git a/chromium/third_party/webrtc/api/video/video_stream_encoder_interface.h b/chromium/third_party/webrtc/api/video/video_stream_encoder_interface.h
index 8e1df0f858a..d8dd8e15994 100644
--- a/chromium/third_party/webrtc/api/video/video_stream_encoder_interface.h
+++ b/chromium/third_party/webrtc/api/video/video_stream_encoder_interface.h
@@ -13,8 +13,10 @@
#include <vector>
+#include "api/adaptation/resource.h"
#include "api/fec_controller_override.h"
#include "api/rtp_parameters.h" // For DegradationPreference.
+#include "api/scoped_refptr.h"
#include "api/units/data_rate.h"
#include "api/video/video_bitrate_allocator.h"
#include "api/video/video_sink_interface.h"
@@ -49,6 +51,15 @@ class VideoStreamEncoderInterface : public rtc::VideoSinkInterface<VideoFrame> {
int min_transmit_bitrate_bps) = 0;
};
+ // If the resource is overusing, the VideoStreamEncoder will try to reduce
+ // resolution or frame rate until no resource is overusing.
+ // TODO(https://crbug.com/webrtc/11565): When the ResourceAdaptationProcessor
+ // is moved to Call this method could be deleted altogether in favor of
+ // Call-level APIs only.
+ virtual void AddAdaptationResource(rtc::scoped_refptr<Resource> resource) = 0;
+ virtual std::vector<rtc::scoped_refptr<Resource>>
+ GetAdaptationResources() = 0;
+
// Sets the source that will provide video frames to the VideoStreamEncoder's
// OnFrame method. |degradation_preference| control whether or not resolution
// or frame rate may be reduced. The VideoStreamEncoder registers itself with