Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(244)

Side by Side Diff: media/filters/skcanvas_video_renderer.cc

Issue 88403004: Add plumbing for video pixel formats with JPEG color range. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add YV12J to a DCHECK Created 7 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « media/filters/ffmpeg_video_decoder.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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/skia/include/core/SkCanvas.h" 10 #include "third_party/skia/include/core/SkCanvas.h"
11 #include "third_party/skia/include/core/SkDevice.h" 11 #include "third_party/skia/include/core/SkDevice.h"
12 12
13 namespace media { 13 namespace media {
14 14
15 static bool IsEitherYV12OrYV16(media::VideoFrame::Format format) { 15 static bool IsEitherYV12OrYV16(media::VideoFrame::Format format) {
16 return format == media::VideoFrame::YV12 || format == media::VideoFrame::YV16; 16 return format == media::VideoFrame::YV12 ||
17 format == media::VideoFrame::YV16 ||
18 format == media::VideoFrame::YV12J;
17 } 19 }
18 20
19 static bool IsEitherYV12OrYV16OrNative(media::VideoFrame::Format format) { 21 static bool IsEitherYV12OrYV16OrNative(media::VideoFrame::Format format) {
20 return IsEitherYV12OrYV16(format) || 22 return IsEitherYV12OrYV16(format) ||
21 format == media::VideoFrame::NATIVE_TEXTURE; 23 format == media::VideoFrame::NATIVE_TEXTURE;
22 } 24 }
23 25
24 static bool IsEitherYV12OrYV12AOrYV16(media::VideoFrame::Format format) { 26 static bool IsEitherYV12OrYV12AOrYV16(media::VideoFrame::Format format) {
25 return IsEitherYV12OrYV16(format) || 27 return IsEitherYV12OrYV16(format) ||
26 format == media::VideoFrame::YV12A; 28 format == media::VideoFrame::YV12A;
(...skipping 53 matching lines...) Expand 10 before | Expand all | Expand 10 after
80 82
81 const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(true); 83 const SkBitmap& bitmap = canvas->getDevice()->accessBitmap(true);
82 media::YUVType yuv_type = media::YV16; 84 media::YUVType yuv_type = media::YV16;
83 int y_shift = 0; 85 int y_shift = 0;
84 if (video_frame->format() == media::VideoFrame::YV12 || 86 if (video_frame->format() == media::VideoFrame::YV12 ||
85 video_frame->format() == media::VideoFrame::YV12A) { 87 video_frame->format() == media::VideoFrame::YV12A) {
86 yuv_type = media::YV12; 88 yuv_type = media::YV12;
87 y_shift = 1; 89 y_shift = 1;
88 } 90 }
89 91
92 if (video_frame->format() == media::VideoFrame::YV12J) {
93 yuv_type = media::YV12;
94 y_shift = 1;
95 }
96
90 // Transform the destination rectangle to local coordinates. 97 // Transform the destination rectangle to local coordinates.
91 const SkMatrix& local_matrix = canvas->getTotalMatrix(); 98 const SkMatrix& local_matrix = canvas->getTotalMatrix();
92 SkRect local_dest_rect; 99 SkRect local_dest_rect;
93 local_matrix.mapRect(&local_dest_rect, dest_rect); 100 local_matrix.mapRect(&local_dest_rect, dest_rect);
94 101
95 // After projecting the destination rectangle to local coordinates, round 102 // After projecting the destination rectangle to local coordinates, round
96 // the projected rectangle to integer values, this will give us pixel values 103 // the projected rectangle to integer values, this will give us pixel values
97 // of the rectangle. 104 // of the rectangle.
98 SkIRect local_dest_irect, local_dest_irect_saved; 105 SkIRect local_dest_irect, local_dest_irect_saved;
99 local_dest_rect.round(&local_dest_irect); 106 local_dest_rect.round(&local_dest_irect);
(...skipping 110 matching lines...) Expand 10 before | Expand all | Expand 10 after
210 // in Y, U and V planes. 217 // in Y, U and V planes.
211 y_offset = (video_frame->stride(media::VideoFrame::kYPlane) * 218 y_offset = (video_frame->stride(media::VideoFrame::kYPlane) *
212 video_frame->visible_rect().y()) + 219 video_frame->visible_rect().y()) +
213 video_frame->visible_rect().x(); 220 video_frame->visible_rect().x();
214 // For format YV12, there is one U, V value per 2x2 block. 221 // For format YV12, there is one U, V value per 2x2 block.
215 // For format YV16, there is one U, V value per 2x1 block. 222 // For format YV16, there is one U, V value per 2x1 block.
216 uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) * 223 uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) *
217 (video_frame->visible_rect().y() >> y_shift)) + 224 (video_frame->visible_rect().y() >> y_shift)) +
218 (video_frame->visible_rect().x() >> 1); 225 (video_frame->visible_rect().x() >> 1);
219 } 226 }
227
220 switch (video_frame->format()) { 228 switch (video_frame->format()) {
221 case media::VideoFrame::YV12: 229 case media::VideoFrame::YV12:
230 case media::VideoFrame::YV12J:
222 media::ConvertYUVToRGB32( 231 media::ConvertYUVToRGB32(
223 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 232 video_frame->data(media::VideoFrame::kYPlane) + y_offset,
224 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 233 video_frame->data(media::VideoFrame::kUPlane) + uv_offset,
225 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 234 video_frame->data(media::VideoFrame::kVPlane) + uv_offset,
226 static_cast<uint8*>(bitmap->getPixels()), 235 static_cast<uint8*>(bitmap->getPixels()),
227 video_frame->visible_rect().width(), 236 video_frame->visible_rect().width(),
228 video_frame->visible_rect().height(), 237 video_frame->visible_rect().height(),
229 video_frame->stride(media::VideoFrame::kYPlane), 238 video_frame->stride(media::VideoFrame::kYPlane),
230 video_frame->stride(media::VideoFrame::kUPlane), 239 video_frame->stride(media::VideoFrame::kUPlane),
231 bitmap->rowBytes(), 240 bitmap->rowBytes(),
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
315 ConvertVideoFrameToBitmap(video_frame, &last_frame_); 324 ConvertVideoFrameToBitmap(video_frame, &last_frame_);
316 last_frame_timestamp_ = video_frame->GetTimestamp(); 325 last_frame_timestamp_ = video_frame->GetTimestamp();
317 } 326 }
318 327
319 // Do a slower paint using |last_frame_|. 328 // Do a slower paint using |last_frame_|.
320 paint.setFilterBitmap(true); 329 paint.setFilterBitmap(true);
321 canvas->drawBitmapRect(last_frame_, NULL, dest, &paint); 330 canvas->drawBitmapRect(last_frame_, NULL, dest, &paint);
322 } 331 }
323 332
324 } // namespace media 333 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_video_decoder.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698