1 /* 2 * Copyright (c) 2014 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 WEBRTC_VIDEO_FRAME_H_ 12 #define WEBRTC_VIDEO_FRAME_H_ 13 14 #include <assert.h> 15 16 #include "webrtc/common_video/plane.h" 17 // TODO(pbos): Remove scoped_refptr include (and AddRef/Release if they're not 18 // used). 19 #include "webrtc/system_wrappers/interface/scoped_refptr.h" 20 #include "webrtc/typedefs.h" 21 22 namespace webrtc { 23 24 enum PlaneType { 25 kYPlane = 0, 26 kUPlane = 1, 27 kVPlane = 2, 28 kNumOfPlanes = 3 29 }; 30 31 class I420VideoFrame { 32 public: 33 I420VideoFrame(); 34 virtual ~I420VideoFrame(); 35 // Infrastructure for refCount implementation. 36 // Implements dummy functions for reference counting so that non reference 37 // counted instantiation can be done. These functions should not be called 38 // when creating the frame with new I420VideoFrame(). 39 // Note: do not pass a I420VideoFrame created with new I420VideoFrame() or 40 // equivalent to a scoped_refptr or memory leak will occur. AddRef()41 virtual int32_t AddRef() { 42 assert(false); 43 return -1; 44 } Release()45 virtual int32_t Release() { 46 assert(false); 47 return -1; 48 } 49 50 // CreateEmptyFrame: Sets frame dimensions and allocates buffers based 51 // on set dimensions - height and plane stride. 52 // If required size is bigger than the allocated one, new buffers of adequate 53 // size will be allocated. 54 // Return value: 0 on success, -1 on error. 55 virtual int CreateEmptyFrame(int width, 56 int height, 57 int stride_y, 58 int stride_u, 59 int stride_v); 60 61 // CreateFrame: Sets the frame's members and buffers. If required size is 62 // bigger than allocated one, new buffers of adequate size will be allocated. 63 // Return value: 0 on success, -1 on error. 64 virtual int CreateFrame(int size_y, 65 const uint8_t* buffer_y, 66 int size_u, 67 const uint8_t* buffer_u, 68 int size_v, 69 const uint8_t* buffer_v, 70 int width, 71 int height, 72 int stride_y, 73 int stride_u, 74 int stride_v); 75 76 // Copy frame: If required size is bigger than allocated one, new buffers of 77 // adequate size will be allocated. 78 // Return value: 0 on success, -1 on error. 79 virtual int CopyFrame(const I420VideoFrame& videoFrame); 80 81 // Make a copy of |this|. The caller owns the returned frame. 82 // Return value: a new frame on success, NULL on error. 83 virtual I420VideoFrame* CloneFrame() const; 84 85 // Swap Frame. 86 virtual void SwapFrame(I420VideoFrame* videoFrame); 87 88 // Get pointer to buffer per plane. 89 virtual uint8_t* buffer(PlaneType type); 90 // Overloading with const. 91 virtual const uint8_t* buffer(PlaneType type) const; 92 93 // Get allocated size per plane. 94 virtual int allocated_size(PlaneType type) const; 95 96 // Get allocated stride per plane. 97 virtual int stride(PlaneType type) const; 98 99 // Set frame width. 100 virtual int set_width(int width); 101 102 // Set frame height. 103 virtual int set_height(int height); 104 105 // Get frame width. width()106 virtual int width() const { return width_; } 107 108 // Get frame height. height()109 virtual int height() const { return height_; } 110 111 // Set frame timestamp (90kHz). set_timestamp(uint32_t timestamp)112 virtual void set_timestamp(uint32_t timestamp) { timestamp_ = timestamp; } 113 114 // Get frame timestamp (90kHz). timestamp()115 virtual uint32_t timestamp() const { return timestamp_; } 116 117 // Set capture ntp time in miliseconds. set_ntp_time_ms(int64_t ntp_time_ms)118 virtual void set_ntp_time_ms(int64_t ntp_time_ms) { 119 ntp_time_ms_ = ntp_time_ms; 120 } 121 122 // Get capture ntp time in miliseconds. ntp_time_ms()123 virtual int64_t ntp_time_ms() const { return ntp_time_ms_; } 124 125 // Set render time in miliseconds. set_render_time_ms(int64_t render_time_ms)126 virtual void set_render_time_ms(int64_t render_time_ms) { 127 render_time_ms_ = render_time_ms; 128 } 129 130 // Get render time in miliseconds. render_time_ms()131 virtual int64_t render_time_ms() const { return render_time_ms_; } 132 133 // Return true if underlying plane buffers are of zero size, false if not. 134 virtual bool IsZeroSize() const; 135 136 // Reset underlying plane buffers sizes to 0. This function doesn't 137 // clear memory. 138 virtual void ResetSize(); 139 140 // Return the handle of the underlying video frame. This is used when the 141 // frame is backed by a texture. The object should be destroyed when it is no 142 // longer in use, so the underlying resource can be freed. 143 virtual void* native_handle() const; 144 145 protected: 146 // Verifies legality of parameters. 147 // Return value: 0 on success, -1 on error. 148 virtual int CheckDimensions(int width, 149 int height, 150 int stride_y, 151 int stride_u, 152 int stride_v); 153 154 private: 155 // Get the pointer to a specific plane. 156 const Plane* GetPlane(PlaneType type) const; 157 // Overloading with non-const. 158 Plane* GetPlane(PlaneType type); 159 160 Plane y_plane_; 161 Plane u_plane_; 162 Plane v_plane_; 163 int width_; 164 int height_; 165 uint32_t timestamp_; 166 int64_t ntp_time_ms_; 167 int64_t render_time_ms_; 168 }; 169 170 enum VideoFrameType { 171 kKeyFrame = 0, 172 kDeltaFrame = 1, 173 kGoldenFrame = 2, 174 kAltRefFrame = 3, 175 kSkipFrame = 4 176 }; 177 178 // TODO(pbos): Rename EncodedFrame and reformat this class' members. 179 class EncodedImage { 180 public: EncodedImage()181 EncodedImage() 182 : _encodedWidth(0), 183 _encodedHeight(0), 184 _timeStamp(0), 185 capture_time_ms_(0), 186 _frameType(kDeltaFrame), 187 _buffer(NULL), 188 _length(0), 189 _size(0), 190 _completeFrame(false) {} 191 EncodedImage(uint8_t * buffer,uint32_t length,uint32_t size)192 EncodedImage(uint8_t* buffer, uint32_t length, uint32_t size) 193 : _encodedWidth(0), 194 _encodedHeight(0), 195 _timeStamp(0), 196 ntp_time_ms_(0), 197 capture_time_ms_(0), 198 _frameType(kDeltaFrame), 199 _buffer(buffer), 200 _length(length), 201 _size(size), 202 _completeFrame(false) {} 203 204 uint32_t _encodedWidth; 205 uint32_t _encodedHeight; 206 uint32_t _timeStamp; 207 // NTP time of the capture time in local timebase in milliseconds. 208 int64_t ntp_time_ms_; 209 int64_t capture_time_ms_; 210 VideoFrameType _frameType; 211 uint8_t* _buffer; 212 uint32_t _length; 213 uint32_t _size; 214 bool _completeFrame; 215 }; 216 217 } // namespace webrtc 218 #endif // WEBRTC_VIDEO_FRAME_H_ 219 220