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

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

Issue 591313008: Add support for Rec709 color space videos in software YUV convert path. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: add enum to mojom Created 5 years, 11 months 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') | media/media.gyp » ('j') | 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 "gpu/GLES2/gl2extchromium.h" 7 #include "gpu/GLES2/gl2extchromium.h"
8 #include "gpu/command_buffer/client/gles2_interface.h" 8 #include "gpu/command_buffer/client/gles2_interface.h"
9 #include "gpu/command_buffer/common/mailbox_holder.h" 9 #include "gpu/command_buffer/common/mailbox_holder.h"
10 #include "media/base/video_frame.h" 10 #include "media/base/video_frame.h"
(...skipping 30 matching lines...) Expand all
41 // a temporary resource if it is not used for 3 sec. 41 // a temporary resource if it is not used for 3 sec.
42 const int kTemporaryResourceDeletionDelay = 3; // Seconds; 42 const int kTemporaryResourceDeletionDelay = 3; // Seconds;
43 43
44 bool IsYUV(media::VideoFrame::Format format) { 44 bool IsYUV(media::VideoFrame::Format format) {
45 switch (format) { 45 switch (format) {
46 case VideoFrame::YV12: 46 case VideoFrame::YV12:
47 case VideoFrame::YV16: 47 case VideoFrame::YV16:
48 case VideoFrame::I420: 48 case VideoFrame::I420:
49 case VideoFrame::YV12A: 49 case VideoFrame::YV12A:
50 case VideoFrame::YV12J: 50 case VideoFrame::YV12J:
51 case VideoFrame::YV12HD:
51 case VideoFrame::YV24: 52 case VideoFrame::YV24:
52 case VideoFrame::NV12: 53 case VideoFrame::NV12:
53 return true; 54 return true;
54 case VideoFrame::UNKNOWN: 55 case VideoFrame::UNKNOWN:
55 case VideoFrame::NATIVE_TEXTURE: 56 case VideoFrame::NATIVE_TEXTURE:
56 #if defined(VIDEO_HOLE) 57 #if defined(VIDEO_HOLE)
57 case VideoFrame::HOLE: 58 case VideoFrame::HOLE:
58 #endif // defined(VIDEO_HOLE) 59 #endif // defined(VIDEO_HOLE)
59 case VideoFrame::ARGB: 60 case VideoFrame::ARGB:
60 return false; 61 return false;
61 } 62 }
62 NOTREACHED() << "Invalid videoframe format provided: " << format; 63 NOTREACHED() << "Invalid videoframe format provided: " << format;
63 return false; 64 return false;
64 } 65 }
65 66
66 bool IsJPEGColorSpace(media::VideoFrame::Format format) { 67 bool IsJPEGColorSpace(media::VideoFrame::Format format) {
67 switch (format) { 68 switch (format) {
68 case VideoFrame::YV12J: 69 case VideoFrame::YV12J:
69 return true; 70 return true;
70 case VideoFrame::YV12: 71 case VideoFrame::YV12:
72 case VideoFrame::YV12HD:
71 case VideoFrame::YV16: 73 case VideoFrame::YV16:
72 case VideoFrame::I420: 74 case VideoFrame::I420:
73 case VideoFrame::YV12A: 75 case VideoFrame::YV12A:
74 case VideoFrame::YV24: 76 case VideoFrame::YV24:
75 case VideoFrame::NV12: 77 case VideoFrame::NV12:
76 case VideoFrame::UNKNOWN: 78 case VideoFrame::UNKNOWN:
77 case VideoFrame::NATIVE_TEXTURE: 79 case VideoFrame::NATIVE_TEXTURE:
78 #if defined(VIDEO_HOLE) 80 #if defined(VIDEO_HOLE)
79 case VideoFrame::HOLE: 81 case VideoFrame::HOLE:
80 #endif // defined(VIDEO_HOLE) 82 #endif // defined(VIDEO_HOLE)
(...skipping 30 matching lines...) Expand all
111 video_frame->visible_rect().y()) + 113 video_frame->visible_rect().y()) +
112 video_frame->visible_rect().x(); 114 video_frame->visible_rect().x();
113 // For format YV12, there is one U, V value per 2x2 block. 115 // For format YV12, there is one U, V value per 2x2 block.
114 // For format YV16, there is one U, V value per 2x1 block. 116 // For format YV16, there is one U, V value per 2x1 block.
115 uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) * 117 uv_offset = (video_frame->stride(media::VideoFrame::kUPlane) *
116 (video_frame->visible_rect().y() >> y_shift)) + 118 (video_frame->visible_rect().y() >> y_shift)) +
117 (video_frame->visible_rect().x() >> 1); 119 (video_frame->visible_rect().x() >> 1);
118 } 120 }
119 121
120 switch (video_frame->format()) { 122 switch (video_frame->format()) {
121 case media::VideoFrame::YV12: 123 case VideoFrame::YV12:
122 case media::VideoFrame::I420: 124 case VideoFrame::I420:
123 LIBYUV_I420_TO_ARGB( 125 LIBYUV_I420_TO_ARGB(
124 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 126 video_frame->data(VideoFrame::kYPlane) + y_offset,
125 video_frame->stride(media::VideoFrame::kYPlane), 127 video_frame->stride(VideoFrame::kYPlane),
126 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 128 video_frame->data(VideoFrame::kUPlane) + uv_offset,
127 video_frame->stride(media::VideoFrame::kUPlane), 129 video_frame->stride(VideoFrame::kUPlane),
128 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 130 video_frame->data(VideoFrame::kVPlane) + uv_offset,
129 video_frame->stride(media::VideoFrame::kVPlane), 131 video_frame->stride(VideoFrame::kVPlane),
130 static_cast<uint8*>(rgb_pixels), 132 static_cast<uint8*>(rgb_pixels),
131 row_bytes, 133 row_bytes,
132 video_frame->visible_rect().width(), 134 video_frame->visible_rect().width(),
133 video_frame->visible_rect().height()); 135 video_frame->visible_rect().height());
134 break; 136 break;
135 137
136 case media::VideoFrame::YV12J: 138 case VideoFrame::YV12J:
137 media::ConvertYUVToRGB32( 139 ConvertYUVToRGB32(
138 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 140 video_frame->data(VideoFrame::kYPlane) + y_offset,
139 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 141 video_frame->data(VideoFrame::kUPlane) + uv_offset,
140 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 142 video_frame->data(VideoFrame::kVPlane) + uv_offset,
141 static_cast<uint8*>(rgb_pixels), 143 static_cast<uint8*>(rgb_pixels),
142 video_frame->visible_rect().width(), 144 video_frame->visible_rect().width(),
143 video_frame->visible_rect().height(), 145 video_frame->visible_rect().height(),
144 video_frame->stride(media::VideoFrame::kYPlane), 146 video_frame->stride(VideoFrame::kYPlane),
145 video_frame->stride(media::VideoFrame::kUPlane), 147 video_frame->stride(VideoFrame::kUPlane),
146 row_bytes, 148 row_bytes,
147 media::YV12J); 149 YV12J);
148 break; 150 break;
149 151
150 case media::VideoFrame::YV16: 152 case VideoFrame::YV12HD:
153 ConvertYUVToRGB32(
154 video_frame->data(VideoFrame::kYPlane) + y_offset,
155 video_frame->data(VideoFrame::kUPlane) + uv_offset,
156 video_frame->data(VideoFrame::kVPlane) + uv_offset,
157 static_cast<uint8*>(rgb_pixels),
158 video_frame->visible_rect().width(),
159 video_frame->visible_rect().height(),
160 video_frame->stride(VideoFrame::kYPlane),
161 video_frame->stride(VideoFrame::kUPlane),
162 row_bytes,
163 YV12HD);
164 break;
165
166 case VideoFrame::YV16:
151 LIBYUV_I422_TO_ARGB( 167 LIBYUV_I422_TO_ARGB(
152 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 168 video_frame->data(VideoFrame::kYPlane) + y_offset,
153 video_frame->stride(media::VideoFrame::kYPlane), 169 video_frame->stride(VideoFrame::kYPlane),
154 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 170 video_frame->data(VideoFrame::kUPlane) + uv_offset,
155 video_frame->stride(media::VideoFrame::kUPlane), 171 video_frame->stride(VideoFrame::kUPlane),
156 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 172 video_frame->data(VideoFrame::kVPlane) + uv_offset,
157 video_frame->stride(media::VideoFrame::kVPlane), 173 video_frame->stride(VideoFrame::kVPlane),
158 static_cast<uint8*>(rgb_pixels), 174 static_cast<uint8*>(rgb_pixels),
159 row_bytes, 175 row_bytes,
160 video_frame->visible_rect().width(), 176 video_frame->visible_rect().width(),
161 video_frame->visible_rect().height()); 177 video_frame->visible_rect().height());
162 break; 178 break;
163 179
164 case media::VideoFrame::YV12A: 180 case VideoFrame::YV12A:
165 // Since libyuv doesn't support YUVA, fallback to media, which is not ARM 181 // Since libyuv doesn't support YUVA, fallback to media, which is not ARM
166 // optimized. 182 // optimized.
167 // TODO(fbarchard, mtomasz): Use libyuv, then copy the alpha channel. 183 // TODO(fbarchard, mtomasz): Use libyuv, then copy the alpha channel.
168 media::ConvertYUVAToARGB( 184 ConvertYUVAToARGB(
169 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 185 video_frame->data(VideoFrame::kYPlane) + y_offset,
170 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 186 video_frame->data(VideoFrame::kUPlane) + uv_offset,
171 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 187 video_frame->data(VideoFrame::kVPlane) + uv_offset,
172 video_frame->data(media::VideoFrame::kAPlane), 188 video_frame->data(VideoFrame::kAPlane),
173 static_cast<uint8*>(rgb_pixels), 189 static_cast<uint8*>(rgb_pixels),
174 video_frame->visible_rect().width(), 190 video_frame->visible_rect().width(),
175 video_frame->visible_rect().height(), 191 video_frame->visible_rect().height(),
176 video_frame->stride(media::VideoFrame::kYPlane), 192 video_frame->stride(VideoFrame::kYPlane),
177 video_frame->stride(media::VideoFrame::kUPlane), 193 video_frame->stride(VideoFrame::kUPlane),
178 video_frame->stride(media::VideoFrame::kAPlane), 194 video_frame->stride(VideoFrame::kAPlane),
179 row_bytes, 195 row_bytes,
180 media::YV12); 196 YV12);
181 break; 197 break;
182 198
183 case media::VideoFrame::YV24: 199 case VideoFrame::YV24:
184 libyuv::I444ToARGB( 200 libyuv::I444ToARGB(
185 video_frame->data(media::VideoFrame::kYPlane) + y_offset, 201 video_frame->data(VideoFrame::kYPlane) + y_offset,
186 video_frame->stride(media::VideoFrame::kYPlane), 202 video_frame->stride(VideoFrame::kYPlane),
187 video_frame->data(media::VideoFrame::kUPlane) + uv_offset, 203 video_frame->data(VideoFrame::kUPlane) + uv_offset,
188 video_frame->stride(media::VideoFrame::kUPlane), 204 video_frame->stride(VideoFrame::kUPlane),
189 video_frame->data(media::VideoFrame::kVPlane) + uv_offset, 205 video_frame->data(VideoFrame::kVPlane) + uv_offset,
190 video_frame->stride(media::VideoFrame::kVPlane), 206 video_frame->stride(VideoFrame::kVPlane),
191 static_cast<uint8*>(rgb_pixels), 207 static_cast<uint8*>(rgb_pixels),
192 row_bytes, 208 row_bytes,
193 video_frame->visible_rect().width(), 209 video_frame->visible_rect().width(),
194 video_frame->visible_rect().height()); 210 video_frame->visible_rect().height());
195 #if SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \ 211 #if SK_R32_SHIFT == 0 && SK_G32_SHIFT == 8 && SK_B32_SHIFT == 16 && \
196 SK_A32_SHIFT == 24 212 SK_A32_SHIFT == 24
197 libyuv::ARGBToABGR(static_cast<uint8*>(rgb_pixels), 213 libyuv::ARGBToABGR(static_cast<uint8*>(rgb_pixels),
198 row_bytes, 214 row_bytes,
199 static_cast<uint8*>(rgb_pixels), 215 static_cast<uint8*>(rgb_pixels),
200 row_bytes, 216 row_bytes,
201 video_frame->visible_rect().width(), 217 video_frame->visible_rect().width(),
202 video_frame->visible_rect().height()); 218 video_frame->visible_rect().height());
203 #endif 219 #endif
204 break; 220 break;
205 221
206 case media::VideoFrame::NATIVE_TEXTURE: { 222 case VideoFrame::NATIVE_TEXTURE: {
207 SkBitmap tmp; 223 SkBitmap tmp;
208 tmp.installPixels( 224 tmp.installPixels(
209 SkImageInfo::MakeN32Premul(video_frame->visible_rect().width(), 225 SkImageInfo::MakeN32Premul(video_frame->visible_rect().width(),
210 video_frame->visible_rect().height()), 226 video_frame->visible_rect().height()),
211 rgb_pixels, 227 rgb_pixels,
212 row_bytes); 228 row_bytes);
213 video_frame->ReadPixelsFromNativeTexture(tmp); 229 video_frame->ReadPixelsFromNativeTexture(tmp);
214 break; 230 break;
215 } 231 }
216 232
217 case media::VideoFrame::ARGB: 233 #if defined(VIDEO_HOLE)
218 default: 234 case VideoFrame::HOLE:
235 #endif // defined(VIDEO_HOLE)
236 case VideoFrame::ARGB:
237 case VideoFrame::UNKNOWN:
238 case VideoFrame::NV12:
219 NOTREACHED(); 239 NOTREACHED();
220 break;
221 } 240 }
222 } 241 }
223 242
224 bool IsSkBitmapProperlySizedTexture(const SkBitmap* bitmap, 243 bool IsSkBitmapProperlySizedTexture(const SkBitmap* bitmap,
225 const gfx::Size& size) { 244 const gfx::Size& size) {
226 return bitmap->getTexture() && bitmap->width() == size.width() && 245 return bitmap->getTexture() && bitmap->width() == size.width() &&
227 bitmap->height() == size.height(); 246 bitmap->height() == size.height();
228 } 247 }
229 248
230 bool AllocateSkBitmapTexture(GrContext* gr, 249 bool AllocateSkBitmapTexture(GrContext* gr,
(...skipping 95 matching lines...) Expand 10 before | Expand all | Expand 10 after
326 return false; 345 return false;
327 // If skia couldn't do the YUV conversion on GPU, we will on CPU. 346 // If skia couldn't do the YUV conversion on GPU, we will on CPU.
328 ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes); 347 ConvertVideoFrameToRGBPixels(frame_, pixels, row_bytes);
329 return true; 348 return true;
330 } 349 }
331 350
332 bool onGetYUV8Planes(SkISize sizes[3], 351 bool onGetYUV8Planes(SkISize sizes[3],
333 void* planes[3], 352 void* planes[3],
334 size_t row_bytes[3], 353 size_t row_bytes[3],
335 SkYUVColorSpace* color_space) override { 354 SkYUVColorSpace* color_space) override {
336 if (!frame_.get() || !IsYUV(frame_->format())) 355 if (!frame_.get() || !IsYUV(frame_->format()) ||
356 // TODO(rileya): Skia currently doesn't support Rec709 YUV conversion,
357 // Remove this case once it does. As-is we will fall back on the
358 // pure-software path in this case.
359 frame_->format() == VideoFrame::YV12HD) {
337 return false; 360 return false;
361 }
338 362
339 if (color_space) { 363 if (color_space) {
340 if (IsJPEGColorSpace(frame_->format())) 364 if (IsJPEGColorSpace(frame_->format()))
341 *color_space = kJPEG_SkYUVColorSpace; 365 *color_space = kJPEG_SkYUVColorSpace;
342 else 366 else
343 *color_space = kRec601_SkYUVColorSpace; 367 *color_space = kRec601_SkYUVColorSpace;
344 } 368 }
345 369
346 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane; 370 for (int plane = VideoFrame::kYPlane; plane <= VideoFrame::kVPlane;
347 ++plane) { 371 ++plane) {
(...skipping 244 matching lines...) Expand 10 before | Expand all | Expand 10 after
592 last_frame_timestamp_ = media::kNoTimestamp(); 616 last_frame_timestamp_ = media::kNoTimestamp();
593 } 617 }
594 618
595 void SkCanvasVideoRenderer::ResetAcceleratedLastFrame() { 619 void SkCanvasVideoRenderer::ResetAcceleratedLastFrame() {
596 accelerated_last_frame_.reset(); 620 accelerated_last_frame_.reset();
597 accelerated_generator_ = nullptr; 621 accelerated_generator_ = nullptr;
598 accelerated_last_frame_timestamp_ = media::kNoTimestamp(); 622 accelerated_last_frame_timestamp_ = media::kNoTimestamp();
599 } 623 }
600 624
601 } // namespace media 625 } // namespace media
OLDNEW
« no previous file with comments | « media/filters/ffmpeg_video_decoder.cc ('k') | media/media.gyp » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698