Changeset 213972 in webkit


Ignore:
Timestamp:
Mar 14, 2017 10:21:06 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

CanvasCapture should not generate a frame per each canvas draw command
https://bugs.webkit.org/show_bug.cgi?id=169498

Patch by Youenn Fablet <youenn@apple.com> on 2017-03-14
Reviewed by Simon Fraser & Eric Carlson.

Source/WebCore:

Test: fast/mediastream/captureStream/canvas2d-heavy-drawing.html

Making Canvas capture be asynchronous.
This ensures that one frame will be created for a set of synchronous draw commands.
In the future, we should find a better approach, like aligning with requestAnimationFrame.
Adding internals observer API for media stream tracks.

  • Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:

(WebCore::CanvasCaptureMediaStreamTrack::Source::Source):
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):

  • Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
  • Modules/mediastream/MediaStreamTrack.idl:
  • platform/mediastream/RealtimeMediaSource.h:
  • testing/Internals.cpp:

(WebCore::Internals::~Internals):
(WebCore::Internals::observeMediaStreamTrack):

  • testing/Internals.h:
  • testing/Internals.idl:

LayoutTests:

  • fast/mediastream/captureStream/canvas2d-heavy-drawing-expected.txt: Added.
  • fast/mediastream/captureStream/canvas2d-heavy-drawing.html: Added.
