video_frame_metadata.h (4369B)
1 /* 2 * Copyright 2020 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11 #ifndef API_VIDEO_VIDEO_FRAME_METADATA_H_ 12 #define API_VIDEO_VIDEO_FRAME_METADATA_H_ 13 14 #include <cstdint> 15 #include <optional> 16 #include <variant> 17 #include <vector> 18 19 #include "absl/container/inlined_vector.h" 20 #include "api/array_view.h" 21 #include "api/transport/rtp/dependency_descriptor.h" 22 #include "api/video/video_codec_type.h" 23 #include "api/video/video_content_type.h" 24 #include "api/video/video_frame_type.h" 25 #include "api/video/video_rotation.h" 26 #include "modules/video_coding/codecs/h264/include/h264_globals.h" 27 #include "modules/video_coding/codecs/vp8/include/vp8_globals.h" 28 #include "modules/video_coding/codecs/vp9/include/vp9_globals.h" 29 #include "rtc_base/system/rtc_export.h" 30 31 namespace webrtc { 32 33 using RTPVideoHeaderCodecSpecifics = std::variant<std::monostate, 34 RTPVideoHeaderVP8, 35 RTPVideoHeaderVP9, 36 RTPVideoHeaderH264>; 37 38 // A subset of metadata from the RTP video header, exposed in insertable streams 39 // API. 40 class RTC_EXPORT VideoFrameMetadata { 41 public: 42 VideoFrameMetadata(); 43 VideoFrameMetadata(const VideoFrameMetadata&) = default; 44 VideoFrameMetadata& operator=(const VideoFrameMetadata&) = default; 45 46 VideoFrameType GetFrameType() const; 47 void SetFrameType(VideoFrameType frame_type); 48 49 uint16_t GetWidth() const; 50 void SetWidth(uint16_t width); 51 52 uint16_t GetHeight() const; 53 void SetHeight(uint16_t height); 54 55 VideoRotation GetRotation() const; 56 void SetRotation(VideoRotation rotation); 57 58 VideoContentType GetContentType() const; 59 void SetContentType(VideoContentType content_type); 60 61 std::optional<int64_t> GetFrameId() const; 62 void SetFrameId(std::optional<int64_t> frame_id); 63 64 int GetSpatialIndex() const; 65 void SetSpatialIndex(int spatial_index); 66 67 int GetTemporalIndex() const; 68 void SetTemporalIndex(int temporal_index); 69 70 ArrayView<const int64_t> GetFrameDependencies() const; 71 void SetFrameDependencies(ArrayView<const int64_t> frame_dependencies); 72 73 ArrayView<const DecodeTargetIndication> GetDecodeTargetIndications() const; 74 void SetDecodeTargetIndications( 75 ArrayView<const DecodeTargetIndication> decode_target_indications); 76 77 bool GetIsLastFrameInPicture() const; 78 void SetIsLastFrameInPicture(bool is_last_frame_in_picture); 79 80 uint8_t GetSimulcastIdx() const; 81 void SetSimulcastIdx(uint8_t simulcast_idx); 82 83 VideoCodecType GetCodec() const; 84 void SetCodec(VideoCodecType codec); 85 86 // Which varient is used depends on the VideoCodecType from GetCodecs(). 87 const RTPVideoHeaderCodecSpecifics& GetRTPVideoHeaderCodecSpecifics() const; 88 void SetRTPVideoHeaderCodecSpecifics( 89 RTPVideoHeaderCodecSpecifics codec_specifics); 90 91 uint32_t GetSsrc() const; 92 void SetSsrc(uint32_t ssrc); 93 std::vector<uint32_t> GetCsrcs() const; 94 void SetCsrcs(std::vector<uint32_t> csrcs); 95 96 friend bool operator==(const VideoFrameMetadata& lhs, 97 const VideoFrameMetadata& rhs); 98 friend bool operator!=(const VideoFrameMetadata& lhs, 99 const VideoFrameMetadata& rhs); 100 101 private: 102 VideoFrameType frame_type_ = VideoFrameType::kEmptyFrame; 103 int16_t width_ = 0; 104 int16_t height_ = 0; 105 VideoRotation rotation_ = VideoRotation::kVideoRotation_0; 106 VideoContentType content_type_ = VideoContentType::UNSPECIFIED; 107 108 // Corresponding to GenericDescriptorInfo. 109 std::optional<int64_t> frame_id_; 110 int spatial_index_ = 0; 111 int temporal_index_ = 0; 112 absl::InlinedVector<int64_t, 5> frame_dependencies_; 113 absl::InlinedVector<DecodeTargetIndication, 10> decode_target_indications_; 114 115 bool is_last_frame_in_picture_ = true; 116 uint8_t simulcast_idx_ = 0; 117 VideoCodecType codec_ = VideoCodecType::kVideoCodecGeneric; 118 RTPVideoHeaderCodecSpecifics codec_specifics_; 119 120 // RTP info. 121 uint32_t ssrc_ = 0u; 122 std::vector<uint32_t> csrcs_; 123 }; 124 } // namespace webrtc 125 126 #endif // API_VIDEO_VIDEO_FRAME_METADATA_H_