OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "media/base/video_frame.h" | 5 #include "media/base/video_frame.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 | 8 |
9 namespace media { | 9 namespace media { |
10 | 10 |
11 // static | 11 // static |
12 scoped_refptr<VideoFrame> VideoFrame::CreateFrame( | 12 scoped_refptr<VideoFrame> VideoFrame::CreateFrame( |
13 VideoFrame::Format format, | 13 VideoFrame::Format format, |
14 size_t width, | 14 size_t width, |
15 size_t height, | 15 size_t height, |
16 base::TimeDelta timestamp, | 16 base::TimeDelta timestamp, |
17 base::TimeDelta duration) { | 17 base::TimeDelta duration) { |
18 DCHECK(width > 0 && height > 0); | 18 DCHECK(width > 0 && height > 0); |
19 DCHECK(width * height < 100000000); | 19 DCHECK(width * height < 100000000); |
20 scoped_refptr<VideoFrame> frame(new VideoFrame( | 20 scoped_refptr<VideoFrame> frame(new VideoFrame(format, width, height)); |
21 format, width, height, timestamp, duration)); | 21 frame->SetTimestamp(timestamp); |
| 22 frame->SetDuration(duration); |
22 switch (format) { | 23 switch (format) { |
23 case VideoFrame::RGB555: | 24 case VideoFrame::RGB555: |
24 case VideoFrame::RGB565: | 25 case VideoFrame::RGB565: |
25 frame->AllocateRGB(2u); | 26 frame->AllocateRGB(2u); |
26 break; | 27 break; |
27 case VideoFrame::RGB24: | 28 case VideoFrame::RGB24: |
28 frame->AllocateRGB(3u); | 29 frame->AllocateRGB(3u); |
29 break; | 30 break; |
30 case VideoFrame::RGB32: | 31 case VideoFrame::RGB32: |
31 case VideoFrame::RGBA: | 32 case VideoFrame::RGBA: |
32 frame->AllocateRGB(4u); | 33 frame->AllocateRGB(4u); |
33 break; | 34 break; |
34 case VideoFrame::YV12: | 35 case VideoFrame::YV12: |
35 case VideoFrame::YV16: | 36 case VideoFrame::YV16: |
36 frame->AllocateYUV(); | 37 frame->AllocateYUV(); |
37 break; | 38 break; |
38 case VideoFrame::ASCII: | 39 case VideoFrame::ASCII: |
39 frame->AllocateRGB(1u); | 40 frame->AllocateRGB(1u); |
40 break; | 41 break; |
41 default: | 42 default: |
42 NOTREACHED(); | 43 NOTREACHED(); |
43 return NULL; | 44 return NULL; |
44 } | 45 } |
45 return frame; | 46 return frame; |
46 } | 47 } |
47 | 48 |
48 // static | 49 // static |
49 scoped_refptr<VideoFrame> VideoFrame::WrapNativeTexture( | |
50 uint32 texture_id, | |
51 size_t width, | |
52 size_t height, | |
53 base::TimeDelta timestamp, | |
54 base::TimeDelta duration, | |
55 const base::Closure& no_longer_needed) { | |
56 scoped_refptr<VideoFrame> frame( | |
57 new VideoFrame(NATIVE_TEXTURE, width, height, timestamp, duration)); | |
58 frame->planes_ = 0; | |
59 frame->texture_id_ = texture_id; | |
60 frame->texture_no_longer_needed_ = no_longer_needed; | |
61 return frame; | |
62 } | |
63 | |
64 // static | |
65 scoped_refptr<VideoFrame> VideoFrame::CreateEmptyFrame() { | 50 scoped_refptr<VideoFrame> VideoFrame::CreateEmptyFrame() { |
66 return new VideoFrame( | 51 return new VideoFrame(VideoFrame::EMPTY, 0, 0); |
67 VideoFrame::EMPTY, 0, 0, base::TimeDelta(), base::TimeDelta()); | |
68 } | 52 } |
69 | 53 |
70 // static | 54 // static |
71 scoped_refptr<VideoFrame> VideoFrame::CreateBlackFrame(int width, int height) { | 55 scoped_refptr<VideoFrame> VideoFrame::CreateBlackFrame(int width, int height) { |
72 DCHECK_GT(width, 0); | 56 DCHECK_GT(width, 0); |
73 DCHECK_GT(height, 0); | 57 DCHECK_GT(height, 0); |
74 | 58 |
75 // Create our frame. | 59 // Create our frame. |
76 const base::TimeDelta kZero; | 60 const base::TimeDelta kZero; |
77 scoped_refptr<VideoFrame> frame = | 61 scoped_refptr<VideoFrame> frame = |
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
147 data_[VideoFrame::kYPlane] = data; | 131 data_[VideoFrame::kYPlane] = data; |
148 data_[VideoFrame::kUPlane] = data + y_bytes; | 132 data_[VideoFrame::kUPlane] = data + y_bytes; |
149 data_[VideoFrame::kVPlane] = data + y_bytes + uv_bytes; | 133 data_[VideoFrame::kVPlane] = data + y_bytes + uv_bytes; |
150 strides_[VideoFrame::kYPlane] = y_stride; | 134 strides_[VideoFrame::kYPlane] = y_stride; |
151 strides_[VideoFrame::kUPlane] = uv_stride; | 135 strides_[VideoFrame::kUPlane] = uv_stride; |
152 strides_[VideoFrame::kVPlane] = uv_stride; | 136 strides_[VideoFrame::kVPlane] = uv_stride; |
153 } | 137 } |
154 | 138 |
155 VideoFrame::VideoFrame(VideoFrame::Format format, | 139 VideoFrame::VideoFrame(VideoFrame::Format format, |
156 size_t width, | 140 size_t width, |
157 size_t height, | 141 size_t height) |
158 base::TimeDelta timestamp, | |
159 base::TimeDelta duration) | |
160 : format_(format), | 142 : format_(format), |
161 width_(width), | 143 width_(width), |
162 height_(height), | 144 height_(height), |
163 planes_(0), | 145 planes_(0) { |
164 texture_id_(0) { | |
165 SetTimestamp(timestamp); | |
166 SetDuration(duration); | |
167 memset(&strides_, 0, sizeof(strides_)); | 146 memset(&strides_, 0, sizeof(strides_)); |
168 memset(&data_, 0, sizeof(data_)); | 147 memset(&data_, 0, sizeof(data_)); |
169 } | 148 } |
170 | 149 |
171 VideoFrame::~VideoFrame() { | 150 VideoFrame::~VideoFrame() { |
172 if (format_ == NATIVE_TEXTURE && !texture_no_longer_needed_.is_null()) { | |
173 texture_no_longer_needed_.Run(); | |
174 texture_no_longer_needed_.Reset(); | |
175 } | |
176 | |
177 // In multi-plane allocations, only a single block of memory is allocated | 151 // In multi-plane allocations, only a single block of memory is allocated |
178 // on the heap, and other |data| pointers point inside the same, single block | 152 // on the heap, and other |data| pointers point inside the same, single block |
179 // so just delete index 0. | 153 // so just delete index 0. |
180 delete[] data_[0]; | 154 delete[] data_[0]; |
181 } | 155 } |
182 | 156 |
183 bool VideoFrame::IsValidPlane(size_t plane) const { | 157 bool VideoFrame::IsValidPlane(size_t plane) const { |
184 switch (format_) { | 158 switch (format_) { |
185 case RGB555: | 159 case RGB555: |
186 case RGB565: | 160 case RGB565: |
187 case RGB24: | 161 case RGB24: |
188 case RGB32: | 162 case RGB32: |
189 case RGBA: | 163 case RGBA: |
190 return plane == kRGBPlane; | 164 return plane == kRGBPlane; |
191 | 165 |
192 case YV12: | 166 case YV12: |
193 case YV16: | 167 case YV16: |
194 return plane == kYPlane || plane == kUPlane || plane == kVPlane; | 168 return plane == kYPlane || plane == kUPlane || plane == kVPlane; |
195 | 169 |
196 case NATIVE_TEXTURE: | |
197 NOTREACHED() << "NATIVE_TEXTUREs don't use plane-related methods!"; | |
198 return false; | |
199 | |
200 default: | 170 default: |
201 break; | 171 break; |
202 } | 172 } |
203 | 173 |
204 // Intentionally leave out non-production formats. | 174 // Intentionally leave out non-production formats. |
205 NOTREACHED() << "Unsupported video frame format: " << format_; | 175 NOTREACHED() << "Unsupported video frame format: " << format_; |
206 return false; | 176 return false; |
207 } | 177 } |
208 | 178 |
209 int VideoFrame::stride(size_t plane) const { | 179 int VideoFrame::stride(size_t plane) const { |
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
259 // Intentionally leave out non-production formats. | 229 // Intentionally leave out non-production formats. |
260 NOTREACHED() << "Unsupported video frame format: " << format_; | 230 NOTREACHED() << "Unsupported video frame format: " << format_; |
261 return 0; | 231 return 0; |
262 } | 232 } |
263 | 233 |
264 uint8* VideoFrame::data(size_t plane) const { | 234 uint8* VideoFrame::data(size_t plane) const { |
265 DCHECK(IsValidPlane(plane)); | 235 DCHECK(IsValidPlane(plane)); |
266 return data_[plane]; | 236 return data_[plane]; |
267 } | 237 } |
268 | 238 |
269 uint32 VideoFrame::texture_id() const { | |
270 DCHECK_EQ(format_, NATIVE_TEXTURE); | |
271 DCHECK_EQ(planes_, 0U); | |
272 return texture_id_; | |
273 } | |
274 | |
275 bool VideoFrame::IsEndOfStream() const { | 239 bool VideoFrame::IsEndOfStream() const { |
276 return format_ == VideoFrame::EMPTY; | 240 return format_ == VideoFrame::EMPTY; |
277 } | 241 } |
278 | 242 |
279 } // namespace media | 243 } // namespace media |
OLD | NEW |