OLD | NEW |
| (Empty) |
1 /* | |
2 * libjingle | |
3 * Copyright 2004 Google Inc. | |
4 * | |
5 * Redistribution and use in source and binary forms, with or without | |
6 * modification, are permitted provided that the following conditions are met: | |
7 * | |
8 * 1. Redistributions of source code must retain the above copyright notice, | |
9 * this list of conditions and the following disclaimer. | |
10 * 2. Redistributions in binary form must reproduce the above copyright notice, | |
11 * this list of conditions and the following disclaimer in the documentation | |
12 * and/or other materials provided with the distribution. | |
13 * 3. The name of the author may not be used to endorse or promote products | |
14 * derived from this software without specific prior written permission. | |
15 * | |
16 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED | |
17 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
18 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO | |
19 * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
20 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, | |
21 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; | |
22 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, | |
23 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR | |
24 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF | |
25 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
26 */ | |
27 | |
28 #ifndef TALK_MEDIA_BASE_VIDEOFRAME_H_ | |
29 #define TALK_MEDIA_BASE_VIDEOFRAME_H_ | |
30 | |
31 #include "webrtc/base/basictypes.h" | |
32 #include "webrtc/base/stream.h" | |
33 #include "webrtc/common_video/include/video_frame_buffer.h" | |
34 #include "webrtc/common_video/rotation.h" | |
35 | |
36 namespace cricket { | |
37 | |
38 // Represents a YUV420 (a.k.a. I420) video frame. | |
39 class VideoFrame { | |
40 public: | |
41 VideoFrame() {} | |
42 virtual ~VideoFrame() {} | |
43 | |
44 virtual bool InitToBlack(int w, int h, int64_t time_stamp) = 0; | |
45 | |
46 // Creates a frame from a raw sample with FourCC |format| and size |w| x |h|. | |
47 // |h| can be negative indicating a vertically flipped image. | |
48 // |dw| is destination width; can be less than |w| if cropping is desired. | |
49 // |dh| is destination height, like |dw|, but must be a positive number. | |
50 // Returns whether the function succeeded or failed. | |
51 | |
52 virtual bool Reset(uint32_t fourcc, | |
53 int w, | |
54 int h, | |
55 int dw, | |
56 int dh, | |
57 uint8_t* sample, | |
58 size_t sample_size, | |
59 int64_t time_stamp, | |
60 webrtc::VideoRotation rotation, | |
61 bool apply_rotation) = 0; | |
62 | |
63 // Basic accessors. | |
64 // Note this is the width and height without rotation applied. | |
65 virtual size_t GetWidth() const = 0; | |
66 virtual size_t GetHeight() const = 0; | |
67 | |
68 size_t GetChromaWidth() const { return (GetWidth() + 1) / 2; } | |
69 size_t GetChromaHeight() const { return (GetHeight() + 1) / 2; } | |
70 size_t GetChromaSize() const { return GetUPitch() * GetChromaHeight(); } | |
71 // These can return NULL if the object is not backed by a buffer. | |
72 virtual const uint8_t* GetYPlane() const = 0; | |
73 virtual const uint8_t* GetUPlane() const = 0; | |
74 virtual const uint8_t* GetVPlane() const = 0; | |
75 virtual uint8_t* GetYPlane() = 0; | |
76 virtual uint8_t* GetUPlane() = 0; | |
77 virtual uint8_t* GetVPlane() = 0; | |
78 | |
79 virtual int32_t GetYPitch() const = 0; | |
80 virtual int32_t GetUPitch() const = 0; | |
81 virtual int32_t GetVPitch() const = 0; | |
82 | |
83 // Returns the handle of the underlying video frame. This is used when the | |
84 // frame is backed by a texture. The object should be destroyed when it is no | |
85 // longer in use, so the underlying resource can be freed. | |
86 virtual void* GetNativeHandle() const = 0; | |
87 | |
88 // Returns the underlying video frame buffer. This function is ok to call | |
89 // multiple times, but the returned object will refer to the same memory. | |
90 virtual rtc::scoped_refptr<webrtc::VideoFrameBuffer> GetVideoFrameBuffer() | |
91 const = 0; | |
92 | |
93 virtual int64_t GetTimeStamp() const = 0; | |
94 virtual void SetTimeStamp(int64_t time_stamp) = 0; | |
95 | |
96 // Indicates the rotation angle in degrees. | |
97 // TODO(guoweis): Remove this function, rename GetVideoRotation and remove the | |
98 // skeleton implementation of GetRotation once chrome is updated. | |
99 virtual int GetRotation() const { return GetVideoRotation(); } | |
100 virtual webrtc::VideoRotation GetVideoRotation() const { | |
101 return webrtc::kVideoRotation_0; | |
102 } | |
103 | |
104 // Make a shallow copy of the frame. The frame buffer itself is not copied. | |
105 // Both the current and new VideoFrame will share a single reference-counted | |
106 // frame buffer. | |
107 virtual VideoFrame *Copy() const = 0; | |
108 | |
109 // Since VideoFrame supports shallow copy and the internal frame buffer might | |
110 // be shared, this function can be used to check exclusive ownership. | |
111 virtual bool IsExclusive() const = 0; | |
112 | |
113 // In case VideoFrame needs exclusive access of the frame buffer, user can | |
114 // call MakeExclusive() to make sure the frame buffer is exclusively | |
115 // accessible to the current object. This might mean a deep copy of the frame | |
116 // buffer if it is currently shared by other objects. | |
117 virtual bool MakeExclusive() = 0; | |
118 | |
119 // Writes the frame into the given frame buffer, provided that it is of | |
120 // sufficient size. Returns the frame's actual size, regardless of whether | |
121 // it was written or not (like snprintf). If there is insufficient space, | |
122 // nothing is written. | |
123 virtual size_t CopyToBuffer(uint8_t* buffer, size_t size) const; | |
124 | |
125 // Writes the frame into the given planes, stretched to the given width and | |
126 // height. The parameter "interpolate" controls whether to interpolate or just | |
127 // take the nearest-point. The parameter "crop" controls whether to crop this | |
128 // frame to the aspect ratio of the given dimensions before stretching. | |
129 virtual bool CopyToPlanes(uint8_t* dst_y, | |
130 uint8_t* dst_u, | |
131 uint8_t* dst_v, | |
132 int32_t dst_pitch_y, | |
133 int32_t dst_pitch_u, | |
134 int32_t dst_pitch_v) const; | |
135 | |
136 // Writes the frame into the target VideoFrame. | |
137 virtual void CopyToFrame(VideoFrame* target) const; | |
138 | |
139 // Return a copy of frame which has its pending rotation applied. The | |
140 // ownership of the returned frame is held by this frame. | |
141 virtual const VideoFrame* GetCopyWithRotationApplied() const = 0; | |
142 | |
143 // Writes the frame into the given stream and returns the StreamResult. | |
144 // See webrtc/base/stream.h for a description of StreamResult and error. | |
145 // Error may be NULL. If a non-success value is returned from | |
146 // StreamInterface::Write(), we immediately return with that value. | |
147 virtual rtc::StreamResult Write(rtc::StreamInterface* stream, | |
148 int* error) const; | |
149 | |
150 // Converts the I420 data to RGB of a certain type such as ARGB and ABGR. | |
151 // Returns the frame's actual size, regardless of whether it was written or | |
152 // not (like snprintf). Parameters size and stride_rgb are in units of bytes. | |
153 // If there is insufficient space, nothing is written. | |
154 virtual size_t ConvertToRgbBuffer(uint32_t to_fourcc, | |
155 uint8_t* buffer, | |
156 size_t size, | |
157 int stride_rgb) const; | |
158 | |
159 // Writes the frame into the given planes, stretched to the given width and | |
160 // height. The parameter "interpolate" controls whether to interpolate or just | |
161 // take the nearest-point. The parameter "crop" controls whether to crop this | |
162 // frame to the aspect ratio of the given dimensions before stretching. | |
163 virtual void StretchToPlanes(uint8_t* y, | |
164 uint8_t* u, | |
165 uint8_t* v, | |
166 int32_t pitchY, | |
167 int32_t pitchU, | |
168 int32_t pitchV, | |
169 size_t width, | |
170 size_t height, | |
171 bool interpolate, | |
172 bool crop) const; | |
173 | |
174 // Writes the frame into the target VideoFrame, stretched to the size of that | |
175 // frame. The parameter "interpolate" controls whether to interpolate or just | |
176 // take the nearest-point. The parameter "crop" controls whether to crop this | |
177 // frame to the aspect ratio of the target frame before stretching. | |
178 virtual void StretchToFrame(VideoFrame *target, bool interpolate, | |
179 bool crop) const; | |
180 | |
181 // Stretches the frame to the given size, creating a new VideoFrame object to | |
182 // hold it. The parameter "interpolate" controls whether to interpolate or | |
183 // just take the nearest-point. The parameter "crop" controls whether to crop | |
184 // this frame to the aspect ratio of the given dimensions before stretching. | |
185 virtual VideoFrame *Stretch(size_t w, size_t h, bool interpolate, | |
186 bool crop) const; | |
187 | |
188 // Sets the video frame to black. | |
189 virtual bool SetToBlack(); | |
190 | |
191 // Tests if sample is valid. Returns true if valid. | |
192 static bool Validate(uint32_t fourcc, | |
193 int w, | |
194 int h, | |
195 const uint8_t* sample, | |
196 size_t sample_size); | |
197 | |
198 // Size of an I420 image of given dimensions when stored as a frame buffer. | |
199 static size_t SizeOf(size_t w, size_t h) { | |
200 return w * h + ((w + 1) / 2) * ((h + 1) / 2) * 2; | |
201 } | |
202 | |
203 protected: | |
204 // Creates an empty frame. | |
205 virtual VideoFrame *CreateEmptyFrame(int w, int h, | |
206 int64_t time_stamp) const = 0; | |
207 virtual void SetRotation(webrtc::VideoRotation rotation) = 0; | |
208 }; | |
209 | |
210 } // namespace cricket | |
211 | |
212 #endif // TALK_MEDIA_BASE_VIDEOFRAME_H_ | |
OLD | NEW |