Location:
trunk
Files:
2 added
9 edited

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r213971 r213972  
     12017-03-14  Youenn Fablet  <youenn@apple.com>
     2
     3        CanvasCapture should not generate a frame per each canvas draw command
     4        https://bugs.webkit.org/show_bug.cgi?id=169498
     5
     6        Reviewed by Simon Fraser & Eric Carlson.
     7
     8        * fast/mediastream/captureStream/canvas2d-heavy-drawing-expected.txt: Added.
     9        * fast/mediastream/captureStream/canvas2d-heavy-drawing.html: Added.
     10
    1112017-03-14  Wenson Hsieh  <wenson_hsieh@apple.com>
    212
  • trunk/Source/WebCore/ChangeLog

    r213967 r213972  
     12017-03-14  Youenn Fablet  <youenn@apple.com>
     2
     3        CanvasCapture should not generate a frame per each canvas draw command
     4        https://bugs.webkit.org/show_bug.cgi?id=169498
     5
     6        Reviewed by Simon Fraser & Eric Carlson.
     7
     8        Test: fast/mediastream/captureStream/canvas2d-heavy-drawing.html
     9
     10        Making Canvas capture be asynchronous.
     11        This ensures that one frame will be created for a set of synchronous draw commands.
     12        In the future, we should find a better approach, like aligning with requestAnimationFrame.
     13        Adding internals observer API for media stream tracks.
     14
     15        * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp:
     16        (WebCore::CanvasCaptureMediaStreamTrack::Source::Source):
     17        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):
     18        * Modules/mediastream/CanvasCaptureMediaStreamTrack.h:
     19        * Modules/mediastream/MediaStreamTrack.idl:
     20        * platform/mediastream/RealtimeMediaSource.h:
     21        * testing/Internals.cpp:
     22        (WebCore::Internals::~Internals):
     23        (WebCore::Internals::observeMediaStreamTrack):
     24        * testing/Internals.h:
     25        * testing/Internals.idl:
     26
    1272017-03-14  Wenson Hsieh  <wenson_hsieh@apple.com>
    228
  • trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp

    r213884 r213972  
    6363    , m_frameRequestRate(WTFMove(frameRequestRate))
    6464    , m_requestFrameTimer(*this, &Source::requestFrameTimerFired)
     65    , m_canvasChangedTimer(*this, &Source::captureCanvas)
    6566    , m_canvas(&canvas)
    6667{
     
    124125    ASSERT_UNUSED(canvas, m_canvas == &canvas);
    125126
    126     captureCanvas();
     127    // FIXME: We should try to generate the frame at the time the screen is being updated.
     128    if (m_canvasChangedTimer.isActive())
     129        return;
     130    m_canvasChangedTimer.startOneShot(0);
    127131}
    128132
  • trunk/Source/WebCore/Modules/mediastream/CanvasCaptureMediaStreamTrack.h

    r213880 r213972  
    2929#include "HTMLCanvasElement.h"
    3030#include "MediaStreamTrack.h"
     31#include "Timer.h"
    3132#include <wtf/TypeCasts.h>
    3233
     
    7475        std::optional<double> m_frameRequestRate;
    7576        Timer m_requestFrameTimer;
     77        Timer m_canvasChangedTimer;
    7678        RealtimeMediaSourceSettings m_settings;
    7779        HTMLCanvasElement* m_canvas;
  • trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.idl

    r213598 r213972  
    3030    Conditional=MEDIA_STREAM,
    3131    CustomToJSObject,
     32    ExportToWrappedFunction,
    3233    PrivateIdentifier,
    3334    PublicIdentifier,
  • trunk/Source/WebCore/platform/mediastream/RealtimeMediaSource.h

    r213941 r213972  
    138138    virtual void setRemote(bool remote) { m_remote = remote; }
    139139
    140     void addObserver(Observer&);
    141     void removeObserver(Observer&);
     140    WEBCORE_EXPORT void addObserver(Observer&);
     141    WEBCORE_EXPORT void removeObserver(Observer&);
    142142
    143143    virtual void startProducingData() { }
  • trunk/Source/WebCore/testing/Internals.cpp

    r213719 r213972  
    9191#include "MediaPlayer.h"
    9292#include "MediaProducer.h"
     93#include "MediaStreamTrack.h"
    9394#include "MemoryCache.h"
    9495#include "MemoryInfo.h"
     
    377378Internals::~Internals()
    378379{
     380    if (m_track)
     381        m_track->source().removeObserver(*this);
    379382}
    380383
     
    38263829
    38273830
     3831void Internals::observeMediaStreamTrack(MediaStreamTrack& track)
     3832{
     3833    m_track = &track;
     3834    m_track->source().addObserver(*this);
     3835}
     3836
    38283837} // namespace WebCore
  • trunk/Source/WebCore/testing/Internals.h

    r213719 r213972  
    3131#include "ExceptionOr.h"
    3232#include "PageConsoleClient.h"
     33#include "RealtimeMediaSource.h"
    3334#include <runtime/Float32Array.h>
    3435
     
    5859class MallocStatistics;
    5960class MediaSession;
     61class MediaStreamTrack;
    6062class MemoryInfo;
    6163class MockCDMFactory;
     
    7678class XMLHttpRequest;
    7779
    78 class Internals final : public RefCounted<Internals>, private ContextDestructionObserver {
     80class Internals final : public RefCounted<Internals>,  private ContextDestructionObserver, private RealtimeMediaSource::Observer {
    7981public:
    8082    static Ref<Internals> create(Document&);
     
    545547#endif
    546548
     549    unsigned long trackAudioSampleCount() const { return m_trackAudioSampleCount; }
     550    unsigned long trackVideoSampleCount() const { return m_trackVideoSampleCount; }
     551    void observeMediaStreamTrack(MediaStreamTrack&);
     552
    547553private:
    548554    explicit Internals(Document&);
     
    552558    ExceptionOr<RenderedDocumentMarker*> markerAt(Node&, const String& markerType, unsigned index);
    553559
     560    // RealtimeMediaSource::Observer API
     561    void videoSampleAvailable(MediaSample&) final { m_trackVideoSampleCount++; }
     562    void audioSamplesAvailable(const MediaTime&, const PlatformAudioData&, const AudioStreamDescription&, size_t) final { m_trackAudioSampleCount++; }
     563
    554564    std::unique_ptr<InspectorStubFrontend> m_inspectorFrontend;
     565
     566    unsigned long m_trackVideoSampleCount { 0 };
     567    unsigned long m_trackAudioSampleCount { 0 };
     568    RefPtr<MediaStreamTrack> m_track;
    555569};
    556570
  • trunk/Source/WebCore/testing/Internals.idl

    r213719 r213972  
    517517
    518518    [Conditional=WEBGL] void simulateWebGLContextChanged(WebGLRenderingContextBase context);
    519 };
     519
     520    void observeMediaStreamTrack(MediaStreamTrack track);
     521    readonly attribute unsigned long trackAudioSampleCount;
     522    readonly attribute unsigned long trackVideoSampleCount;
     523};
Note: See TracChangeset for help on using the changeset viewer.