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 {