aboutsummaryrefslogtreecommitdiff
path: root/talk/media/webrtc/webrtcvideoframe.h
diff options
context:
space:
mode:
authormagjed@webrtc.org <magjed@webrtc.org>2015-03-03 21:21:28 +0000
committermagjed@webrtc.org <magjed@webrtc.org>2015-03-03 21:22:26 +0000
commitc8895aa2f31e05d3bd4d29507af3bbfcaa638499 (patch)
tree370e6777dc7fbbb9072ac1d42929eff36ff4efce /talk/media/webrtc/webrtcvideoframe.h
parent8ad96605c1b7e77237358f4fd4c596480ee08738 (diff)
downloadwebrtc-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.h151
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_