|  | /* | 
|  | *  Copyright (c) 2012 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 COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H | 
|  | #define COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H | 
|  |  | 
|  | // I420VideoFrame class | 
|  | // | 
|  | // Storing and handling of YUV (I420) video frames. | 
|  |  | 
|  | #include "webrtc/common_video/plane.h" | 
|  | #include "webrtc/system_wrappers/interface/scoped_refptr.h" | 
|  | #include "webrtc/typedefs.h" | 
|  |  | 
|  | /* | 
|  | *  I420VideoFrame includes support for a reference counted impl. | 
|  | */ | 
|  |  | 
|  | namespace webrtc { | 
|  |  | 
|  | enum PlaneType { | 
|  | kYPlane = 0, | 
|  | kUPlane = 1, | 
|  | kVPlane = 2, | 
|  | kNumOfPlanes = 3 | 
|  | }; | 
|  |  | 
|  | class I420VideoFrame { | 
|  | public: | 
|  | I420VideoFrame(); | 
|  | virtual ~I420VideoFrame(); | 
|  | // Infrastructure for refCount implementation. | 
|  | // Implements dummy functions for reference counting so that non reference | 
|  | // counted instantiation can be done. These functions should not be called | 
|  | // when creating the frame with new I420VideoFrame(). | 
|  | // Note: do not pass a I420VideoFrame created with new I420VideoFrame() or | 
|  | // equivalent to a scoped_refptr or memory leak will occur. | 
|  | virtual int32_t AddRef() {assert(false); return -1;} | 
|  | virtual int32_t Release() {assert(false); return -1;} | 
|  |  | 
|  | // 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. | 
|  | virtual 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. | 
|  | virtual int CreateFrame(int size_y, const uint8_t* buffer_y, | 
|  | int size_u, const uint8_t* buffer_u, | 
|  | int size_v, const uint8_t* buffer_v, | 
|  | int width, int height, | 
|  | int stride_y, int stride_u, int stride_v); | 
|  |  | 
|  | // 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. | 
|  | virtual int CopyFrame(const I420VideoFrame& videoFrame); | 
|  |  | 
|  | // Swap Frame. | 
|  | virtual void SwapFrame(I420VideoFrame* videoFrame); | 
|  |  | 
|  | // Get pointer to buffer per plane. | 
|  | virtual uint8_t* buffer(PlaneType type); | 
|  | // Overloading with const. | 
|  | virtual const uint8_t* buffer(PlaneType type) const; | 
|  |  | 
|  | // Get allocated size per plane. | 
|  | virtual int allocated_size(PlaneType type) const; | 
|  |  | 
|  | // Get allocated stride per plane. | 
|  | virtual int stride(PlaneType type) const; | 
|  |  | 
|  | // Set frame width. | 
|  | virtual int set_width(int width); | 
|  |  | 
|  | // Set frame height. | 
|  | virtual int set_height(int height); | 
|  |  | 
|  | // Get frame width. | 
|  | virtual int width() const {return width_;} | 
|  |  | 
|  | // Get frame height. | 
|  | virtual int height() const {return height_;} | 
|  |  | 
|  | // Set frame timestamp (90kHz). | 
|  | virtual void set_timestamp(uint32_t timestamp) {timestamp_ = timestamp;} | 
|  |  | 
|  | // Get frame timestamp (90kHz). | 
|  | virtual uint32_t timestamp() const {return timestamp_;} | 
|  |  | 
|  | // Set render time in miliseconds. | 
|  | virtual void set_render_time_ms(int64_t render_time_ms) {render_time_ms_ = | 
|  | render_time_ms;} | 
|  |  | 
|  | // Get render time in miliseconds. | 
|  | virtual int64_t render_time_ms() const {return render_time_ms_;} | 
|  |  | 
|  | // Return true if underlying plane buffers are of zero size, false if not. | 
|  | virtual bool IsZeroSize() const; | 
|  |  | 
|  | // Reset underlying plane buffers sizes to 0. This function doesn't | 
|  | // clear memory. | 
|  | virtual void ResetSize(); | 
|  |  | 
|  | // 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. | 
|  | virtual void* native_handle() const; | 
|  |  | 
|  | protected: | 
|  | // Verifies legality of parameters. | 
|  | // Return value: 0 on success, -1 on error. | 
|  | virtual int CheckDimensions(int width, int height, | 
|  | int stride_y, int stride_u, int stride_v); | 
|  |  | 
|  | private: | 
|  | // Get the pointer to a specific plane. | 
|  | const Plane* GetPlane(PlaneType type) const; | 
|  | // Overloading with non-const. | 
|  | Plane* GetPlane(PlaneType type); | 
|  |  | 
|  | Plane y_plane_; | 
|  | Plane u_plane_; | 
|  | Plane v_plane_; | 
|  | int width_; | 
|  | int height_; | 
|  | uint32_t timestamp_; | 
|  | int64_t render_time_ms_; | 
|  | };  // I420VideoFrame | 
|  |  | 
|  | }  // namespace webrtc | 
|  |  | 
|  | #endif  // COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H |