/* * 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 #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 capture ntp time in miliseconds. virtual void set_ntp_time_ms(int64_t ntp_time_ms) { ntp_time_ms_ = ntp_time_ms; } // Get capture ntp time in miliseconds. virtual int64_t ntp_time_ms() const {return ntp_time_ms_;} // 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 ntp_time_ms_; int64_t render_time_ms_; }; // I420VideoFrame } // namespace webrtc #endif // COMMON_VIDEO_INTERFACE_I420_VIDEO_FRAME_H