Changeset 65756 in webkit


Ignore:
Timestamp:
Aug 20, 2010 3:12:01 PM (14 years ago)
Author:
kbr@google.com
Message:

2010-08-20 Adrienne Walker <enne@google.com>

Reviewed by Kenneth Russell.

Implement HTMLVideoElement support for texImage2D and texSubImage2D
https://bugs.webkit.org/show_bug.cgi?id=33852

Test: fast/canvas/webgl/tex-image-and-sub-image-2d-with-video.html

  • html/canvas/WebGLRenderingContext.cpp: (WebCore::WebGLRenderingContext::WebGLRenderingContext): (WebCore::WebGLRenderingContext::videoFrameToImage): (WebCore::WebGLRenderingContext::texImage2D): (WebCore::WebGLRenderingContext::texSubImage2D): (WebCore::WebGLRenderingContext::LRUImageBufferCache::LRUImageBufferCache): (WebCore::WebGLRenderingContext::LRUImageBufferCache::imageBuffer): (WebCore::WebGLRenderingContext::LRUImageBufferCache::bubbleToFront):
  • html/canvas/WebGLRenderingContext.h:

2010-08-20 Adrienne Walker <enne@google.com>

Reviewed by Kenneth Russell.

Implement HTMLVideoElement support for texImage2D and texSubImage2D
https://bugs.webkit.org/show_bug.cgi?id=33852

  • fast/canvas/webgl/resources/quadrants.mp4: Added.
  • fast/canvas/webgl/resources/quadrants.ogv: Added.
  • fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-expected.txt: Added.
  • fast/canvas/webgl/tex-image-and-sub-image-2d-with-video.html: Added.
