diff options
author | magjed@webrtc.org <magjed@webrtc.org> | 2015-03-03 21:21:28 +0000 |
---|---|---|
committer | magjed@webrtc.org <magjed@webrtc.org> | 2015-03-03 21:22:26 +0000 |
commit | c8895aa2f31e05d3bd4d29507af3bbfcaa638499 (patch) | |
tree | 370e6777dc7fbbb9072ac1d42929eff36ff4efce /talk/media/webrtc/webrtcvideoframe.h | |
parent | 8ad96605c1b7e77237358f4fd4c596480ee08738 (diff) | |
download | webrtc-c8895aa2f31e05d3bd4d29507af3bbfcaa638499.tar.gz |
Unify underlying frame buffer in I420VideoFrame and WebRtcVideoFrame
Currently, I420VideoFrame uses three webrtc::Plane to store pixel data, and WebRtcVideoFrame uses WebRtcVideoFrame::FrameBuffer/webrtc::VideoFrame. The two subclasses WebRtcTextureVideoFrame and TextureVideoFrame use a NativeHandle to store pixel data, and there is also a class WebRtcVideoRenderFrame that wraps an I420VideoFrame.
This CL replaces these classes with a new interface VideoFrameBuffer that provides the common functionality. This makes it possible to remove deep frame copies between cricket::VideoFrame and I420VideoFrame.
Some additional minor changes are:
* Disallow creation of 0x0 texture frames.
* Remove the half-implemented ref count functions in I420VideoFrame.
* Remove the Alias functionality in WebRtcVideoFrame
The final goal is to eliminate all frame copies, but to limit the scope of this CL, some planned changes are postponed to follow-up CL:s (see planned changes in https://webrtc-codereview.appspot.com/38879004, or https://docs.google.com/document/d/1bxoJZNmlo-Z9GnQwIaWpEG6hDlL_W-bzka8Zb_K2NbA/preview). Specifically, this CL:
* Keeps empty subclasses WebRtcTextureVideoFrame and TextureVideoFrame, and just delegates the construction to the superclass.
* Keeps the deep copies from cricket::VideoFrame to I420VideoFrame.
BUG=1128
R=mflodman@webrtc.org, pbos@webrtc.org, perkj@webrtc.org, tommi@webrtc.org
Review URL: https://webrtc-codereview.appspot.com/42469004
Cr-Commit-Position: refs/heads/master@{#8580}
git-svn-id: http://webrtc.googlecode.com/svn/trunk@8580 4adac7df-926f-26a2-2b94-8c16560cd09d
Diffstat (limited to 'talk/media/webrtc/webrtcvideoframe.h')
-rw-r--r-- | talk/media/webrtc/webrtcvideoframe.h | 151 |
1 files changed, 27 insertions, 124 deletions
diff --git a/talk/media/webrtc/webrtcvideoframe.h b/talk/media/webrtc/webrtcvideoframe.h index 0317f44245..ec43af11fd 100644 --- a/talk/media/webrtc/webrtcvideoframe.h +++ b/talk/media/webrtc/webrtcvideoframe.h @@ -33,11 +33,7 @@ #include "webrtc/base/refcount.h" #include "webrtc/base/scoped_ref_ptr.h" #include "webrtc/common_types.h" -#include "webrtc/modules/interface/module_common_types.h" - -namespace webrtc { -class I420VideoFrame; -}; +#include "webrtc/common_video/interface/video_frame_buffer.h" namespace cricket { @@ -46,6 +42,9 @@ struct CapturedFrame; class WebRtcVideoFrame : public VideoFrame { public: WebRtcVideoFrame(); + WebRtcVideoFrame(const rtc::scoped_refptr<webrtc::VideoFrameBuffer>& buffer, + int64_t elapsed_time_ns, + int64_t time_stamp_ns); ~WebRtcVideoFrame(); // Creates a frame from a raw sample with FourCC "format" and size "w" x "h". @@ -61,39 +60,17 @@ class WebRtcVideoFrame : public VideoFrame { size_t sample_size, size_t pixel_width, size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp, + int64_t elapsed_time_ns, + int64_t time_stamp_ns, webrtc::VideoRotation rotation); bool Init(const CapturedFrame* frame, int dw, int dh, bool apply_rotation); void InitToEmptyBuffer(int w, int h, size_t pixel_width, size_t pixel_height, - int64_t elapsed_time, int64_t time_stamp); - - // Aliases this WebRtcVideoFrame to a CapturedFrame. |frame| must outlive - // this WebRtcVideoFrame. - bool Alias(const CapturedFrame* frame, - int dw, - int dh, - bool apply_rotation); + int64_t elapsed_time_ns, int64_t time_stamp_ns); bool InitToBlack(int w, int h, size_t pixel_width, size_t pixel_height, - int64_t elapsed_time, int64_t time_stamp); - - // Aliases this WebRtcVideoFrame to a memory buffer. |buffer| must outlive - // this WebRtcVideoFrame. - void Alias(uint8* buffer, - size_t buffer_size, - int w, - int h, - size_t pixel_width, - size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp, - webrtc::VideoRotation rotation); - - webrtc::VideoFrame* frame(); - const webrtc::VideoFrame* frame() const; + int64_t elapsed_time_ns, int64_t time_stamp_ns); // From base class VideoFrame. virtual bool Reset(uint32 format, @@ -105,8 +82,8 @@ class WebRtcVideoFrame : public VideoFrame { size_t sample_size, size_t pixel_width, size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp, + int64_t elapsed_time_ns, + int64_t time_stamp_ns, webrtc::VideoRotation rotation, bool apply_rotation); @@ -118,19 +95,21 @@ class WebRtcVideoFrame : public VideoFrame { virtual uint8* GetYPlane(); virtual uint8* GetUPlane(); virtual uint8* GetVPlane(); - virtual int32 GetYPitch() const { return frame()->Width(); } - virtual int32 GetUPitch() const { return (frame()->Width() + 1) / 2; } - virtual int32 GetVPitch() const { return (frame()->Width() + 1) / 2; } - virtual void* GetNativeHandle() const { return NULL; } + virtual int32 GetYPitch() const; + virtual int32 GetUPitch() const; + virtual int32 GetVPitch() const; + virtual void* GetNativeHandle() const; virtual size_t GetPixelWidth() const { return pixel_width_; } virtual size_t GetPixelHeight() const { return pixel_height_; } - virtual int64_t GetElapsedTime() const { return elapsed_time_; } - virtual int64_t GetTimeStamp() const { return time_stamp_; } - virtual void SetElapsedTime(int64_t elapsed_time) { - elapsed_time_ = elapsed_time; + virtual int64_t GetElapsedTime() const { return elapsed_time_ns_; } + virtual int64_t GetTimeStamp() const { return time_stamp_ns_; } + virtual void SetElapsedTime(int64_t elapsed_time_ns) { + elapsed_time_ns_ = elapsed_time_ns; + } + virtual void SetTimeStamp(int64_t time_stamp_ns) { + time_stamp_ns_ = time_stamp_ns; } - virtual void SetTimeStamp(int64_t time_stamp) { time_stamp_ = time_stamp; } virtual webrtc::VideoRotation GetVideoRotation() const { return rotation_; } @@ -141,96 +120,20 @@ class WebRtcVideoFrame : public VideoFrame { size_t size, int stride_rgb) const; private: - class FrameBuffer; - typedef rtc::RefCountedObject<FrameBuffer> RefCountedBuffer; - - void Attach(RefCountedBuffer* video_buffer, - size_t buffer_size, - int w, - int h, - size_t pixel_width, - size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp, - webrtc::VideoRotation rotation); - virtual VideoFrame* CreateEmptyFrame(int w, int h, size_t pixel_width, size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp) const; + int64_t elapsed_time_ns, + int64_t time_stamp_ns) const; - rtc::scoped_refptr<RefCountedBuffer> video_buffer_; + // An opaque reference counted handle that stores the pixel data. + rtc::scoped_refptr<webrtc::VideoFrameBuffer> video_frame_buffer_; size_t pixel_width_; size_t pixel_height_; - int64_t elapsed_time_; - int64_t time_stamp_; + int64_t elapsed_time_ns_; + int64_t time_stamp_ns_; webrtc::VideoRotation rotation_; }; -// Thin map between VideoFrame and an existing webrtc::I420VideoFrame -// to avoid having to copy the rendered VideoFrame prematurely. -// This implementation is only safe to use in a const context and should never -// be written to. -class WebRtcVideoRenderFrame : public VideoFrame { - public: - WebRtcVideoRenderFrame(const webrtc::I420VideoFrame* frame, - int64_t elapsed_time_ms); - - virtual bool InitToBlack(int w, - int h, - size_t pixel_width, - size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp) OVERRIDE; - virtual bool Reset(uint32 fourcc, - int w, - int h, - int dw, - int dh, - uint8* sample, - size_t sample_size, - size_t pixel_width, - size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp, - webrtc::VideoRotation rotation, - bool apply_rotation) OVERRIDE; - virtual size_t GetWidth() const OVERRIDE; - virtual size_t GetHeight() const OVERRIDE; - virtual const uint8* GetYPlane() const OVERRIDE; - virtual const uint8* GetUPlane() const OVERRIDE; - virtual const uint8* GetVPlane() const OVERRIDE; - virtual uint8* GetYPlane() OVERRIDE; - virtual uint8* GetUPlane() OVERRIDE; - virtual uint8* GetVPlane() OVERRIDE; - virtual int32 GetYPitch() const OVERRIDE; - virtual int32 GetUPitch() const OVERRIDE; - virtual int32 GetVPitch() const OVERRIDE; - virtual void* GetNativeHandle() const OVERRIDE; - virtual size_t GetPixelWidth() const OVERRIDE; - virtual size_t GetPixelHeight() const OVERRIDE; - virtual int64_t GetElapsedTime() const OVERRIDE; - virtual int64_t GetTimeStamp() const OVERRIDE; - virtual void SetElapsedTime(int64_t elapsed_time) OVERRIDE; - virtual void SetTimeStamp(int64_t time_stamp) OVERRIDE; - virtual webrtc::VideoRotation GetVideoRotation() const OVERRIDE; - virtual VideoFrame* Copy() const OVERRIDE; - virtual bool MakeExclusive() OVERRIDE; - virtual size_t CopyToBuffer(uint8* buffer, size_t size) const OVERRIDE; - - protected: - virtual VideoFrame* CreateEmptyFrame(int w, - int h, - size_t pixel_width, - size_t pixel_height, - int64_t elapsed_time, - int64_t time_stamp) const OVERRIDE; - - private: - const webrtc::I420VideoFrame* const frame_; - const int64_t elapsed_time_ms_; -}; - } // namespace cricket #endif // TALK_MEDIA_WEBRTCVIDEOFRAME_H_ |