OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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/filters/skcanvas_video_renderer.h" | 5 #include "media/filters/skcanvas_video_renderer.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "media/base/video_frame.h" | 8 #include "media/base/video_frame.h" |
9 #include "media/base/yuv_convert.h" | 9 #include "media/base/yuv_convert.h" |
10 #include "third_party/libyuv/include/libyuv.h" | 10 #include "third_party/libyuv/include/libyuv.h" |
(...skipping 11 matching lines...) Expand all Loading... | |
22 SK_A32_SHIFT == 24 | 22 SK_A32_SHIFT == 24 |
23 #define LIBYUV_I420_TO_ARGB libyuv::I420ToABGR | 23 #define LIBYUV_I420_TO_ARGB libyuv::I420ToABGR |
24 #define LIBYUV_I422_TO_ARGB libyuv::I422ToABGR | 24 #define LIBYUV_I422_TO_ARGB libyuv::I422ToABGR |
25 #else | 25 #else |
26 #error Unexpected Skia ARGB_8888 layout! | 26 #error Unexpected Skia ARGB_8888 layout! |
27 #endif | 27 #endif |
28 | 28 |
29 namespace media { | 29 namespace media { |
30 | 30 |
31 static bool IsYUV(media::VideoFrame::Format format) { | 31 static bool IsYUV(media::VideoFrame::Format format) { |
32 return format == media::VideoFrame::YV12 || | 32 return format == media::VideoFrame::YV12 || |
scherkus (not reviewing)
2014/09/16 00:35:08
can we switch-ify this so we future proof the code
rileya (GONE FROM CHROMIUM)
2014/09/16 00:58:32
Sgtm, done!
| |
33 format == media::VideoFrame::YV16 || | 33 format == media::VideoFrame::YV16 || |
34 format == media::VideoFrame::I420 || | 34 format == media::VideoFrame::I420 || |
35 format == media::VideoFrame::YV12A || | 35 format == media::VideoFrame::YV12A || |
36 format == media::VideoFrame::YV12J || | 36 format == media::VideoFrame::YV12J || |
37 format == media::VideoFrame::YV24; | 37 format == media::VideoFrame::YV24; |
38 } | 38 } |
39 | 39 |
40 static bool IsYUVOrNative(media::VideoFrame::Format format) { | 40 static bool IsYUVOrNative(media::VideoFrame::Format format) { |
41 return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE; | 41 return IsYUV(format) || format == media::VideoFrame::NATIVE_TEXTURE; |
42 } | 42 } |
(...skipping 154 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
197 if (!pixels) | 197 if (!pixels) |
198 return true; | 198 return true; |
199 // If skia couldn't do the YUV conversion, we will. | 199 // If skia couldn't do the YUV conversion, we will. |
200 ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes); | 200 ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes); |
201 frame_ = NULL; | 201 frame_ = NULL; |
202 return true; | 202 return true; |
203 } | 203 } |
204 | 204 |
205 virtual bool onGetYUV8Planes(SkISize sizes[3], | 205 virtual bool onGetYUV8Planes(SkISize sizes[3], |
206 void* planes[3], | 206 void* planes[3], |
207 size_t row_bytes[3]) OVERRIDE { | 207 size_t row_bytes[3], |
208 SkYUVColorSpace* colorSpace) OVERRIDE { | |
scherkus (not reviewing)
2014/09/16 00:35:09
color_space
rileya (GONE FROM CHROMIUM)
2014/09/16 00:58:32
Done.
| |
208 if (!frame_.get()) | 209 if (!frame_.get()) |
209 return false; | 210 return false; |
210 // Currently Skia only supports JPEG color range YUV. | 211 |
211 if (frame_->format() != VideoFrame::YV12J) | 212 if (!IsYUV(frame_->format())) |
212 return false; | 213 return false; |
214 | |
215 if (colorSpace) { | |
scherkus (not reviewing)
2014/09/16 00:35:08
can skia tighten up the API to guarantee this is a
rileya (GONE FROM CHROMIUM)
2014/09/16 00:58:32
In current usage (I just plumbed it in the other d
| |
216 if (frame_->format() == VideoFrame::YV12J) | |
scherkus (not reviewing)
2014/09/16 00:35:09
it's a stretch, but one day we might need 16/24-bi
rileya (GONE FROM CHROMIUM)
2014/09/16 00:58:32
Done.
| |
217 *colorSpace = kJPEG_SkYUVColorSpace; | |
218 else | |
219 *colorSpace = kRec601_SkYUVColorSpace; | |
220 } | |
221 | |
213 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane; | 222 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane; |
214 ++plane) { | 223 ++plane) { |
215 if (sizes) { | 224 if (sizes) { |
216 gfx::Size size; | 225 gfx::Size size; |
217 size = VideoFrame::PlaneSize( | 226 size = VideoFrame::PlaneSize( |
218 frame_->format(), plane, frame_->coded_size()); | 227 frame_->format(), plane, frame_->coded_size()); |
219 sizes[plane].set(size.width(), size.height()); | 228 sizes[plane].set(size.width(), size.height()); |
220 } | 229 } |
221 if (row_bytes) | 230 if (row_bytes) |
222 row_bytes[plane] = frame_->stride(plane); | 231 row_bytes[plane] = frame_->stride(plane); |
223 if (planes) | 232 if (planes) |
224 planes[plane] = frame_->data(plane); | 233 planes[plane] = frame_->data(plane); |
225 } | 234 } |
226 if (planes && row_bytes) | 235 if (planes && row_bytes) |
227 frame_ = NULL; | 236 frame_ = NULL; |
228 return true; | 237 return true; |
229 } | 238 } |
239 | |
230 public: | 240 public: |
231 | |
232 virtual void set_frame(const scoped_refptr<VideoFrame>& frame) { | 241 virtual void set_frame(const scoped_refptr<VideoFrame>& frame) { |
233 frame_ = frame; | 242 frame_ = frame; |
234 } | 243 } |
235 | 244 |
236 private: | 245 private: |
237 scoped_refptr<VideoFrame> frame_; | 246 scoped_refptr<VideoFrame> frame_; |
238 }; | 247 }; |
239 | 248 |
240 SkCanvasVideoRenderer::SkCanvasVideoRenderer() | 249 SkCanvasVideoRenderer::SkCanvasVideoRenderer() |
241 : generator_(NULL), | 250 : generator_(NULL), last_frame_timestamp_(media::kNoTimestamp()) { |
242 last_frame_timestamp_(media::kNoTimestamp()) { | |
243 last_frame_.setIsVolatile(true); | 251 last_frame_.setIsVolatile(true); |
244 } | 252 } |
245 | 253 |
246 SkCanvasVideoRenderer::~SkCanvasVideoRenderer() {} | 254 SkCanvasVideoRenderer::~SkCanvasVideoRenderer() {} |
247 | 255 |
248 void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame, | 256 void SkCanvasVideoRenderer::Paint(const scoped_refptr<VideoFrame>& video_frame, |
249 SkCanvas* canvas, | 257 SkCanvas* canvas, |
250 const gfx::RectF& dest_rect, | 258 const gfx::RectF& dest_rect, |
251 uint8 alpha, | 259 uint8 alpha, |
252 SkXfermode::Mode mode, | 260 SkXfermode::Mode mode, |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
313 SkCanvas* canvas) { | 321 SkCanvas* canvas) { |
314 Paint(video_frame, | 322 Paint(video_frame, |
315 canvas, | 323 canvas, |
316 video_frame->visible_rect(), | 324 video_frame->visible_rect(), |
317 0xff, | 325 0xff, |
318 SkXfermode::kSrc_Mode, | 326 SkXfermode::kSrc_Mode, |
319 media::VIDEO_ROTATION_0); | 327 media::VIDEO_ROTATION_0); |
320 } | 328 } |
321 | 329 |
322 } // namespace media | 330 } // namespace media |
OLD | NEW |