| Index: cc/output/renderer_pixeltest.cc
|
| diff --git a/cc/output/renderer_pixeltest.cc b/cc/output/renderer_pixeltest.cc
|
| index 585a94c4de80a0c5ed79ba3272cae9878c051def..b431c21746441bb109fe611f9598828e91dc526b 100644
|
| --- a/cc/output/renderer_pixeltest.cc
|
| +++ b/cc/output/renderer_pixeltest.cc
|
| @@ -8,10 +8,12 @@
|
| #include "cc/quads/draw_quad.h"
|
| #include "cc/quads/picture_draw_quad.h"
|
| #include "cc/quads/texture_draw_quad.h"
|
| +#include "cc/resources/video_resource_updater.h"
|
| #include "cc/test/fake_picture_pile_impl.h"
|
| #include "cc/test/pixel_test.h"
|
| #include "gpu/GLES2/gl2extchromium.h"
|
| #include "gpu/command_buffer/client/gles2_interface.h"
|
| +#include "media/base/video_frame.h"
|
| #include "third_party/skia/include/core/SkBitmapDevice.h"
|
| #include "third_party/skia/include/core/SkImageFilter.h"
|
| #include "third_party/skia/include/core/SkMatrix.h"
|
| @@ -404,69 +406,77 @@ class VideoGLRendererPixelTest : public GLRendererPixelTest {
|
| protected:
|
| scoped_ptr<YUVVideoDrawQuad> CreateTestYUVVideoDrawQuad(
|
| SharedQuadState* shared_state,
|
| - bool with_alpha,
|
| + media::VideoFrame::Format format,
|
| bool is_transparent,
|
| const gfx::RectF& tex_coord_rect) {
|
| + const bool with_alpha = (format == media::VideoFrame::YV12A);
|
| const gfx::Rect rect(this->device_viewport_size_);
|
| - const gfx::Rect uv_rect(
|
| - 0, 0, (rect.width() + 1) / 2, (rect.height() + 1) / 2);
|
| const gfx::Rect opaque_rect(0, 0, 0, 0);
|
|
|
| - ResourceProvider::ResourceId y_resource =
|
| - resource_provider_->CreateResource(rect.size(),
|
| - GL_CLAMP_TO_EDGE,
|
| - ResourceProvider::TextureUsageAny,
|
| - LUMINANCE_8);
|
| - ResourceProvider::ResourceId u_resource =
|
| - resource_provider_->CreateResource(uv_rect.size(),
|
| - GL_CLAMP_TO_EDGE,
|
| - ResourceProvider::TextureUsageAny,
|
| - LUMINANCE_8);
|
| - ResourceProvider::ResourceId v_resource =
|
| - resource_provider_->CreateResource(uv_rect.size(),
|
| - GL_CLAMP_TO_EDGE,
|
| - ResourceProvider::TextureUsageAny,
|
| - LUMINANCE_8);
|
| - ResourceProvider::ResourceId a_resource = 0;
|
| - if (with_alpha) {
|
| - a_resource = resource_provider_->CreateResource(
|
| - this->device_viewport_size_,
|
| - GL_CLAMP_TO_EDGE,
|
| - ResourceProvider::TextureUsageAny,
|
| - LUMINANCE_8);
|
| - }
|
| + scoped_refptr<media::VideoFrame> video_frame =
|
| + media::VideoFrame::CreateFrame(
|
| + format, rect.size(), rect, rect.size(), base::TimeDelta());
|
|
|
| - const int y_plane_size = rect.size().GetArea();
|
| - const int uv_plane_size = uv_rect.size().GetArea();
|
| - scoped_ptr<uint8_t[]> y_plane(new uint8_t[y_plane_size]);
|
| - scoped_ptr<uint8_t[]> u_plane(new uint8_t[uv_plane_size]);
|
| - scoped_ptr<uint8_t[]> v_plane(new uint8_t[uv_plane_size]);
|
| - scoped_ptr<uint8_t[]> a_plane;
|
| - if (with_alpha)
|
| - a_plane.reset(new uint8_t[y_plane_size]);
|
| // YUV values representing a striped pattern, for validating texture
|
| // coordinates for sampling.
|
| uint8_t y_value = 0;
|
| uint8_t u_value = 0;
|
| uint8_t v_value = 0;
|
| - for (int i = 0; i < y_plane_size; ++i)
|
| - y_plane.get()[i] = (y_value += 1);
|
| - for (int i = 0; i < uv_plane_size; ++i) {
|
| - u_plane.get()[i] = (u_value += 3);
|
| - v_plane.get()[i] = (v_value += 5);
|
| + for (int i = 0; i < video_frame->rows(media::VideoFrame::kYPlane); ++i) {
|
| + uint8_t* y_row = video_frame->data(media::VideoFrame::kYPlane) +
|
| + video_frame->stride(media::VideoFrame::kYPlane) * i;
|
| + for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kYPlane);
|
| + ++j) {
|
| + y_row[j] = (y_value += 1);
|
| + }
|
| + }
|
| + for (int i = 0; i < video_frame->rows(media::VideoFrame::kUPlane); ++i) {
|
| + uint8_t* u_row = video_frame->data(media::VideoFrame::kUPlane) +
|
| + video_frame->stride(media::VideoFrame::kUPlane) * i;
|
| + uint8_t* v_row = video_frame->data(media::VideoFrame::kVPlane) +
|
| + video_frame->stride(media::VideoFrame::kVPlane) * i;
|
| + for (int j = 0; j < video_frame->row_bytes(media::VideoFrame::kUPlane);
|
| + ++j) {
|
| + u_row[j] = (u_value += 3);
|
| + v_row[j] = (v_value += 5);
|
| + }
|
| }
|
| if (with_alpha)
|
| - memset(a_plane.get(), is_transparent ? 0 : 128, y_plane_size);
|
| -
|
| - resource_provider_->SetPixels(
|
| - y_resource, y_plane.get(), rect, rect, gfx::Vector2d());
|
| - resource_provider_->SetPixels(
|
| - u_resource, u_plane.get(), uv_rect, uv_rect, gfx::Vector2d());
|
| - resource_provider_->SetPixels(
|
| - v_resource, v_plane.get(), uv_rect, uv_rect, gfx::Vector2d());
|
| + memset(video_frame->data(media::VideoFrame::kAPlane),
|
| + is_transparent ? 0 : 128,
|
| + video_frame->stride(media::VideoFrame::kAPlane) *
|
| + video_frame->rows(media::VideoFrame::kAPlane));
|
| +
|
| + VideoFrameExternalResources resources =
|
| + video_resource_updater_->CreateExternalResourcesFromVideoFrame(
|
| + video_frame);
|
| +
|
| + EXPECT_EQ(VideoFrameExternalResources::YUV_RESOURCE, resources.type);
|
| + EXPECT_EQ(media::VideoFrame::NumPlanes(format), resources.mailboxes.size());
|
| + EXPECT_EQ(media::VideoFrame::NumPlanes(format),
|
| + resources.release_callbacks.size());
|
| +
|
| + ResourceProvider::ResourceId y_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kYPlane],
|
| + SingleReleaseCallback::Create(
|
| + resources.release_callbacks[media::VideoFrame::kYPlane]));
|
| + ResourceProvider::ResourceId u_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kUPlane],
|
| + SingleReleaseCallback::Create(
|
| + resources.release_callbacks[media::VideoFrame::kUPlane]));
|
| + ResourceProvider::ResourceId v_resource =
|
| + resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kVPlane],
|
| + SingleReleaseCallback::Create(
|
| + resources.release_callbacks[media::VideoFrame::kVPlane]));
|
| + ResourceProvider::ResourceId a_resource = 0;
|
| if (with_alpha) {
|
| - resource_provider_->SetPixels(a_resource, a_plane.get(), rect, rect,
|
| - gfx::Vector2d());
|
| + a_resource = resource_provider_->CreateResourceFromTextureMailbox(
|
| + resources.mailboxes[media::VideoFrame::kAPlane],
|
| + SingleReleaseCallback::Create(
|
| + resources.release_callbacks[media::VideoFrame::kAPlane]));
|
| }
|
|
|
| scoped_ptr<YUVVideoDrawQuad> yuv_quad = YUVVideoDrawQuad::Create();
|
| @@ -481,6 +491,15 @@ class VideoGLRendererPixelTest : public GLRendererPixelTest {
|
| a_resource);
|
| return yuv_quad.Pass();
|
| }
|
| +
|
| + virtual void SetUp() OVERRIDE {
|
| + GLRendererPixelTest::SetUp();
|
| + video_resource_updater_.reset(new VideoResourceUpdater(
|
| + output_surface_->context_provider().get(), resource_provider_.get()));
|
| + }
|
| +
|
| + private:
|
| + scoped_ptr<VideoResourceUpdater> video_resource_updater_;
|
| };
|
|
|
| TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
|
| @@ -492,8 +511,11 @@ TEST_F(VideoGLRendererPixelTest, SimpleYUVRect) {
|
| scoped_ptr<SharedQuadState> shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect);
|
|
|
| - scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad(
|
| - shared_state.get(), false, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
| + scoped_ptr<YUVVideoDrawQuad> yuv_quad =
|
| + CreateTestYUVVideoDrawQuad(shared_state.get(),
|
| + media::VideoFrame::YV12,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
|
|
| pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
|
|
|
| @@ -516,8 +538,12 @@ TEST_F(VideoGLRendererPixelTest, OffsetYUVRect) {
|
| scoped_ptr<SharedQuadState> shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect);
|
|
|
| - scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad(
|
| - shared_state.get(), false, false, gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f));
|
| + // Intentionally sets frame format to I420 for testing coverage.
|
| + scoped_ptr<YUVVideoDrawQuad> yuv_quad =
|
| + CreateTestYUVVideoDrawQuad(shared_state.get(),
|
| + media::VideoFrame::I420,
|
| + false,
|
| + gfx::RectF(0.125f, 0.25f, 0.75f, 0.5f));
|
|
|
| pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
|
|
|
| @@ -540,8 +566,11 @@ TEST_F(VideoGLRendererPixelTest, SimpleYUVARect) {
|
| scoped_ptr<SharedQuadState> shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect);
|
|
|
| - scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad(
|
| - shared_state.get(), true, false, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
| + scoped_ptr<YUVVideoDrawQuad> yuv_quad =
|
| + CreateTestYUVVideoDrawQuad(shared_state.get(),
|
| + media::VideoFrame::YV12A,
|
| + false,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
|
|
| pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
|
|
|
| @@ -569,8 +598,11 @@ TEST_F(VideoGLRendererPixelTest, FullyTransparentYUVARect) {
|
| scoped_ptr<SharedQuadState> shared_state =
|
| CreateTestSharedQuadState(gfx::Transform(), rect);
|
|
|
| - scoped_ptr<YUVVideoDrawQuad> yuv_quad = CreateTestYUVVideoDrawQuad(
|
| - shared_state.get(), true, true, gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
| + scoped_ptr<YUVVideoDrawQuad> yuv_quad =
|
| + CreateTestYUVVideoDrawQuad(shared_state.get(),
|
| + media::VideoFrame::YV12A,
|
| + true,
|
| + gfx::RectF(0.0f, 0.0f, 1.0f, 1.0f));
|
|
|
| pass->quad_list.push_back(yuv_quad.PassAs<DrawQuad>());
|
|
|
|
|