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

Side by Side Diff: cc/output/renderer_pixeltest.cc

Issue 1852923002: Enable sampling from DXGI NV12 formats in GLRenderer. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 4 years, 8 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
OLDNEW
1 // Copyright 2012 The Chromium Authors. All rights reserved. 1 // Copyright 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 <stddef.h> 5 #include <stddef.h>
6 #include <stdint.h> 6 #include <stdint.h>
7 7
8 #include "base/message_loop/message_loop.h" 8 #include "base/message_loop/message_loop.h"
9 #include "cc/output/gl_renderer.h" 9 #include "cc/output/gl_renderer.h"
10 #include "cc/quads/draw_quad.h" 10 #include "cc/quads/draw_quad.h"
(...skipping 210 matching lines...) Expand 10 before | Expand all | Expand 10 after
221 resources.release_callbacks.size()); 221 resources.release_callbacks.size());
222 222
223 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox( 223 ResourceId y_resource = resource_provider->CreateResourceFromTextureMailbox(
224 resources.mailboxes[media::VideoFrame::kYPlane], 224 resources.mailboxes[media::VideoFrame::kYPlane],
225 SingleReleaseCallbackImpl::Create( 225 SingleReleaseCallbackImpl::Create(
226 resources.release_callbacks[media::VideoFrame::kYPlane])); 226 resources.release_callbacks[media::VideoFrame::kYPlane]));
227 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox( 227 ResourceId u_resource = resource_provider->CreateResourceFromTextureMailbox(
228 resources.mailboxes[media::VideoFrame::kUPlane], 228 resources.mailboxes[media::VideoFrame::kUPlane],
229 SingleReleaseCallbackImpl::Create( 229 SingleReleaseCallbackImpl::Create(
230 resources.release_callbacks[media::VideoFrame::kUPlane])); 230 resources.release_callbacks[media::VideoFrame::kUPlane]));
231 ResourceId v_resource = resource_provider->CreateResourceFromTextureMailbox( 231 ResourceId v_resource = u_resource;
232 resources.mailboxes[media::VideoFrame::kVPlane], 232 if (video_frame->format() != media::PIXEL_FORMAT_NV12) {
233 SingleReleaseCallbackImpl::Create( 233 v_resource = resource_provider->CreateResourceFromTextureMailbox(
234 resources.release_callbacks[media::VideoFrame::kVPlane])); 234 resources.mailboxes[media::VideoFrame::kVPlane],
235 SingleReleaseCallbackImpl::Create(
236 resources.release_callbacks[media::VideoFrame::kVPlane]));
237 }
235 ResourceId a_resource = 0; 238 ResourceId a_resource = 0;
236 if (with_alpha) { 239 if (with_alpha) {
237 a_resource = resource_provider->CreateResourceFromTextureMailbox( 240 a_resource = resource_provider->CreateResourceFromTextureMailbox(
238 resources.mailboxes[media::VideoFrame::kAPlane], 241 resources.mailboxes[media::VideoFrame::kAPlane],
239 SingleReleaseCallbackImpl::Create( 242 SingleReleaseCallbackImpl::Create(
240 resources.release_callbacks[media::VideoFrame::kAPlane])); 243 resources.release_callbacks[media::VideoFrame::kAPlane]));
241 } 244 }
242 245
243 const gfx::Size ya_tex_size = video_frame->coded_size(); 246 const gfx::Size ya_tex_size = video_frame->coded_size();
244 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize( 247 const gfx::Size uv_tex_size = media::VideoFrame::PlaneSize(
245 video_frame->format(), media::VideoFrame::kUPlane, 248 video_frame->format(), media::VideoFrame::kUPlane,
246 video_frame->coded_size()); 249 video_frame->coded_size());
247 DCHECK(uv_tex_size == media::VideoFrame::PlaneSize( 250 if (media::VideoFrame::NumPlanes(video_frame->format()) >
248 video_frame->format(), media::VideoFrame::kVPlane, 251 media::VideoFrame::kVPlane) {
249 video_frame->coded_size())); 252 DCHECK(uv_tex_size == media::VideoFrame::PlaneSize(
253 video_frame->format(), media::VideoFrame::kVPlane,
254 video_frame->coded_size()));
255 }
250 if (with_alpha) { 256 if (with_alpha) {
251 DCHECK(ya_tex_size == media::VideoFrame::PlaneSize( 257 DCHECK(ya_tex_size == media::VideoFrame::PlaneSize(
252 video_frame->format(), media::VideoFrame::kAPlane, 258 video_frame->format(), media::VideoFrame::kAPlane,
253 video_frame->coded_size())); 259 video_frame->coded_size()));
254 } 260 }
255 261
256 gfx::RectF ya_tex_coord_rect(tex_coord_rect.x() * ya_tex_size.width(), 262 gfx::RectF ya_tex_coord_rect(tex_coord_rect.x() * ya_tex_size.width(),
257 tex_coord_rect.y() * ya_tex_size.height(), 263 tex_coord_rect.y() * ya_tex_size.height(),
258 tex_coord_rect.width() * ya_tex_size.width(), 264 tex_coord_rect.width() * ya_tex_size.width(),
259 tex_coord_rect.height() * ya_tex_size.height()); 265 tex_coord_rect.height() * ya_tex_size.height());
(...skipping 190 matching lines...) Expand 10 before | Expand all | Expand 10 after
450 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame( 456 scoped_refptr<media::VideoFrame> video_frame = media::VideoFrame::CreateFrame(
451 format, rect.size(), rect, rect.size(), base::TimeDelta()); 457 format, rect.size(), rect, rect.size(), base::TimeDelta());
452 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE, 458 video_frame->metadata()->SetInteger(media::VideoFrameMetadata::COLOR_SPACE,
453 color_space); 459 color_space);
454 460
455 // YUV values of a solid, constant, color. Useful for testing that color 461 // YUV values of a solid, constant, color. Useful for testing that color
456 // space/color range are being handled properly. 462 // space/color range are being handled properly.
457 memset(video_frame->data(media::VideoFrame::kYPlane), y, 463 memset(video_frame->data(media::VideoFrame::kYPlane), y,
458 video_frame->stride(media::VideoFrame::kYPlane) * 464 video_frame->stride(media::VideoFrame::kYPlane) *
459 video_frame->rows(media::VideoFrame::kYPlane)); 465 video_frame->rows(media::VideoFrame::kYPlane));
460 memset(video_frame->data(media::VideoFrame::kUPlane), u, 466 if (format == media::PIXEL_FORMAT_NV12) {
461 video_frame->stride(media::VideoFrame::kUPlane) * 467 uint8_t* data = video_frame->data(media::VideoFrame::kUVPlane);
462 video_frame->rows(media::VideoFrame::kUPlane)); 468 int stride = video_frame->stride(media::VideoFrame::kUVPlane);
463 memset(video_frame->data(media::VideoFrame::kVPlane), v, 469 gfx::Size plane_size = video_frame->PlaneSize(video_frame->format(),
464 video_frame->stride(media::VideoFrame::kVPlane) * 470 media::VideoFrame::kUVPlane,
465 video_frame->rows(media::VideoFrame::kVPlane)); 471 video_frame->coded_size());
472
473 for (int y = 0; y < plane_size.height(); ++y) {
474 for (int x = 0; x < plane_size.width(); ++x) {
475 data[x * 2] = u;
476 data[x * 2 + 1] = v;
477 }
478 data += stride;
479 }
480 } else {
481 memset(video_frame->data(media::VideoFrame::kUPlane), u,
482 video_frame->stride(media::VideoFrame::kUPlane) *
483 video_frame->rows(media::VideoFrame::kUPlane));
484 memset(video_frame->data(media::VideoFrame::kVPlane), v,
485 video_frame->stride(media::VideoFrame::kVPlane) *
486 video_frame->rows(media::VideoFrame::kVPlane));
487 }
466 488
467 uint8_t alpha_value = is_transparent ? 0 : 128; 489 uint8_t alpha_value = is_transparent ? 0 : 128;
468 CreateTestYUVVideoDrawQuad_FromVideoFrame( 490 CreateTestYUVVideoDrawQuad_FromVideoFrame(
469 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass, 491 shared_state, video_frame, alpha_value, tex_coord_rect, render_pass,
470 video_resource_updater, rect, visible_rect, resource_provider); 492 video_resource_updater, rect, visible_rect, resource_provider);
471 } 493 }
472 494
473 typedef ::testing::Types<GLRenderer, 495 typedef ::testing::Types<GLRenderer,
474 SoftwareRenderer, 496 SoftwareRenderer,
475 GLRendererWithExpandedViewport, 497 GLRendererWithExpandedViewport,
(...skipping 672 matching lines...) Expand 10 before | Expand all | Expand 10 after
1148 video_resource_updater_.get(), rect, rect, resource_provider_.get()); 1170 video_resource_updater_.get(), rect, rect, resource_provider_.get());
1149 1171
1150 RenderPassList pass_list; 1172 RenderPassList pass_list;
1151 pass_list.push_back(std::move(pass)); 1173 pass_list.push_back(std::move(pass));
1152 1174
1153 EXPECT_TRUE(this->RunPixelTest(&pass_list, 1175 EXPECT_TRUE(this->RunPixelTest(&pass_list,
1154 base::FilePath(FILE_PATH_LITERAL("green.png")), 1176 base::FilePath(FILE_PATH_LITERAL("green.png")),
1155 FuzzyPixelOffByOneComparator(true))); 1177 FuzzyPixelOffByOneComparator(true)));
1156 } 1178 }
1157 1179
1180 TEST_F(VideoGLRendererPixelTest, SimpleNV12JRect) {
1181 gfx::Rect rect(this->device_viewport_size_);
1182
1183 RenderPassId id(1, 1);
1184 scoped_ptr<RenderPass> pass = CreateTestRootRenderPass(id, rect);
1185
1186 SharedQuadState* shared_state =
1187 CreateTestSharedQuadState(gfx::Transform(), rect, pass.get());
1188
1189 // YUV of (149,43,21) should be green (0,255,0) in RGB.
1190 CreateTestYUVVideoDrawQuad_Solid(
1191 shared_state, media::PIXEL_FORMAT_NV12, media::COLOR_SPACE_JPEG, false,
1192 gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f), 149, 43, 21, pass.get(),
1193 video_resource_updater_.get(), rect, rect, resource_provider_.get());
1194
1195 RenderPassList pass_list;
1196 pass_list.push_back(std::move(pass));
1197
1198 EXPECT_TRUE(this->RunPixelTest(&pass_list,
1199 base::FilePath(FILE_PATH_LITERAL("green.png")),
1200 FuzzyPixelOffByOneComparator(true)));
1201 }
1202
1158 // Test that a YUV video doesn't bleed outside of its tex coords when the 1203 // Test that a YUV video doesn't bleed outside of its tex coords when the
1159 // tex coord rect is only a partial subrectangle of the coded contents. 1204 // tex coord rect is only a partial subrectangle of the coded contents.
1160 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) { 1205 TEST_F(VideoGLRendererPixelTest, YUVEdgeBleed) {
1161 RenderPassList pass_list; 1206 RenderPassList pass_list;
1162 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG, 1207 CreateEdgeBleedPass(media::PIXEL_FORMAT_YV12, media::COLOR_SPACE_JPEG,
1163 &pass_list); 1208 &pass_list);
1164 EXPECT_TRUE(this->RunPixelTest(&pass_list, 1209 EXPECT_TRUE(this->RunPixelTest(&pass_list,
1165 base::FilePath(FILE_PATH_LITERAL("green.png")), 1210 base::FilePath(FILE_PATH_LITERAL("green.png")),
1166 FuzzyPixelOffByOneComparator(true))); 1211 FuzzyPixelOffByOneComparator(true)));
1167 } 1212 }
(...skipping 1932 matching lines...) Expand 10 before | Expand all | Expand 10 after
3100 3145
3101 EXPECT_TRUE(this->RunPixelTest( 3146 EXPECT_TRUE(this->RunPixelTest(
3102 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")), 3147 &pass_list, base::FilePath(FILE_PATH_LITERAL("spiral.png")),
3103 FuzzyPixelOffByOneComparator(true))); 3148 FuzzyPixelOffByOneComparator(true)));
3104 } 3149 }
3105 3150
3106 #endif // !defined(OS_ANDROID) 3151 #endif // !defined(OS_ANDROID)
3107 3152
3108 } // namespace 3153 } // namespace
3109 } // namespace cc 3154 } // namespace cc
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698