| /* |
| * 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 WEBRTC_VIDEO_FRAME_H_ |
| #define WEBRTC_VIDEO_FRAME_H_ |
| |
| #include "webrtc/base/scoped_ref_ptr.h" |
| #include "webrtc/common_video/interface/video_frame_buffer.h" |
| #include "webrtc/common_video/rotation.h" |
| #include "webrtc/typedefs.h" |
| |
| namespace webrtc { |
| |
| class VideoFrame { |
| public: |
| VideoFrame(); |
| VideoFrame(const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer, |
| uint32_t timestamp, |
| int64_t render_time_ms, |
| VideoRotation rotation); |
| |
| // TODO(pbos): Make all create/copy functions void, they should not be able to |
| // fail (which should be RTC_DCHECK/CHECKed instead). |
| |
| // CreateEmptyFrame: Sets frame dimensions and allocates buffers based |
| // on set dimensions - height and plane stride. |
| // If required size is bigger than the allocated one, new buffers of adequate |
| // size will be allocated. |
| // Return value: 0 on success, -1 on error. |
| int CreateEmptyFrame(int width, |
| int height, |
| int stride_y, |
| int stride_u, |
| int stride_v); |
| |
| // CreateFrame: Sets the frame's members and buffers. If required size is |
| // bigger than allocated one, new buffers of adequate size will be allocated. |
| // Return value: 0 on success, -1 on error. |
| int CreateFrame(const uint8_t* buffer_y, |
| const uint8_t* buffer_u, |
| const uint8_t* buffer_v, |
| int width, |
| int height, |
| int stride_y, |
| int stride_u, |
| int stride_v); |
| |
| // TODO(guoweis): remove the previous CreateFrame when chromium has this code. |
| int CreateFrame(const uint8_t* buffer_y, |
| const uint8_t* buffer_u, |
| const uint8_t* buffer_v, |
| int width, |
| int height, |
| int stride_y, |
| int stride_u, |
| int stride_v, |
| VideoRotation rotation); |
| |
| // CreateFrame: Sets the frame's members and buffers. If required size is |
| // bigger than allocated one, new buffers of adequate size will be allocated. |
| // |buffer| must be a packed I420 buffer. |
| // Return value: 0 on success, -1 on error. |
| int CreateFrame(const uint8_t* buffer, |
| int width, |
| int height, |
| VideoRotation rotation); |
| |
| // Deep copy frame: If required size is bigger than allocated one, new |
| // buffers of adequate size will be allocated. |
| // Return value: 0 on success, -1 on error. |
| int CopyFrame(const VideoFrame& videoFrame); |
| |
| // Creates a shallow copy of |videoFrame|, i.e, the this object will retain a |
| // reference to the video buffer also retained by |videoFrame|. |
| void ShallowCopy(const VideoFrame& videoFrame); |
| |
| // Release frame buffer and reset time stamps. |
| void Reset(); |
| |
| // Get pointer to buffer per plane. |
| uint8_t* buffer(PlaneType type); |
| // Overloading with const. |
| const uint8_t* buffer(PlaneType type) const; |
| |
| // Get allocated size per plane. |
| int allocated_size(PlaneType type) const; |
| |
| // Get allocated stride per plane. |
| int stride(PlaneType type) const; |
| |
| // Get frame width. |
| int width() const; |
| |
| // Get frame height. |
| int height() const; |
| |
| // Set frame timestamp (90kHz). |
| void set_timestamp(uint32_t timestamp) { timestamp_ = timestamp; } |
| |
| // Get frame timestamp (90kHz). |
| uint32_t timestamp() const { return timestamp_; } |
| |
| // Set capture ntp time in miliseconds. |
| void set_ntp_time_ms(int64_t ntp_time_ms) { |
| ntp_time_ms_ = ntp_time_ms; |
| } |
| |
| // Get capture ntp time in miliseconds. |
| 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; |
| } |
| |
| // Set render time in miliseconds. |
| void set_render_time_ms(int64_t render_time_ms) { |
| render_time_ms_ = render_time_ms; |
| } |
| |
| // Get render time in miliseconds. |
| int64_t render_time_ms() const { return render_time_ms_; } |
| |
| // Return true if underlying plane buffers are of zero size, false if not. |
| bool IsZeroSize() const; |
| |
| // Return the handle of the underlying video frame. This is used when the |
| // frame is backed by a texture. The object should be destroyed when it is no |
| // longer in use, so the underlying resource can be freed. |
| void* native_handle() const; |
| |
| // Return the underlying buffer. |
| rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer() const; |
| |
| // Set the underlying buffer. |
| void set_video_frame_buffer( |
| const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer); |
| |
| // Convert native-handle frame to memory-backed I420 frame. Should not be |
| // called on a non-native-handle frame. |
| VideoFrame ConvertNativeToI420Frame() const; |
| |
| private: |
| // An opaque reference counted handle that stores the pixel data. |
| rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; |
| uint32_t timestamp_; |
| int64_t ntp_time_ms_; |
| int64_t render_time_ms_; |
| VideoRotation rotation_; |
| }; |
| |
| enum VideoFrameType { |
| kKeyFrame = 0, |
| kDeltaFrame = 1, |
| kGoldenFrame = 2, |
| kAltRefFrame = 3, |
| kSkipFrame = 4 |
| }; |
| |
| // TODO(pbos): Rename EncodedFrame and reformat this class' members. |
| class EncodedImage { |
| public: |
| EncodedImage() : EncodedImage(nullptr, 0, 0) {} |
| EncodedImage(uint8_t* buffer, size_t length, size_t size) |
| : _buffer(buffer), _length(length), _size(size) {} |
| |
| uint32_t _encodedWidth = 0; |
| uint32_t _encodedHeight = 0; |
| uint32_t _timeStamp = 0; |
| // NTP time of the capture time in local timebase in milliseconds. |
| int64_t ntp_time_ms_ = 0; |
| int64_t capture_time_ms_ = 0; |
| // TODO(pbos): Use webrtc::FrameType directly (and remove VideoFrameType). |
| VideoFrameType _frameType = kDeltaFrame; |
| uint8_t* _buffer; |
| size_t _length; |
| size_t _size; |
| bool _completeFrame = false; |
| }; |
| |
| } // namespace webrtc |
| #endif // WEBRTC_VIDEO_FRAME_H_ |