diff --git a/common_video/generic_frame_descriptor/BUILD.gn b/common_video/generic_frame_descriptor/BUILD.gn index dc9461acd9..6b8434e1e7 100644 --- a/common_video/generic_frame_descriptor/BUILD.gn +++ b/common_video/generic_frame_descriptor/BUILD.gn @@ -20,5 +20,6 @@ rtc_source_set("generic_frame_descriptor") { "../../rtc_base:checks", "//third_party/abseil-cpp/absl/container:inlined_vector", "//third_party/abseil-cpp/absl/strings", + "//third_party/abseil-cpp/absl/types:optional", ] } diff --git a/common_video/generic_frame_descriptor/generic_frame_info.cc b/common_video/generic_frame_descriptor/generic_frame_info.cc index 1c01b6c948..5c40ddc82c 100644 --- a/common_video/generic_frame_descriptor/generic_frame_info.cc +++ b/common_video/generic_frame_descriptor/generic_frame_info.cc @@ -15,7 +15,7 @@ namespace webrtc { -absl::InlinedVector +absl::InlinedVector GenericFrameInfo::DecodeTargetInfo(absl::string_view indication_symbols) { absl::InlinedVector decode_targets; for (char symbol : indication_symbols) { @@ -67,10 +67,4 @@ GenericFrameInfo::Builder& GenericFrameInfo::Builder::Fdiffs( return *this; } -TemplateStructure::TemplateStructure() = default; -TemplateStructure::TemplateStructure(const TemplateStructure&) = default; -TemplateStructure::TemplateStructure(TemplateStructure&&) = default; -TemplateStructure& TemplateStructure::operator=(const TemplateStructure&) = - default; -TemplateStructure::~TemplateStructure() = default; } // namespace webrtc diff --git a/common_video/generic_frame_descriptor/generic_frame_info.h b/common_video/generic_frame_descriptor/generic_frame_info.h index d12ae887ca..d54e53d9f1 100644 --- a/common_video/generic_frame_descriptor/generic_frame_info.h +++ b/common_video/generic_frame_descriptor/generic_frame_info.h @@ -16,10 +16,85 @@ #include "absl/container/inlined_vector.h" #include "absl/strings/string_view.h" +#include "absl/types/optional.h" #include "api/array_view.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 decode_target_indications; + absl::InlinedVector frame_diffs; + absl::InlinedVector 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; + absl::InlinedVector decode_target_protected_by_chain; + absl::InlinedVector resolutions; + std::vector templates; +}; + +struct DependencyDescriptor { + bool first_packet_in_frame = true; + bool last_packet_in_frame = true; + bool has_structure_attached = false; + int frame_number = 0; + FrameDependencyTemplate frame_dependencies; + absl::optional resolution; +}; // Describes how a certain encoder buffer was used when encoding a frame. struct CodecBufferUsage { @@ -31,14 +106,7 @@ struct CodecBufferUsage { bool updated = false; }; -struct GenericFrameInfo { - enum class DecodeTargetIndication { - kNotPresent, // DecodeTargetInfo symbol '-' - kDiscardable, // DecodeTargetInfo symbol 'D' - kSwitch, // DecodeTargetInfo symbol 'S' - kRequired // DecodeTargetInfo symbol 'R' - }; - +struct GenericFrameInfo : public FrameDependencyTemplate { static absl::InlinedVector DecodeTargetInfo( absl::string_view indication_symbols); @@ -49,10 +117,6 @@ struct GenericFrameInfo { ~GenericFrameInfo(); int64_t frame_id = 0; - int temporal_id = 0; - int spatial_id = 0; - absl::InlinedVector frame_diffs; - absl::InlinedVector decode_target_indications; absl::InlinedVector encoder_buffers; }; @@ -71,16 +135,6 @@ class GenericFrameInfo::Builder { GenericFrameInfo info_; }; -struct TemplateStructure { - TemplateStructure(); - TemplateStructure(const TemplateStructure&); - TemplateStructure(TemplateStructure&&); - TemplateStructure& operator=(const TemplateStructure&); - ~TemplateStructure(); - - int num_decode_targets = 0; - std::vector templates; -}; } // namespace webrtc #endif // COMMON_VIDEO_GENERIC_FRAME_DESCRIPTOR_GENERIC_FRAME_INFO_H_ diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.cc b/modules/video_coding/codecs/vp8/default_temporal_layers.cc index 986ea2ef0e..84e948e8e2 100644 --- a/modules/video_coding/codecs/vp8/default_temporal_layers.cc +++ b/modules/video_coding/codecs/vp8/default_temporal_layers.cc @@ -585,12 +585,12 @@ void DefaultTemporalLayers::OnRttUpdate(int64_t rtt_ms) {} void DefaultTemporalLayers::OnLossNotification( const VideoEncoder::LossNotification& loss_notification) {} -TemplateStructure DefaultTemporalLayers::GetTemplateStructure( +FrameDependencyStructure DefaultTemporalLayers::GetTemplateStructure( int num_layers) const { RTC_CHECK_LT(num_layers, 5); RTC_CHECK_GT(num_layers, 0); - TemplateStructure template_structure; + FrameDependencyStructure template_structure; template_structure.num_decode_targets = num_layers; using Builder = GenericFrameInfo::Builder; diff --git a/modules/video_coding/codecs/vp8/default_temporal_layers.h b/modules/video_coding/codecs/vp8/default_temporal_layers.h index cb1cbbeef3..9f86d408ad 100644 --- a/modules/video_coding/codecs/vp8/default_temporal_layers.h +++ b/modules/video_coding/codecs/vp8/default_temporal_layers.h @@ -77,8 +77,7 @@ class DefaultTemporalLayers final : public Vp8FrameBufferController { GenericFrameInfo::DecodeTargetInfo(indication_symbols)), frame_config(frame_config) {} - absl::InlinedVector - decode_target_indications; + absl::InlinedVector decode_target_indications; Vp8FrameConfig frame_config; }; @@ -93,7 +92,7 @@ class DefaultTemporalLayers final : public Vp8FrameBufferController { const std::vector temporal_pattern_; // Set of buffers that are never updated except by keyframes. std::set kf_buffers_; - TemplateStructure GetTemplateStructure(int num_layers) const; + FrameDependencyStructure GetTemplateStructure(int num_layers) const; uint8_t pattern_idx_; // Updated cumulative bitrates, per temporal layer. diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.cc b/modules/video_coding/codecs/vp8/screenshare_layers.cc index c8ea6ca1c4..b5b963e2a9 100644 --- a/modules/video_coding/codecs/vp8/screenshare_layers.cc +++ b/modules/video_coding/codecs/vp8/screenshare_layers.cc @@ -421,12 +421,12 @@ void ScreenshareLayers::OnRttUpdate(int64_t rtt_ms) {} void ScreenshareLayers::OnLossNotification( const VideoEncoder::LossNotification& loss_notification) {} -TemplateStructure ScreenshareLayers::GetTemplateStructure( +FrameDependencyStructure ScreenshareLayers::GetTemplateStructure( int num_layers) const { RTC_CHECK_LT(num_layers, 3); RTC_CHECK_GT(num_layers, 0); - TemplateStructure template_structure; + FrameDependencyStructure template_structure; template_structure.num_decode_targets = num_layers; using Builder = GenericFrameInfo::Builder; diff --git a/modules/video_coding/codecs/vp8/screenshare_layers.h b/modules/video_coding/codecs/vp8/screenshare_layers.h index d7de52711c..5270ffe81c 100644 --- a/modules/video_coding/codecs/vp8/screenshare_layers.h +++ b/modules/video_coding/codecs/vp8/screenshare_layers.h @@ -81,8 +81,7 @@ class ScreenshareLayers final : public Vp8FrameBufferController { GenericFrameInfo::DecodeTargetInfo(indication_symbols)), frame_config(frame_config) {} - absl::InlinedVector - decode_target_indications; + absl::InlinedVector decode_target_indications; Vp8FrameConfig frame_config; }; @@ -140,7 +139,7 @@ class ScreenshareLayers final : public Vp8FrameBufferController { } layers_[kMaxNumTemporalLayers]; void UpdateHistograms(); - TemplateStructure GetTemplateStructure(int num_layers) const; + FrameDependencyStructure GetTemplateStructure(int num_layers) const; // Data for histogram statistics. struct Stats { diff --git a/modules/video_coding/include/video_codec_interface.h b/modules/video_coding/include/video_codec_interface.h index 4aa13ac964..e66dea7a95 100644 --- a/modules/video_coding/include/video_codec_interface.h +++ b/modules/video_coding/include/video_codec_interface.h @@ -107,7 +107,7 @@ struct RTC_EXPORT CodecSpecificInfo { VideoCodecType codecType; CodecSpecificInfoUnion codecSpecific; absl::optional generic_frame_info; - absl::optional template_structure; + absl::optional template_structure; }; } // namespace webrtc