Chromium Code Reviews| Index: cc/video_layer_impl.cc |
| diff --git a/cc/video_layer_impl.cc b/cc/video_layer_impl.cc |
| index 86cf037eb8baa87676451710629a73fdde0bc619..f9cf075721ebccaf7bd86c93dbc8ddbc288f067b 100644 |
| --- a/cc/video_layer_impl.cc |
| +++ b/cc/video_layer_impl.cc |
| @@ -122,6 +122,12 @@ void VideoLayerImpl::willDrawInternal(ResourceProvider* resourceProvider) |
| if (!m_frame) |
| return; |
| + // If these fail, we'll have to add draw logic that handles offset bitmap/ |
| + // texture UVs. |
| + DCHECK(m_frame->visibleX() == 0 && m_frame->visibleY() == 0); |
|
jamesr
2012/10/25 00:26:34
Can you make these separate DCHECK()s and use DCHE
Ami GONE FROM CHROMIUM
2012/10/25 00:43:07
DCHECKs are for programming errors, not creatively
sheu
2012/10/25 01:53:54
Updated the comment a bit. It's not really an err
|
| + |
| + // The visible contents might not cover the entire texture; e.g. padding |
|
Ami GONE FROM CHROMIUM
2012/10/25 00:43:07
This comment seems oddly placed.
sheu
2012/10/25 01:53:54
Done.
|
| + |
| m_format = convertVFCFormatToGC3DFormat(*m_frame); |
| if (m_format == GL_INVALID_VALUE) { |
| @@ -167,23 +173,29 @@ void VideoLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQuad |
| IntRect quadRect(IntPoint(), contentBounds()); |
| + // pixels for macroblocked formats. |
| + const float texWidthScale = |
| + static_cast<float>(m_frame->visibleWidth()) / m_frame->textureWidth(); |
| + const float texHeightScale = |
| + static_cast<float>(m_frame->visibleHeight()) / m_frame->textureHeight(); |
| + |
| switch (m_format) { |
| case GL_LUMINANCE: { |
| // YUV software decoder. |
|
Ami GONE FROM CHROMIUM
2012/10/25 00:43:07
I don't believe it's possible to get here with sca
sheu
2012/10/25 01:53:54
It's not an error condition though, and we can han
|
| const FramePlane& yPlane = m_framePlanes[WebKit::WebVideoFrame::yPlane]; |
| const FramePlane& uPlane = m_framePlanes[WebKit::WebVideoFrame::uPlane]; |
| const FramePlane& vPlane = m_framePlanes[WebKit::WebVideoFrame::vPlane]; |
| - scoped_ptr<YUVVideoDrawQuad> yuvVideoQuad = YUVVideoDrawQuad::create(sharedQuadState, quadRect, yPlane, uPlane, vPlane); |
| + FloatSize texScale(texWidthScale, texHeightScale); |
| + scoped_ptr<YUVVideoDrawQuad> yuvVideoQuad = YUVVideoDrawQuad::create( |
| + sharedQuadState, quadRect, texScale, yPlane, uPlane, vPlane); |
| quadSink.append(yuvVideoQuad.PassAs<DrawQuad>(), appendQuadsData); |
| break; |
| } |
| case GL_RGBA: { |
| // RGBA software decoder. |
| const FramePlane& plane = m_framePlanes[WebKit::WebVideoFrame::rgbPlane]; |
| - float widthScaleFactor = static_cast<float>(plane.visibleSize.width()) / plane.size.width(); |
| - |
| bool premultipliedAlpha = true; |
| - FloatRect uvRect(0, 0, widthScaleFactor, 1); |
| + FloatRect uvRect(0, 0, texWidthScale, texHeightScale); |
| bool flipped = false; |
| scoped_ptr<TextureDrawQuad> textureQuad = TextureDrawQuad::create(sharedQuadState, quadRect, plane.resourceId, premultipliedAlpha, uvRect, flipped); |
| quadSink.append(textureQuad.PassAs<DrawQuad>(), appendQuadsData); |
| @@ -192,21 +204,26 @@ void VideoLayerImpl::appendQuads(QuadSink& quadSink, AppendQuadsData& appendQuad |
| case GL_TEXTURE_2D: { |
| // NativeTexture hardware decoder. |
| bool premultipliedAlpha = true; |
| - FloatRect uvRect(0, 0, 1, 1); |
| + FloatRect uvRect(0, 0, texWidthScale, texHeightScale); |
| bool flipped = false; |
| scoped_ptr<TextureDrawQuad> textureQuad = TextureDrawQuad::create(sharedQuadState, quadRect, m_externalTextureResource, premultipliedAlpha, uvRect, flipped); |
| quadSink.append(textureQuad.PassAs<DrawQuad>(), appendQuadsData); |
| break; |
| } |
| case GL_TEXTURE_RECTANGLE_ARB: { |
| - IntSize textureSize(m_frame->width(), m_frame->height()); |
| - scoped_ptr<IOSurfaceDrawQuad> ioSurfaceQuad = IOSurfaceDrawQuad::create(sharedQuadState, quadRect, textureSize, m_frame->textureId(), IOSurfaceDrawQuad::Unflipped); |
| + IntSize visibleSize(m_frame->visibleWidth(), m_frame->visibleHeight()); |
| + scoped_ptr<IOSurfaceDrawQuad> ioSurfaceQuad = IOSurfaceDrawQuad::create(sharedQuadState, quadRect, visibleSize, m_frame->textureId(), IOSurfaceDrawQuad::Unflipped); |
| quadSink.append(ioSurfaceQuad.PassAs<DrawQuad>(), appendQuadsData); |
| break; |
| } |
| case GL_TEXTURE_EXTERNAL_OES: { |
| // StreamTexture hardware decoder. |
| - scoped_ptr<StreamVideoDrawQuad> streamVideoQuad = StreamVideoDrawQuad::create(sharedQuadState, quadRect, m_frame->textureId(), m_streamTextureMatrix); |
| + WebKit::WebTransformationMatrix transform(m_streamTextureMatrix); |
| + transform.scaleNonUniform(texWidthScale, texHeightScale); |
| + scoped_ptr<StreamVideoDrawQuad> streamVideoQuad = |
| + StreamVideoDrawQuad::create(sharedQuadState, quadRect, |
| + m_frame->textureId(), |
| + m_streamTextureMatrix); |
| quadSink.append(streamVideoQuad.PassAs<DrawQuad>(), appendQuadsData); |
| break; |
| } |
| @@ -239,43 +256,8 @@ void VideoLayerImpl::didDraw(ResourceProvider* resourceProvider) |
| m_providerLock.Release(); |
| } |
| -static int videoFrameDimension(int originalDimension, unsigned plane, int format) |
| -{ |
| - if (format == WebKit::WebVideoFrame::FormatYV12 && plane != WebKit::WebVideoFrame::yPlane) |
| - return originalDimension / 2; |
| - return originalDimension; |
| -} |
| - |
| -static bool hasPaddingBytes(const WebKit::WebVideoFrame& frame, unsigned plane) |
| -{ |
| - return frame.stride(plane) > videoFrameDimension(frame.width(), plane, frame.format()); |
| -} |
| - |
| -IntSize VideoLayerImpl::computeVisibleSize(const WebKit::WebVideoFrame& frame, unsigned plane) |
| -{ |
| - int visibleWidth = videoFrameDimension(frame.width(), plane, frame.format()); |
| - int originalWidth = visibleWidth; |
| - int visibleHeight = videoFrameDimension(frame.height(), plane, frame.format()); |
| - |
| - // When there are dead pixels at the edge of the texture, decrease |
| - // the frame width by 1 to prevent the rightmost pixels from |
| - // interpolating with the dead pixels. |
| - if (hasPaddingBytes(frame, plane)) |
| - --visibleWidth; |
| - |
| - // In YV12, every 2x2 square of Y values corresponds to one U and |
| - // one V value. If we decrease the width of the UV plane, we must decrease the |
| - // width of the Y texture by 2 for proper alignment. This must happen |
| - // always, even if Y's texture does not have padding bytes. |
| - if (plane == WebKit::WebVideoFrame::yPlane && frame.format() == WebKit::WebVideoFrame::FormatYV12) { |
| - if (hasPaddingBytes(frame, WebKit::WebVideoFrame::uPlane)) |
| - visibleWidth = originalWidth - 2; |
| - } |
| - |
| - return IntSize(visibleWidth, visibleHeight); |
| -} |
| - |
| -bool VideoLayerImpl::FramePlane::allocateData(ResourceProvider* resourceProvider) |
| +bool VideoLayerImpl::FramePlane::allocateData( |
| + ResourceProvider* resourceProvider) |
| { |
| if (resourceId) |
| return true; |
| @@ -296,12 +278,16 @@ void VideoLayerImpl::FramePlane::freeData(ResourceProvider* resourceProvider) |
| bool VideoLayerImpl::allocatePlaneData(ResourceProvider* resourceProvider) |
| { |
| int maxTextureSize = resourceProvider->maxTextureSize(); |
| - for (unsigned planeIndex = 0; planeIndex < m_frame->planes(); ++planeIndex) { |
| - VideoLayerImpl::FramePlane& plane = m_framePlanes[planeIndex]; |
| - |
| - IntSize requiredTextureSize(m_frame->stride(planeIndex), videoFrameDimension(m_frame->height(), planeIndex, m_frame->format())); |
| - // FIXME: Remove the test against maxTextureSize when tiled layers are implemented. |
| - if (requiredTextureSize.isZero() || requiredTextureSize.width() > maxTextureSize || requiredTextureSize.height() > maxTextureSize) |
| + for (unsigned planeIdx = 0; planeIdx < m_frame->planes(); ++planeIdx) { |
| + VideoLayerImpl::FramePlane& plane = m_framePlanes[planeIdx]; |
| + |
| + IntSize requiredTextureSize(m_frame->textureWidth(), |
| + m_frame->textureHeight()); |
| + // FIXME: Remove the test against maxTextureSize when tiled layers are |
| + // implemented. |
| + if (requiredTextureSize.isZero() || |
| + requiredTextureSize.width() > maxTextureSize || |
| + requiredTextureSize.height() > maxTextureSize) |
| return false; |
| if (plane.size != requiredTextureSize || plane.format != m_format) { |
| @@ -310,26 +296,27 @@ bool VideoLayerImpl::allocatePlaneData(ResourceProvider* resourceProvider) |
| plane.format = m_format; |
| } |
| - if (!plane.resourceId) { |
| - if (!plane.allocateData(resourceProvider)) |
| - return false; |
| - plane.visibleSize = computeVisibleSize(*m_frame, planeIndex); |
| - } |
| + if (!plane.allocateData(resourceProvider)) |
| + return false; |
| } |
| return true; |
| } |
| bool VideoLayerImpl::copyPlaneData(ResourceProvider* resourceProvider) |
| { |
| - size_t softwarePlaneCount = m_frame->planes(); |
| - if (!softwarePlaneCount) |
| - return true; |
| - |
| - for (size_t softwarePlaneIndex = 0; softwarePlaneIndex < softwarePlaneCount; ++softwarePlaneIndex) { |
| - VideoLayerImpl::FramePlane& plane = m_framePlanes[softwarePlaneIndex]; |
| - const uint8_t* softwarePlanePixels = static_cast<const uint8_t*>(m_frame->data(softwarePlaneIndex)); |
| - IntRect planeRect(IntPoint(), plane.size); |
| - resourceProvider->upload(plane.resourceId, softwarePlanePixels, planeRect, planeRect, IntSize()); |
| + for (unsigned planeIdx = 0; planeIdx < m_frame->planes(); ++planeIdx) { |
| + VideoLayerImpl::FramePlane& plane = m_framePlanes[planeIdx]; |
| + const uint8_t* planePixels = static_cast<const uint8_t*>( |
| + m_frame->data(planeIdx)); |
|
jamesr
2012/10/25 00:26:34
General note for stuff in src/cc/ - we're still us
sheu
2012/10/25 01:53:54
Done.
|
| + |
| + // Only non-FormatNativeTexture planes should need upload. |
| + DCHECK(plane.format == GL_LUMINANCE); |
|
jamesr
2012/10/25 00:26:34
DCHECK_EQ please, it'll print the format if the ch
sheu
2012/10/25 01:53:54
Done.
|
| + |
| + IntRect planeRect(0, 0, plane.size.width(), plane.size.height()); |
| + IntRect visibleRect(0, 0, m_frame->textureWidth(), |
| + m_frame->textureHeight()); |
| + resourceProvider->upload(plane.resourceId, planePixels, planeRect, |
| + visibleRect, IntSize()); |
| } |
| return true; |
| } |