| /* |
| * Copyright (c) 2014 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_VIDEO_VIDEO_FRAME_H_ |
| #define API_VIDEO_VIDEO_FRAME_H_ |
| |
| #include <stdint.h> |
| |
| #include "absl/types/optional.h" |
| #include "api/video/color_space.h" |
| #include "api/video/hdr_metadata.h" |
| #include "api/video/video_frame_buffer.h" |
| #include "api/video/video_rotation.h" |
| #include "rtc_base/scoped_ref_ptr.h" |
| #include "rtc_base/system/rtc_export.h" |
| |
| namespace webrtc { |
| |
| class RTC_EXPORT VideoFrame { |
| public: |
| // Preferred way of building VideoFrame objects. |
| class Builder { |
| public: |
| Builder(); |
| ~Builder(); |
| |
| VideoFrame build(); |
| Builder& set_video_frame_buffer( |
| const rtc::scoped_refptr<VideoFrameBuffer>& buffer); |
| Builder& set_timestamp_ms(int64_t timestamp_ms); |
| Builder& set_timestamp_us(int64_t timestamp_us); |
| Builder& set_timestamp_rtp(uint32_t timestamp_rtp); |
| Builder& set_ntp_time_ms(int64_t ntp_time_ms); |
| Builder& set_rotation(VideoRotation rotation); |
| Builder& set_color_space(const ColorSpace& color_space); |
| Builder& set_hdr_metadata(const HdrMetadata* hdr_metadata); |
| |
| private: |
| rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; |
| int64_t timestamp_us_ = 0; |
| uint32_t timestamp_rtp_ = 0; |
| int64_t ntp_time_ms_ = 0; |
| VideoRotation rotation_ = kVideoRotation_0; |
| absl::optional<ColorSpace> color_space_; |
| absl::optional<HdrMetadata> hdr_metadata_; |
| }; |
| |
| // To be deprecated. Migrate all use to Builder. |
| VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, |
| webrtc::VideoRotation rotation, |
| int64_t timestamp_us); |
| VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, |
| uint32_t timestamp_rtp, |
| int64_t render_time_ms, |
| VideoRotation rotation); |
| |
| ~VideoFrame(); |
| |
| // Support move and copy. |
| VideoFrame(const VideoFrame&); |
| VideoFrame(VideoFrame&&); |
| VideoFrame& operator=(const VideoFrame&); |
| VideoFrame& operator=(VideoFrame&&); |
| |
| // Get frame width. |
| int width() const; |
| // Get frame height. |
| int height() const; |
| // Get frame size in pixels. |
| uint32_t size() const; |
| |
| // System monotonic clock, same timebase as rtc::TimeMicros(). |
| int64_t timestamp_us() const { return timestamp_us_; } |
| void set_timestamp_us(int64_t timestamp_us) { timestamp_us_ = timestamp_us; } |
| |
| // TODO(nisse): After the cricket::VideoFrame and webrtc::VideoFrame |
| // merge, timestamps other than timestamp_us will likely be |
| // deprecated. |
| |
| // Set frame timestamp (90kHz). |
| void set_timestamp(uint32_t timestamp) { timestamp_rtp_ = timestamp; } |
| |
| // Get frame timestamp (90kHz). |
| uint32_t timestamp() const { return timestamp_rtp_; } |
| |
| // For now, transport_frame_id and rtp timestamp are the same. |
| // TODO(nisse): Must be handled differently for QUIC. |
| uint32_t transport_frame_id() const { return timestamp(); } |
| |
| // Set capture ntp time in milliseconds. |
| // TODO(nisse): Deprecated. Migrate all users to timestamp_us(). |
| void set_ntp_time_ms(int64_t ntp_time_ms) { ntp_time_ms_ = ntp_time_ms; } |
| |
| // Get capture ntp time in milliseconds. |
| // TODO(nisse): Deprecated. Migrate all users to timestamp_us(). |
| int64_t ntp_time_ms() const { return ntp_time_ms_; } |
| |
| // Naming convention for Coordination of Video Orientation. Please see |
| // http://www.etsi.org/deliver/etsi_ts/126100_126199/126114/12.07.00_60/ts_126114v120700p.pdf |
| // |
| // "pending rotation" or "pending" = a frame that has a VideoRotation > 0. |
| // |
| // "not pending" = a frame that has a VideoRotation == 0. |
| // |
| // "apply rotation" = modify a frame from being "pending" to being "not |
| // pending" rotation (a no-op for "unrotated"). |
| // |
| VideoRotation rotation() const { return rotation_; } |
| void set_rotation(VideoRotation rotation) { rotation_ = rotation; } |
| |
| // Get color space when available. |
| absl::optional<ColorSpace> color_space() const { return color_space_; } |
| |
| // Get HDR metadata when available. |
| const HdrMetadata* hdr_metadata() const { |
| return hdr_metadata_ ? &*hdr_metadata_ : nullptr; |
| } |
| |
| // Get render time in milliseconds. |
| // TODO(nisse): Deprecated. Migrate all users to timestamp_us(). |
| int64_t render_time_ms() const; |
| |
| // Return the underlying buffer. Never nullptr for a properly |
| // initialized VideoFrame. |
| rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer() const; |
| |
| // TODO(nisse): Deprecated. |
| // Return true if the frame is stored in a texture. |
| bool is_texture() const { |
| return video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative; |
| } |
| |
| private: |
| VideoFrame(const rtc::scoped_refptr<VideoFrameBuffer>& buffer, |
| int64_t timestamp_us, |
| uint32_t timestamp_rtp, |
| int64_t ntp_time_ms, |
| VideoRotation rotation, |
| const absl::optional<ColorSpace>& color_space, |
| const absl::optional<HdrMetadata>& hdr_metadata); |
| |
| // An opaque reference counted handle that stores the pixel data. |
| rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; |
| uint32_t timestamp_rtp_; |
| int64_t ntp_time_ms_; |
| int64_t timestamp_us_; |
| VideoRotation rotation_; |
| absl::optional<ColorSpace> color_space_; |
| absl::optional<HdrMetadata> hdr_metadata_; |
| }; |
| |
| } // namespace webrtc |
| |
| #endif // API_VIDEO_VIDEO_FRAME_H_ |