1*d9f75844SAndroid Build Coastguard Worker /* 2*d9f75844SAndroid Build Coastguard Worker * Copyright (c) 2014 The WebRTC project authors. All Rights Reserved. 3*d9f75844SAndroid Build Coastguard Worker * 4*d9f75844SAndroid Build Coastguard Worker * Use of this source code is governed by a BSD-style license 5*d9f75844SAndroid Build Coastguard Worker * that can be found in the LICENSE file in the root of the source 6*d9f75844SAndroid Build Coastguard Worker * tree. An additional intellectual property rights grant can be found 7*d9f75844SAndroid Build Coastguard Worker * in the file PATENTS. All contributing project authors may 8*d9f75844SAndroid Build Coastguard Worker * be found in the AUTHORS file in the root of the source tree. 9*d9f75844SAndroid Build Coastguard Worker */ 10*d9f75844SAndroid Build Coastguard Worker 11*d9f75844SAndroid Build Coastguard Worker #ifndef API_VIDEO_VIDEO_FRAME_H_ 12*d9f75844SAndroid Build Coastguard Worker #define API_VIDEO_VIDEO_FRAME_H_ 13*d9f75844SAndroid Build Coastguard Worker 14*d9f75844SAndroid Build Coastguard Worker #include <stdint.h> 15*d9f75844SAndroid Build Coastguard Worker 16*d9f75844SAndroid Build Coastguard Worker #include <utility> 17*d9f75844SAndroid Build Coastguard Worker 18*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h" 19*d9f75844SAndroid Build Coastguard Worker #include "api/rtp_packet_infos.h" 20*d9f75844SAndroid Build Coastguard Worker #include "api/scoped_refptr.h" 21*d9f75844SAndroid Build Coastguard Worker #include "api/video/color_space.h" 22*d9f75844SAndroid Build Coastguard Worker #include "api/video/hdr_metadata.h" 23*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_frame_buffer.h" 24*d9f75844SAndroid Build Coastguard Worker #include "api/video/video_rotation.h" 25*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h" 26*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/system/rtc_export.h" 27*d9f75844SAndroid Build Coastguard Worker 28*d9f75844SAndroid Build Coastguard Worker namespace webrtc { 29*d9f75844SAndroid Build Coastguard Worker 30*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT VideoFrame { 31*d9f75844SAndroid Build Coastguard Worker public: 32*d9f75844SAndroid Build Coastguard Worker // Value used to signal that `VideoFrame::id()` is not set. 33*d9f75844SAndroid Build Coastguard Worker static constexpr uint16_t kNotSetId = 0; 34*d9f75844SAndroid Build Coastguard Worker 35*d9f75844SAndroid Build Coastguard Worker struct RTC_EXPORT UpdateRect { 36*d9f75844SAndroid Build Coastguard Worker int offset_x; 37*d9f75844SAndroid Build Coastguard Worker int offset_y; 38*d9f75844SAndroid Build Coastguard Worker int width; 39*d9f75844SAndroid Build Coastguard Worker int height; 40*d9f75844SAndroid Build Coastguard Worker 41*d9f75844SAndroid Build Coastguard Worker // Makes this UpdateRect a bounding box of this and other rect. 42*d9f75844SAndroid Build Coastguard Worker void Union(const UpdateRect& other); 43*d9f75844SAndroid Build Coastguard Worker 44*d9f75844SAndroid Build Coastguard Worker // Makes this UpdateRect an intersection of this and other rect. 45*d9f75844SAndroid Build Coastguard Worker void Intersect(const UpdateRect& other); 46*d9f75844SAndroid Build Coastguard Worker 47*d9f75844SAndroid Build Coastguard Worker // Sets everything to 0, making this UpdateRect a zero-size (empty) update. 48*d9f75844SAndroid Build Coastguard Worker void MakeEmptyUpdate(); 49*d9f75844SAndroid Build Coastguard Worker 50*d9f75844SAndroid Build Coastguard Worker bool IsEmpty() const; 51*d9f75844SAndroid Build Coastguard Worker 52*d9f75844SAndroid Build Coastguard Worker // Per-member equality check. Empty rectangles with different offsets would 53*d9f75844SAndroid Build Coastguard Worker // be considered different. 54*d9f75844SAndroid Build Coastguard Worker bool operator==(const UpdateRect& other) const { 55*d9f75844SAndroid Build Coastguard Worker return other.offset_x == offset_x && other.offset_y == offset_y && 56*d9f75844SAndroid Build Coastguard Worker other.width == width && other.height == height; 57*d9f75844SAndroid Build Coastguard Worker } 58*d9f75844SAndroid Build Coastguard Worker 59*d9f75844SAndroid Build Coastguard Worker bool operator!=(const UpdateRect& other) const { return !(*this == other); } 60*d9f75844SAndroid Build Coastguard Worker 61*d9f75844SAndroid Build Coastguard Worker // Scales update_rect given original frame dimensions. 62*d9f75844SAndroid Build Coastguard Worker // Cropping is applied first, then rect is scaled down. 63*d9f75844SAndroid Build Coastguard Worker // Update rect is snapped to 2x2 grid due to possible UV subsampling and 64*d9f75844SAndroid Build Coastguard Worker // then expanded by additional 2 pixels in each direction to accommodate any 65*d9f75844SAndroid Build Coastguard Worker // possible scaling artifacts. 66*d9f75844SAndroid Build Coastguard Worker // Note, close but not equal update_rects on original frame may result in 67*d9f75844SAndroid Build Coastguard Worker // the same scaled update rects. 68*d9f75844SAndroid Build Coastguard Worker UpdateRect ScaleWithFrame(int frame_width, 69*d9f75844SAndroid Build Coastguard Worker int frame_height, 70*d9f75844SAndroid Build Coastguard Worker int crop_x, 71*d9f75844SAndroid Build Coastguard Worker int crop_y, 72*d9f75844SAndroid Build Coastguard Worker int crop_width, 73*d9f75844SAndroid Build Coastguard Worker int crop_height, 74*d9f75844SAndroid Build Coastguard Worker int scaled_width, 75*d9f75844SAndroid Build Coastguard Worker int scaled_height) const; 76*d9f75844SAndroid Build Coastguard Worker }; 77*d9f75844SAndroid Build Coastguard Worker 78*d9f75844SAndroid Build Coastguard Worker struct RTC_EXPORT ProcessingTime { ElapsedProcessingTime79*d9f75844SAndroid Build Coastguard Worker TimeDelta Elapsed() const { return finish - start; } 80*d9f75844SAndroid Build Coastguard Worker Timestamp start; 81*d9f75844SAndroid Build Coastguard Worker Timestamp finish; 82*d9f75844SAndroid Build Coastguard Worker }; 83*d9f75844SAndroid Build Coastguard Worker 84*d9f75844SAndroid Build Coastguard Worker struct RTC_EXPORT RenderParameters { 85*d9f75844SAndroid Build Coastguard Worker bool use_low_latency_rendering = false; 86*d9f75844SAndroid Build Coastguard Worker absl::optional<int32_t> max_composition_delay_in_frames; 87*d9f75844SAndroid Build Coastguard Worker 88*d9f75844SAndroid Build Coastguard Worker bool operator==(const RenderParameters& other) const { 89*d9f75844SAndroid Build Coastguard Worker return other.use_low_latency_rendering == use_low_latency_rendering && 90*d9f75844SAndroid Build Coastguard Worker other.max_composition_delay_in_frames == 91*d9f75844SAndroid Build Coastguard Worker max_composition_delay_in_frames; 92*d9f75844SAndroid Build Coastguard Worker } 93*d9f75844SAndroid Build Coastguard Worker 94*d9f75844SAndroid Build Coastguard Worker bool operator!=(const RenderParameters& other) const { 95*d9f75844SAndroid Build Coastguard Worker return !(*this == other); 96*d9f75844SAndroid Build Coastguard Worker } 97*d9f75844SAndroid Build Coastguard Worker }; 98*d9f75844SAndroid Build Coastguard Worker 99*d9f75844SAndroid Build Coastguard Worker // Preferred way of building VideoFrame objects. 100*d9f75844SAndroid Build Coastguard Worker class RTC_EXPORT Builder { 101*d9f75844SAndroid Build Coastguard Worker public: 102*d9f75844SAndroid Build Coastguard Worker Builder(); 103*d9f75844SAndroid Build Coastguard Worker ~Builder(); 104*d9f75844SAndroid Build Coastguard Worker 105*d9f75844SAndroid Build Coastguard Worker VideoFrame build(); 106*d9f75844SAndroid Build Coastguard Worker Builder& set_video_frame_buffer( 107*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<VideoFrameBuffer>& buffer); 108*d9f75844SAndroid Build Coastguard Worker Builder& set_timestamp_ms(int64_t timestamp_ms); 109*d9f75844SAndroid Build Coastguard Worker Builder& set_timestamp_us(int64_t timestamp_us); 110*d9f75844SAndroid Build Coastguard Worker Builder& set_timestamp_rtp(uint32_t timestamp_rtp); 111*d9f75844SAndroid Build Coastguard Worker Builder& set_ntp_time_ms(int64_t ntp_time_ms); 112*d9f75844SAndroid Build Coastguard Worker Builder& set_rotation(VideoRotation rotation); 113*d9f75844SAndroid Build Coastguard Worker Builder& set_color_space(const absl::optional<ColorSpace>& color_space); 114*d9f75844SAndroid Build Coastguard Worker Builder& set_color_space(const ColorSpace* color_space); 115*d9f75844SAndroid Build Coastguard Worker Builder& set_id(uint16_t id); 116*d9f75844SAndroid Build Coastguard Worker Builder& set_update_rect(const absl::optional<UpdateRect>& update_rect); 117*d9f75844SAndroid Build Coastguard Worker Builder& set_packet_infos(RtpPacketInfos packet_infos); 118*d9f75844SAndroid Build Coastguard Worker 119*d9f75844SAndroid Build Coastguard Worker private: 120*d9f75844SAndroid Build Coastguard Worker uint16_t id_ = kNotSetId; 121*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; 122*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_us_ = 0; 123*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_rtp_ = 0; 124*d9f75844SAndroid Build Coastguard Worker int64_t ntp_time_ms_ = 0; 125*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation_ = kVideoRotation_0; 126*d9f75844SAndroid Build Coastguard Worker absl::optional<ColorSpace> color_space_; 127*d9f75844SAndroid Build Coastguard Worker RenderParameters render_parameters_; 128*d9f75844SAndroid Build Coastguard Worker absl::optional<UpdateRect> update_rect_; 129*d9f75844SAndroid Build Coastguard Worker RtpPacketInfos packet_infos_; 130*d9f75844SAndroid Build Coastguard Worker }; 131*d9f75844SAndroid Build Coastguard Worker 132*d9f75844SAndroid Build Coastguard Worker // To be deprecated. Migrate all use to Builder. 133*d9f75844SAndroid Build Coastguard Worker VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, 134*d9f75844SAndroid Build Coastguard Worker webrtc::VideoRotation rotation, 135*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_us); 136*d9f75844SAndroid Build Coastguard Worker VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, 137*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_rtp, 138*d9f75844SAndroid Build Coastguard Worker int64_t render_time_ms, 139*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation); 140*d9f75844SAndroid Build Coastguard Worker 141*d9f75844SAndroid Build Coastguard Worker ~VideoFrame(); 142*d9f75844SAndroid Build Coastguard Worker 143*d9f75844SAndroid Build Coastguard Worker // Support move and copy. 144*d9f75844SAndroid Build Coastguard Worker VideoFrame(const VideoFrame&); 145*d9f75844SAndroid Build Coastguard Worker VideoFrame(VideoFrame&&); 146*d9f75844SAndroid Build Coastguard Worker VideoFrame& operator=(const VideoFrame&); 147*d9f75844SAndroid Build Coastguard Worker VideoFrame& operator=(VideoFrame&&); 148*d9f75844SAndroid Build Coastguard Worker 149*d9f75844SAndroid Build Coastguard Worker // Get frame width. 150*d9f75844SAndroid Build Coastguard Worker int width() const; 151*d9f75844SAndroid Build Coastguard Worker // Get frame height. 152*d9f75844SAndroid Build Coastguard Worker int height() const; 153*d9f75844SAndroid Build Coastguard Worker // Get frame size in pixels. 154*d9f75844SAndroid Build Coastguard Worker uint32_t size() const; 155*d9f75844SAndroid Build Coastguard Worker 156*d9f75844SAndroid Build Coastguard Worker // Get frame ID. Returns `kNotSetId` if ID is not set. Not guaranteed to be 157*d9f75844SAndroid Build Coastguard Worker // transferred from the sender to the receiver, but preserved on the sender 158*d9f75844SAndroid Build Coastguard Worker // side. The id should be propagated between all frame modifications during 159*d9f75844SAndroid Build Coastguard Worker // its lifetime from capturing to sending as encoded image. It is intended to 160*d9f75844SAndroid Build Coastguard Worker // be unique over a time window of a few minutes for the peer connection to 161*d9f75844SAndroid Build Coastguard Worker // which the corresponding video stream belongs to. id()162*d9f75844SAndroid Build Coastguard Worker uint16_t id() const { return id_; } set_id(uint16_t id)163*d9f75844SAndroid Build Coastguard Worker void set_id(uint16_t id) { id_ = id; } 164*d9f75844SAndroid Build Coastguard Worker 165*d9f75844SAndroid Build Coastguard Worker // System monotonic clock, same timebase as rtc::TimeMicros(). timestamp_us()166*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_us() const { return timestamp_us_; } set_timestamp_us(int64_t timestamp_us)167*d9f75844SAndroid Build Coastguard Worker void set_timestamp_us(int64_t timestamp_us) { timestamp_us_ = timestamp_us; } 168*d9f75844SAndroid Build Coastguard Worker 169*d9f75844SAndroid Build Coastguard Worker // Set frame timestamp (90kHz). set_timestamp(uint32_t timestamp)170*d9f75844SAndroid Build Coastguard Worker void set_timestamp(uint32_t timestamp) { timestamp_rtp_ = timestamp; } 171*d9f75844SAndroid Build Coastguard Worker 172*d9f75844SAndroid Build Coastguard Worker // Get frame timestamp (90kHz). timestamp()173*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp() const { return timestamp_rtp_; } 174*d9f75844SAndroid Build Coastguard Worker 175*d9f75844SAndroid Build Coastguard Worker // Set capture ntp time in milliseconds. set_ntp_time_ms(int64_t ntp_time_ms)176*d9f75844SAndroid Build Coastguard Worker void set_ntp_time_ms(int64_t ntp_time_ms) { ntp_time_ms_ = ntp_time_ms; } 177*d9f75844SAndroid Build Coastguard Worker 178*d9f75844SAndroid Build Coastguard Worker // Get capture ntp time in milliseconds. ntp_time_ms()179*d9f75844SAndroid Build Coastguard Worker int64_t ntp_time_ms() const { return ntp_time_ms_; } 180*d9f75844SAndroid Build Coastguard Worker 181*d9f75844SAndroid Build Coastguard Worker // Naming convention for Coordination of Video Orientation. Please see 182*d9f75844SAndroid Build Coastguard Worker // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf 183*d9f75844SAndroid Build Coastguard Worker // 184*d9f75844SAndroid Build Coastguard Worker // "pending rotation" or "pending" = a frame that has a VideoRotation > 0. 185*d9f75844SAndroid Build Coastguard Worker // 186*d9f75844SAndroid Build Coastguard Worker // "not pending" = a frame that has a VideoRotation == 0. 187*d9f75844SAndroid Build Coastguard Worker // 188*d9f75844SAndroid Build Coastguard Worker // "apply rotation" = modify a frame from being "pending" to being "not 189*d9f75844SAndroid Build Coastguard Worker // pending" rotation (a no-op for "unrotated"). 190*d9f75844SAndroid Build Coastguard Worker // rotation()191*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation() const { return rotation_; } set_rotation(VideoRotation rotation)192*d9f75844SAndroid Build Coastguard Worker void set_rotation(VideoRotation rotation) { rotation_ = rotation; } 193*d9f75844SAndroid Build Coastguard Worker 194*d9f75844SAndroid Build Coastguard Worker // Get color space when available. color_space()195*d9f75844SAndroid Build Coastguard Worker const absl::optional<ColorSpace>& color_space() const { return color_space_; } set_color_space(const absl::optional<ColorSpace> & color_space)196*d9f75844SAndroid Build Coastguard Worker void set_color_space(const absl::optional<ColorSpace>& color_space) { 197*d9f75844SAndroid Build Coastguard Worker color_space_ = color_space; 198*d9f75844SAndroid Build Coastguard Worker } 199*d9f75844SAndroid Build Coastguard Worker render_parameters()200*d9f75844SAndroid Build Coastguard Worker RenderParameters render_parameters() const { return render_parameters_; } set_render_parameters(const RenderParameters & render_parameters)201*d9f75844SAndroid Build Coastguard Worker void set_render_parameters(const RenderParameters& render_parameters) { 202*d9f75844SAndroid Build Coastguard Worker render_parameters_ = render_parameters; 203*d9f75844SAndroid Build Coastguard Worker } 204*d9f75844SAndroid Build Coastguard Worker 205*d9f75844SAndroid Build Coastguard Worker // Deprecated in favor of render_parameters, will be removed once Chromium is 206*d9f75844SAndroid Build Coastguard Worker // updated. max_composition_delay_in_frames() is used in an experiment of a 207*d9f75844SAndroid Build Coastguard Worker // low-latency renderer algorithm see crbug.com/1138888. 208*d9f75844SAndroid Build Coastguard Worker [[deprecated("Use render_parameters() instead.")]] absl::optional<int32_t> max_composition_delay_in_frames()209*d9f75844SAndroid Build Coastguard Worker max_composition_delay_in_frames() const { 210*d9f75844SAndroid Build Coastguard Worker return render_parameters_.max_composition_delay_in_frames; 211*d9f75844SAndroid Build Coastguard Worker } 212*d9f75844SAndroid Build Coastguard Worker 213*d9f75844SAndroid Build Coastguard Worker // Get render time in milliseconds. 214*d9f75844SAndroid Build Coastguard Worker int64_t render_time_ms() const; 215*d9f75844SAndroid Build Coastguard Worker 216*d9f75844SAndroid Build Coastguard Worker // Return the underlying buffer. Never nullptr for a properly 217*d9f75844SAndroid Build Coastguard Worker // initialized VideoFrame. 218*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer() const; 219*d9f75844SAndroid Build Coastguard Worker 220*d9f75844SAndroid Build Coastguard Worker void set_video_frame_buffer( 221*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<VideoFrameBuffer>& buffer); 222*d9f75844SAndroid Build Coastguard Worker 223*d9f75844SAndroid Build Coastguard Worker // Return true if the frame is stored in a texture. is_texture()224*d9f75844SAndroid Build Coastguard Worker bool is_texture() const { 225*d9f75844SAndroid Build Coastguard Worker return video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative; 226*d9f75844SAndroid Build Coastguard Worker } 227*d9f75844SAndroid Build Coastguard Worker has_update_rect()228*d9f75844SAndroid Build Coastguard Worker bool has_update_rect() const { return update_rect_.has_value(); } 229*d9f75844SAndroid Build Coastguard Worker 230*d9f75844SAndroid Build Coastguard Worker // Returns update_rect set by the builder or set_update_rect() or whole frame 231*d9f75844SAndroid Build Coastguard Worker // rect if no update rect is available. update_rect()232*d9f75844SAndroid Build Coastguard Worker UpdateRect update_rect() const { 233*d9f75844SAndroid Build Coastguard Worker return update_rect_.value_or(UpdateRect{0, 0, width(), height()}); 234*d9f75844SAndroid Build Coastguard Worker } 235*d9f75844SAndroid Build Coastguard Worker 236*d9f75844SAndroid Build Coastguard Worker // Rectangle must be within the frame dimensions. set_update_rect(const VideoFrame::UpdateRect & update_rect)237*d9f75844SAndroid Build Coastguard Worker void set_update_rect(const VideoFrame::UpdateRect& update_rect) { 238*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_GE(update_rect.offset_x, 0); 239*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_GE(update_rect.offset_y, 0); 240*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(update_rect.offset_x + update_rect.width, width()); 241*d9f75844SAndroid Build Coastguard Worker RTC_DCHECK_LE(update_rect.offset_y + update_rect.height, height()); 242*d9f75844SAndroid Build Coastguard Worker update_rect_ = update_rect; 243*d9f75844SAndroid Build Coastguard Worker } 244*d9f75844SAndroid Build Coastguard Worker clear_update_rect()245*d9f75844SAndroid Build Coastguard Worker void clear_update_rect() { update_rect_ = absl::nullopt; } 246*d9f75844SAndroid Build Coastguard Worker 247*d9f75844SAndroid Build Coastguard Worker // Get information about packets used to assemble this video frame. Might be 248*d9f75844SAndroid Build Coastguard Worker // empty if the information isn't available. packet_infos()249*d9f75844SAndroid Build Coastguard Worker const RtpPacketInfos& packet_infos() const { return packet_infos_; } set_packet_infos(RtpPacketInfos value)250*d9f75844SAndroid Build Coastguard Worker void set_packet_infos(RtpPacketInfos value) { 251*d9f75844SAndroid Build Coastguard Worker packet_infos_ = std::move(value); 252*d9f75844SAndroid Build Coastguard Worker } 253*d9f75844SAndroid Build Coastguard Worker processing_time()254*d9f75844SAndroid Build Coastguard Worker const absl::optional<ProcessingTime> processing_time() const { 255*d9f75844SAndroid Build Coastguard Worker return processing_time_; 256*d9f75844SAndroid Build Coastguard Worker } set_processing_time(const ProcessingTime & processing_time)257*d9f75844SAndroid Build Coastguard Worker void set_processing_time(const ProcessingTime& processing_time) { 258*d9f75844SAndroid Build Coastguard Worker processing_time_ = processing_time; 259*d9f75844SAndroid Build Coastguard Worker } 260*d9f75844SAndroid Build Coastguard Worker 261*d9f75844SAndroid Build Coastguard Worker private: 262*d9f75844SAndroid Build Coastguard Worker VideoFrame(uint16_t id, 263*d9f75844SAndroid Build Coastguard Worker const rtc::scoped_refptr<VideoFrameBuffer>& buffer, 264*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_us, 265*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_rtp, 266*d9f75844SAndroid Build Coastguard Worker int64_t ntp_time_ms, 267*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation, 268*d9f75844SAndroid Build Coastguard Worker const absl::optional<ColorSpace>& color_space, 269*d9f75844SAndroid Build Coastguard Worker const RenderParameters& render_parameters, 270*d9f75844SAndroid Build Coastguard Worker const absl::optional<UpdateRect>& update_rect, 271*d9f75844SAndroid Build Coastguard Worker RtpPacketInfos packet_infos); 272*d9f75844SAndroid Build Coastguard Worker 273*d9f75844SAndroid Build Coastguard Worker uint16_t id_; 274*d9f75844SAndroid Build Coastguard Worker // An opaque reference counted handle that stores the pixel data. 275*d9f75844SAndroid Build Coastguard Worker rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; 276*d9f75844SAndroid Build Coastguard Worker uint32_t timestamp_rtp_; 277*d9f75844SAndroid Build Coastguard Worker int64_t ntp_time_ms_; 278*d9f75844SAndroid Build Coastguard Worker int64_t timestamp_us_; 279*d9f75844SAndroid Build Coastguard Worker VideoRotation rotation_; 280*d9f75844SAndroid Build Coastguard Worker absl::optional<ColorSpace> color_space_; 281*d9f75844SAndroid Build Coastguard Worker // Contains parameters that affect have the frame should be rendered. 282*d9f75844SAndroid Build Coastguard Worker RenderParameters render_parameters_; 283*d9f75844SAndroid Build Coastguard Worker // Updated since the last frame area. If present it means that the bounding 284*d9f75844SAndroid Build Coastguard Worker // box of all the changes is within the rectangular area and is close to it. 285*d9f75844SAndroid Build Coastguard Worker // If absent, it means that there's no information about the change at all and 286*d9f75844SAndroid Build Coastguard Worker // update_rect() will return a rectangle corresponding to the entire frame. 287*d9f75844SAndroid Build Coastguard Worker absl::optional<UpdateRect> update_rect_; 288*d9f75844SAndroid Build Coastguard Worker // Information about packets used to assemble this video frame. This is needed 289*d9f75844SAndroid Build Coastguard Worker // by `SourceTracker` when the frame is delivered to the RTCRtpReceiver's 290*d9f75844SAndroid Build Coastguard Worker // MediaStreamTrack, in order to implement getContributingSources(). See: 291*d9f75844SAndroid Build Coastguard Worker // https://w3c.github.io/webrtc-pc/#dom-rtcrtpreceiver-getcontributingsources 292*d9f75844SAndroid Build Coastguard Worker RtpPacketInfos packet_infos_; 293*d9f75844SAndroid Build Coastguard Worker // Processing timestamps of the frame. For received video frames these are the 294*d9f75844SAndroid Build Coastguard Worker // timestamps when the frame is sent to the decoder and the decoded image 295*d9f75844SAndroid Build Coastguard Worker // returned from the decoder. 296*d9f75844SAndroid Build Coastguard Worker // Currently, not set for locally captured video frames. 297*d9f75844SAndroid Build Coastguard Worker absl::optional<ProcessingTime> processing_time_; 298*d9f75844SAndroid Build Coastguard Worker }; 299*d9f75844SAndroid Build Coastguard Worker 300*d9f75844SAndroid Build Coastguard Worker } // namespace webrtc 301*d9f75844SAndroid Build Coastguard Worker 302*d9f75844SAndroid Build Coastguard Worker #endif // API_VIDEO_VIDEO_FRAME_H_ 303