Publish DependencyDescriptor structures in the api
The extension (and thus structures to carry it) are designed
in particular for client<->SFU link. Putting the structure into api
acknowledges it can be reused by SFU projects
Bug: webrtc:10342
Change-Id: I8ca1f5046abadf6aa16200443c4892e9a2a928b4
Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/166467
Commit-Queue: Danil Chapovalov <danilchap@webrtc.org>
Reviewed-by: Björn Terelius <terelius@webrtc.org>
Cr-Commit-Position: refs/heads/master@{#30324}
diff --git a/api/transport/rtp/BUILD.gn b/api/transport/rtp/BUILD.gn
index 777ff22..b084950 100644
--- a/api/transport/rtp/BUILD.gn
+++ b/api/transport/rtp/BUILD.gn
@@ -10,12 +10,19 @@
rtc_source_set("rtp_source") {
visibility = [ "*" ]
- sources = [
- "rtp_source.h",
- ]
+ sources = [ "rtp_source.h" ]
deps = [
"../../../api:rtp_headers",
"../../../rtc_base:checks",
"//third_party/abseil-cpp/absl/types:optional",
]
}
+
+rtc_source_set("dependency_descriptor") {
+ visibility = [ "*" ]
+ sources = [ "dependency_descriptor.h" ]
+ deps = [
+ "//third_party/abseil-cpp/absl/container:inlined_vector",
+ "//third_party/abseil-cpp/absl/types:optional",
+ ]
+}
diff --git a/api/transport/rtp/dependency_descriptor.h b/api/transport/rtp/dependency_descriptor.h
new file mode 100644
index 0000000..a488f56
--- /dev/null
+++ b/api/transport/rtp/dependency_descriptor.h
@@ -0,0 +1,104 @@
+/*
+ * 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.
+ */
+
+#ifndef API_TRANSPORT_RTP_DEPENDENCY_DESCRIPTOR_H_
+#define API_TRANSPORT_RTP_DEPENDENCY_DESCRIPTOR_H_
+
+#include <stdint.h>
+
+#include <memory>
+#include <vector>
+
+#include "absl/container/inlined_vector.h"
+#include "absl/types/optional.h"
+
+namespace webrtc {
+// Structures to build and parse dependency descriptor as described in
+// https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension
+class RenderResolution {
+ public:
+ constexpr RenderResolution() = default;
+ constexpr RenderResolution(int width, int height)
+ : width_(width), height_(height) {}
+ RenderResolution(const RenderResolution&) = default;
+ RenderResolution& operator=(const RenderResolution&) = default;
+
+ friend bool operator==(const RenderResolution& lhs,
+ const RenderResolution& rhs) {
+ return lhs.width_ == rhs.width_ && lhs.height_ == rhs.height_;
+ }
+
+ constexpr int Width() const { return width_; }
+ constexpr int Height() const { return height_; }
+
+ private:
+ int width_ = 0;
+ int height_ = 0;
+};
+
+// Relationship of a frame to a Decode target.
+enum class DecodeTargetIndication {
+ kNotPresent = 0, // DecodeTargetInfo symbol '-'
+ kDiscardable = 1, // DecodeTargetInfo symbol 'D'
+ kSwitch = 2, // DecodeTargetInfo symbol 'S'
+ kRequired = 3 // DecodeTargetInfo symbol 'R'
+};
+
+struct FrameDependencyTemplate {
+ friend bool operator==(const FrameDependencyTemplate& lhs,
+ const FrameDependencyTemplate& rhs) {
+ return lhs.spatial_id == rhs.spatial_id &&
+ lhs.temporal_id == rhs.temporal_id &&
+ lhs.decode_target_indications == rhs.decode_target_indications &&
+ lhs.frame_diffs == rhs.frame_diffs &&
+ lhs.chain_diffs == rhs.chain_diffs;
+ }
+
+ int spatial_id = 0;
+ int temporal_id = 0;
+ absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications;
+ absl::InlinedVector<int, 4> frame_diffs;
+ absl::InlinedVector<int, 4> chain_diffs;
+};
+
+struct FrameDependencyStructure {
+ friend bool operator==(const FrameDependencyStructure& lhs,
+ const FrameDependencyStructure& rhs) {
+ return lhs.num_decode_targets == rhs.num_decode_targets &&
+ lhs.num_chains == rhs.num_chains &&
+ lhs.decode_target_protected_by_chain ==
+ rhs.decode_target_protected_by_chain &&
+ lhs.resolutions == rhs.resolutions && lhs.templates == rhs.templates;
+ }
+
+ int structure_id = 0;
+ int num_decode_targets = 0;
+ int num_chains = 0;
+ // If chains are used (num_chains > 0), maps decode target index into index of
+ // the chain protecting that target or |num_chains| value if decode target is
+ // not protected by a chain.
+ absl::InlinedVector<int, 10> decode_target_protected_by_chain;
+ absl::InlinedVector<RenderResolution, 4> resolutions;
+ std::vector<FrameDependencyTemplate> templates;
+};
+
+struct DependencyDescriptor {
+ bool first_packet_in_frame = true;
+ bool last_packet_in_frame = true;
+ int frame_number = 0;
+ FrameDependencyTemplate frame_dependencies;
+ absl::optional<RenderResolution> resolution;
+ absl::optional<uint32_t> active_decode_targets_bitmask;
+ std::unique_ptr<FrameDependencyStructure> attached_structure;
+};
+
+} // namespace webrtc
+
+#endif // API_TRANSPORT_RTP_DEPENDENCY_DESCRIPTOR_H_
diff --git a/common_video/generic_frame_descriptor/BUILD.gn b/common_video/generic_frame_descriptor/BUILD.gn
index 9ea0912..05a4e23 100644
--- a/common_video/generic_frame_descriptor/BUILD.gn
+++ b/common_video/generic_frame_descriptor/BUILD.gn
@@ -16,6 +16,7 @@
deps = [
"../../api:array_view",
+ "../../api/transport/rtp:dependency_descriptor",
"../../api/video:video_codec_constants",
"../../rtc_base:checks",
"//third_party/abseil-cpp/absl/container:inlined_vector",
diff --git a/common_video/generic_frame_descriptor/generic_frame_info.h b/common_video/generic_frame_descriptor/generic_frame_info.h
index 2aff0e3..ce3ee6c 100644
--- a/common_video/generic_frame_descriptor/generic_frame_info.h
+++ b/common_video/generic_frame_descriptor/generic_frame_info.h
@@ -12,94 +12,13 @@
#define COMMON_VIDEO_GENERIC_FRAME_DESCRIPTOR_GENERIC_FRAME_INFO_H_
#include <initializer_list>
-#include <memory>
-#include <vector>
#include "absl/container/inlined_vector.h"
#include "absl/strings/string_view.h"
-#include "absl/types/optional.h"
-#include "api/array_view.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "api/video/video_codec_constants.h"
namespace webrtc {
-// Structures to build and parse dependency descriptor as described in
-// https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension
-class RenderResolution {
- public:
- constexpr RenderResolution() = default;
- constexpr RenderResolution(int width, int height)
- : width_(width), height_(height) {}
- RenderResolution(const RenderResolution&) = default;
- RenderResolution& operator=(const RenderResolution&) = default;
-
- friend bool operator==(const RenderResolution& lhs,
- const RenderResolution& rhs) {
- return lhs.width_ == rhs.width_ && lhs.height_ == rhs.height_;
- }
-
- constexpr int Width() const { return width_; }
- constexpr int Height() const { return height_; }
-
- private:
- int width_ = 0;
- int height_ = 0;
-};
-
-// Relationship of a frame to a Decode target.
-enum class DecodeTargetIndication {
- kNotPresent = 0, // DecodeTargetInfo symbol '-'
- kDiscardable = 1, // DecodeTargetInfo symbol 'D'
- kSwitch = 2, // DecodeTargetInfo symbol 'S'
- kRequired = 3 // DecodeTargetInfo symbol 'R'
-};
-
-struct FrameDependencyTemplate {
- friend bool operator==(const FrameDependencyTemplate& lhs,
- const FrameDependencyTemplate& rhs) {
- return lhs.spatial_id == rhs.spatial_id &&
- lhs.temporal_id == rhs.temporal_id &&
- lhs.decode_target_indications == rhs.decode_target_indications &&
- lhs.frame_diffs == rhs.frame_diffs &&
- lhs.chain_diffs == rhs.chain_diffs;
- }
-
- int spatial_id = 0;
- int temporal_id = 0;
- absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications;
- absl::InlinedVector<int, 4> frame_diffs;
- absl::InlinedVector<int, 4> chain_diffs;
-};
-
-struct FrameDependencyStructure {
- friend bool operator==(const FrameDependencyStructure& lhs,
- const FrameDependencyStructure& rhs) {
- return lhs.num_decode_targets == rhs.num_decode_targets &&
- lhs.num_chains == rhs.num_chains &&
- lhs.decode_target_protected_by_chain ==
- rhs.decode_target_protected_by_chain &&
- lhs.resolutions == rhs.resolutions && lhs.templates == rhs.templates;
- }
-
- int structure_id = 0;
- int num_decode_targets = 0;
- int num_chains = 0;
- // If chains are used (num_chains > 0), maps decode target index into index of
- // the chain protecting that target or |num_chains| value if decode target is
- // not protected by a chain.
- absl::InlinedVector<int, 10> decode_target_protected_by_chain;
- absl::InlinedVector<RenderResolution, 4> resolutions;
- std::vector<FrameDependencyTemplate> templates;
-};
-
-struct DependencyDescriptor {
- bool first_packet_in_frame = true;
- bool last_packet_in_frame = true;
- int frame_number = 0;
- FrameDependencyTemplate frame_dependencies;
- absl::optional<RenderResolution> resolution;
- absl::optional<uint32_t> active_decode_targets_bitmask;
- std::unique_ptr<FrameDependencyStructure> attached_structure;
-};
// Describes how a certain encoder buffer was used when encoding a frame.
struct CodecBufferUsage {
diff --git a/modules/rtp_rtcp/BUILD.gn b/modules/rtp_rtcp/BUILD.gn
index fcf013d..daaac94 100644
--- a/modules/rtp_rtcp/BUILD.gn
+++ b/modules/rtp_rtcp/BUILD.gn
@@ -106,11 +106,11 @@
"../../api:rtp_parameters",
"../../api/audio_codecs:audio_codecs_api",
"../../api/transport:network_control",
+ "../../api/transport/rtp:dependency_descriptor",
"../../api/units:time_delta",
"../../api/video:video_frame",
"../../api/video:video_rtp_headers",
"../../common_video",
- "../../common_video/generic_frame_descriptor",
"../../rtc_base:checks",
"../../rtc_base:deprecation",
"../../rtc_base:divide_round",
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.cc b/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.cc
index 7d24f7c..30dedb1 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.cc
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.cc
@@ -13,7 +13,7 @@
#include <cstdint>
#include "api/array_view.h"
-#include "common_video/generic_frame_descriptor/generic_frame_info.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.h"
#include "modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.h"
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h b/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h
index 5875782..d6e0804 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_extension.h
@@ -13,7 +13,7 @@
#include <cstdint>
#include "api/array_view.h"
-#include "common_video/generic_frame_descriptor/generic_frame_info.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "modules/rtp_rtcp/include/rtp_rtcp_defines.h"
namespace webrtc {
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.cc b/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.cc
index cf816c2..07b6a3b 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.cc
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.cc
@@ -13,6 +13,7 @@
#include <utility>
#include <vector>
+#include "api/transport/rtp/dependency_descriptor.h"
#include "rtc_base/bit_buffer.h"
#include "rtc_base/checks.h"
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.h b/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.h
index 11df2f4..abef371 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.h
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_reader.h
@@ -15,7 +15,7 @@
#include <vector>
#include "api/array_view.h"
-#include "common_video/generic_frame_descriptor/generic_frame_info.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "rtc_base/bit_buffer.h"
namespace webrtc {
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.cc b/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.cc
index 28f4444..9e1a425 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.cc
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.cc
@@ -16,7 +16,7 @@
#include "absl/algorithm/container.h"
#include "api/array_view.h"
-#include "common_video/generic_frame_descriptor/generic_frame_info.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "rtc_base/bit_buffer.h"
#include "rtc_base/checks.h"
diff --git a/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.h b/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.h
index 5274f2d..5a823b6 100644
--- a/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.h
+++ b/modules/rtp_rtcp/source/rtp_dependency_descriptor_writer.h
@@ -15,7 +15,7 @@
#include <vector>
#include "api/array_view.h"
-#include "common_video/generic_frame_descriptor/generic_frame_info.h"
+#include "api/transport/rtp/dependency_descriptor.h"
#include "rtc_base/bit_buffer.h"
namespace webrtc {