Location:
trunk
Files:
4 added
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r65755 r65756  
     12010-08-20  Adrienne Walker  <enne@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        Implement HTMLVideoElement support for texImage2D and texSubImage2D
     6        https://bugs.webkit.org/show_bug.cgi?id=33852
     7
     8        * fast/canvas/webgl/resources/quadrants.mp4: Added.
     9        * fast/canvas/webgl/resources/quadrants.ogv: Added.
     10        * fast/canvas/webgl/tex-image-and-sub-image-2d-with-video-expected.txt: Added.
     11        * fast/canvas/webgl/tex-image-and-sub-image-2d-with-video.html: Added.
     12
    1132010-08-20  Dumitru Daniliuc  <dumi@chromium.org>
    214
  • trunk/WebCore/ChangeLog

    r65755 r65756  
     12010-08-20  Adrienne Walker  <enne@google.com>
     2
     3        Reviewed by Kenneth Russell.
     4
     5        Implement HTMLVideoElement support for texImage2D and texSubImage2D
     6        https://bugs.webkit.org/show_bug.cgi?id=33852
     7
     8        Test: fast/canvas/webgl/tex-image-and-sub-image-2d-with-video.html
     9
     10        * html/canvas/WebGLRenderingContext.cpp:
     11        (WebCore::WebGLRenderingContext::WebGLRenderingContext):
     12        (WebCore::WebGLRenderingContext::videoFrameToImage):
     13        (WebCore::WebGLRenderingContext::texImage2D):
     14        (WebCore::WebGLRenderingContext::texSubImage2D):
     15        (WebCore::WebGLRenderingContext::LRUImageBufferCache::LRUImageBufferCache):
     16        (WebCore::WebGLRenderingContext::LRUImageBufferCache::imageBuffer):
     17        (WebCore::WebGLRenderingContext::LRUImageBufferCache::bubbleToFront):
     18        * html/canvas/WebGLRenderingContext.h:
     19
    1202010-08-20  Dumitru Daniliuc  <dumi@chromium.org>
    221
  • trunk/WebCore/html/canvas/WebGLRenderingContext.cpp

    r65449 r65756  
    3737#include "HTMLCanvasElement.h"
    3838#include "HTMLImageElement.h"
     39#include "HTMLVideoElement.h"
    3940#include "ImageBuffer.h"
    4041#include "ImageData.h"
     
    99100    , m_markedCanvasDirty(false)
    100101    , m_activeTextureUnit(0)
     102    , m_videoCache(4)
    101103    , m_packAlignment(4)
    102104    , m_unpackAlignment(4)
     
    21892191}
    21902192
     2193PassRefPtr<Image> WebGLRenderingContext::videoFrameToImage(HTMLVideoElement* video)
     2194{
     2195    if (!video || !video->videoWidth() || !video->videoHeight()) {
     2196        m_context->synthesizeGLError(GraphicsContext3D::INVALID_VALUE);
     2197        return 0;
     2198    }
     2199    IntSize size(video->videoWidth(), video->videoHeight());
     2200    ImageBuffer* buf = m_videoCache.imageBuffer(size);
     2201    if (!buf) {
     2202        m_context->synthesizeGLError(GraphicsContext3D::OUT_OF_MEMORY);
     2203        return 0;
     2204    }
     2205    IntRect destRect(0, 0, size.width(), size.height());
     2206    // FIXME: Turn this into a GPU-GPU texture copy instead of CPU readback.
     2207    video->paintCurrentFrameInContext(buf->context(), destRect);
     2208    return buf->copyImage();
     2209}
     2210
    21912211void WebGLRenderingContext::texImage2D(unsigned target, unsigned level, unsigned internalformat,
    21922212                                       unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode& ec)
    21932213{
    2194     // FIXME: Need to implement this call
    2195     UNUSED_PARAM(target);
    2196     UNUSED_PARAM(level);
    2197     UNUSED_PARAM(internalformat);
    2198     UNUSED_PARAM(format);
    2199     UNUSED_PARAM(type);
    2200     UNUSED_PARAM(video);
    2201 
    22022214    ec = 0;
    2203     cleanupAfterGraphicsCall(false);
     2215    RefPtr<Image> image = videoFrameToImage(video);
     2216    if (!video)
     2217        return;
     2218    texImage2DImpl(target, level, internalformat, format, type, image.get(), m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
    22042219}
    22052220
     
    23432358                                          unsigned format, unsigned type, HTMLVideoElement* video, ExceptionCode& ec)
    23442359{
    2345     // FIXME: Need to implement this call
    2346     UNUSED_PARAM(target);
    2347     UNUSED_PARAM(level);
    2348     UNUSED_PARAM(xoffset);
    2349     UNUSED_PARAM(yoffset);
    2350     UNUSED_PARAM(format);
    2351     UNUSED_PARAM(type);
    2352     UNUSED_PARAM(video);
    23532360    ec = 0;
    2354     cleanupAfterGraphicsCall(false);
     2361    RefPtr<Image> image = videoFrameToImage(video);
     2362    if (!video)
     2363        return;
     2364    texSubImage2DImpl(target, level, xoffset, yoffset, format, type, image.get(), m_unpackFlipY, m_unpackPremultiplyAlpha, ec);
    23552365}
    23562366
     
    35653575}
    35663576
     3577WebGLRenderingContext::LRUImageBufferCache::LRUImageBufferCache(int capacity)
     3578    : m_buffers(new OwnPtr<ImageBuffer>[capacity])
     3579    , m_capacity(capacity)
     3580{
     3581}
     3582
     3583ImageBuffer* WebGLRenderingContext::LRUImageBufferCache::imageBuffer(const IntSize& size)
     3584{
     3585    int i;
     3586    for (i = 0; i < m_capacity; ++i) {
     3587        ImageBuffer* buf = m_buffers[i].get();
     3588        if (!buf)
     3589            break;
     3590        if (buf->size() != size)
     3591            continue;
     3592        bubbleToFront(i);
     3593        return buf;
     3594    }
     3595
     3596    OwnPtr<ImageBuffer> temp = ImageBuffer::create(size);
     3597    if (!temp)
     3598        return 0;
     3599    i = std::min(m_capacity - 1, i);
     3600    m_buffers[i] = temp.release();
     3601
     3602    ImageBuffer* buf = m_buffers[i].get();
     3603    bubbleToFront(i);
     3604    return buf;
     3605}
     3606
     3607void WebGLRenderingContext::LRUImageBufferCache::bubbleToFront(int idx)
     3608{
     3609    for (int i = idx; i > 0; --i)
     3610        m_buffers[i].swap(m_buffers[i-1]);
     3611}
     3612
    35673613} // namespace WebCore
    35683614
  • trunk/WebCore/html/canvas/WebGLRenderingContext.h

    r65449 r65756  
    3636#include "WebGLGetInfo.h"
    3737
     38#include <wtf/OwnArrayPtr.h>
     39
    3840namespace WebCore {
    3941
     
    5052class HTMLImageElement;
    5153class HTMLVideoElement;
     54class ImageBuffer;
    5255class ImageData;
    5356class WebKitCSSMatrix;
     
    321324    bool validateWebGLObject(WebGLObject* object);
    322325
     326    PassRefPtr<Image> videoFrameToImage(HTMLVideoElement* video);
     327
    323328    OwnPtr<GraphicsContext3D> m_context;
    324329    bool m_needsUpdate;
     
    388393    RefPtr<WebGLTexture> m_blackTextureCubeMap;
    389394
     395    // Fixed-size cache of reusable image buffers for video texImage2D calls.
     396    class LRUImageBufferCache {
     397    public:
     398        LRUImageBufferCache(int capacity);
     399        // The pointer returned is owned by the image buffer map.
     400        ImageBuffer* imageBuffer(const IntSize& size);
     401    private:
     402        void bubbleToFront(int idx);
     403        OwnArrayPtr<OwnPtr<ImageBuffer> > m_buffers;
     404        int m_capacity;
     405    };
     406    LRUImageBufferCache m_videoCache;
     407
    390408    int m_maxTextureSize;
    391409    int m_maxCubeMapTextureSize;
Note: See TracChangeset for help on using the changeset viewer.