Changeset 213598 in webkit


Ignore:
Timestamp:
Mar 8, 2017 2:44:42 PM (7 years ago)
Author:
commit-queue@webkit.org
Message:

Support canvas captureStream
https://bugs.webkit.org/show_bug.cgi?id=169192

Patch by Youenn Fablet <youenn@apple.com> on 2017-03-08
Reviewed by Dean Jackson.

Source/WebCore:

Tests: fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html

fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-creation.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html
fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html

Adding canvas captureStream as defined in https://w3c.github.io/mediacapture-fromelement/#html-canvas-element-media-capture-extensions
This allows creating a video MediaStreamTrack fed by canvas taken frames.
Frames are produced when canvas get changed.

Tests taken from Chromium.

  • CMakeLists.txt:
  • DerivedSources.make:
  • Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp: Added.

(WebCore::CanvasCaptureMediaStreamTrack::create):
(WebCore::CanvasCaptureMediaStreamTrack::CanvasCaptureMediaStreamTrack):
(WebCore::CanvasCaptureMediaStreamTrack::Source::create):
(WebCore::CanvasCaptureMediaStreamTrack::Source::Source):
(WebCore::CanvasCaptureMediaStreamTrack::Source::startProducingData):
(WebCore::CanvasCaptureMediaStreamTrack::Source::stopProducingData):
(WebCore::CanvasCaptureMediaStreamTrack::Source::requestFrameTimerFired):
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasDestroyed):
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasResized):
(WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):
(WebCore::CanvasCaptureMediaStreamTrack::Source::captureCanvas):
(WebCore::CanvasCaptureMediaStreamTrack::Source::paintCurrentFrameInContext):
(WebCore::CanvasCaptureMediaStreamTrack::Source::currentFrameImage):

  • Modules/mediastream/CanvasCaptureMediaStreamTrack.h: Added.

(isType):

  • Modules/mediastream/CanvasCaptureMediaStreamTrack.idl: Added.
  • Modules/mediastream/MediaStreamTrack.h:

(WebCore::MediaStreamTrack::isCanvas):

  • Modules/mediastream/MediaStreamTrack.idl:
  • WebCore.xcodeproj/project.pbxproj:
  • bindings/js/JSMediaStreamTrackCustom.cpp:

(WebCore::toJSNewlyCreated):
(WebCore::toJS):

  • html/HTMLCanvasElement.cpp:

(WebCore::HTMLCanvasElement::toMediaSample):
(WebCore::HTMLCanvasElement::captureStream):

  • html/HTMLCanvasElement.h:
  • html/HTMLCanvasElement.idl:
  • html/canvas/WebGL2RenderingContext.cpp:

(WebCore::WebGL2RenderingContext::clear):

  • html/canvas/WebGLRenderingContextBase.cpp:

(WebCore::WebGLRenderingContextBase::markContextChangedAndNotifyCanvasObserver):
(WebCore::WebGLRenderingContextBase::drawArrays):
(WebCore::WebGLRenderingContextBase::drawElements):
(WebCore::WebGLRenderingContextBase::drawArraysInstanced):
(WebCore::WebGLRenderingContextBase::drawElementsInstanced):

  • html/canvas/WebGLRenderingContextBase.h:
  • platform/graphics/ImageBuffer.cpp:

(WebCore::ImageBuffer::toBGRAData):

  • platform/graphics/ImageBuffer.h:
  • platform/graphics/avfoundation/MediaSampleAVFObjC.h:
  • platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm:

(WebCore::releaseUint8Vector):
(WebCore::MediaSampleAVFObjC::createImageSample):

  • platform/graphics/cg/ImageBufferCG.cpp:
  • platform/graphics/cg/ImageBufferDataCG.cpp:

(WebCore::transferData):
(WebCore::ImageBufferData::toBGRAData):

  • platform/graphics/cg/ImageBufferDataCG.h:

LayoutTests:

  • fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-creation.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events-expected.txt: Added.
  • fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html: Added.
  • fast/mediacapturefromelement/resources/svg-with-image-with-foreignobject.svg: Added.
  • fast/mediacapturefromelement/resources/webgl-test.js: Added.
Location:
trunk
Files:
30 added
22 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/LayoutTests/ChangeLog

    r213595 r213598  
     12017-03-08  Youenn Fablet  <youenn@apple.com>
     2
     3        Support canvas captureStream
     4        https://bugs.webkit.org/show_bug.cgi?id=169192
     5
     6        Reviewed by Dean Jackson.
     7
     8        * fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events-expected.txt: Added.
     9        * fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html: Added.
     10        * fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element-expected.txt: Added.
     11        * fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element.html: Added.
     12        * fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track-expected.txt: Added.
     13        * fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track.html: Added.
     14        * fast/mediacapturefromelement/CanvasCaptureMediaStream-creation-expected.txt: Added.
     15        * fast/mediacapturefromelement/CanvasCaptureMediaStream-creation.html: Added.
     16        * fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions-expected.txt: Added.
     17        * fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions.html: Added.
     18        * fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0-expected.txt: Added.
     19        * fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html: Added.
     20        * fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext-expected.txt: Added.
     21        * fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html: Added.
     22        * fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas-expected.txt: Added.
     23        * fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas.html: Added.
     24        * fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events-expected.txt: Added.
     25        * fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html: Added.
     26        * fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events-expected.txt: Added.
     27        * fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html: Added.
     28        * fast/mediacapturefromelement/resources/svg-with-image-with-foreignobject.svg: Added.
     29        * fast/mediacapturefromelement/resources/webgl-test.js: Added.
     30
    1312017-03-08  Antoine Quint  <graouts@apple.com>
    232
  • trunk/Source/WebCore/CMakeLists.txt

    r213493 r213598  
    218218    Modules/mediasource/VideoPlaybackQuality.idl
    219219
     220    Modules/mediastream/CanvasCaptureMediaStreamTrack.idl
    220221    Modules/mediastream/DOMURLMediaStream.idl
    221222    Modules/mediastream/DoubleRange.idl
     
    911912    Modules/mediasource/VideoPlaybackQuality.cpp
    912913
     914    Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp
    913915    Modules/mediastream/DOMURLMediaStream.cpp
    914916    Modules/mediastream/MediaConstraintsImpl.cpp
     
    11671169    bindings/js/JSMainThreadExecState.cpp
    11681170    bindings/js/JSMediaKeySessionCustom.cpp
     1171    bindings/js/JSMediaStreamTrackCustom.cpp
    11691172    bindings/js/JSMessageChannelCustom.cpp
    11701173    bindings/js/JSMessageEventCustom.cpp
  • trunk/Source/WebCore/ChangeLog

    r213597 r213598  
     12017-03-08  Youenn Fablet  <youenn@apple.com>
     2
     3        Support canvas captureStream
     4        https://bugs.webkit.org/show_bug.cgi?id=169192
     5
     6        Reviewed by Dean Jackson.
     7
     8        Tests: fast/mediacapturefromelement/CanvasCaptureMediaStream-2d-events.html
     9               fast/mediacapturefromelement/CanvasCaptureMediaStream-capture-out-of-DOM-element.html
     10               fast/mediacapturefromelement/CanvasCaptureMediaStream-clone-track.html
     11               fast/mediacapturefromelement/CanvasCaptureMediaStream-creation.html
     12               fast/mediacapturefromelement/CanvasCaptureMediaStream-exceptions.html
     13               fast/mediacapturefromelement/CanvasCaptureMediaStream-framerate-0.html
     14               fast/mediacapturefromelement/CanvasCaptureMediaStream-imagebitmaprenderingcontext.html
     15               fast/mediacapturefromelement/CanvasCaptureMediaStream-offscreencanvas.html
     16               fast/mediacapturefromelement/CanvasCaptureMediaStream-request-frame-events.html
     17               fast/mediacapturefromelement/CanvasCaptureMediaStream-webgl-events.html
     18
     19        Adding canvas captureStream as defined in https://w3c.github.io/mediacapture-fromelement/#html-canvas-element-media-capture-extensions
     20        This allows creating a video MediaStreamTrack fed by canvas taken frames.
     21        Frames are produced when canvas get changed.
     22
     23        Tests taken from Chromium.
     24
     25        * CMakeLists.txt:
     26        * DerivedSources.make:
     27        * Modules/mediastream/CanvasCaptureMediaStreamTrack.cpp: Added.
     28        (WebCore::CanvasCaptureMediaStreamTrack::create):
     29        (WebCore::CanvasCaptureMediaStreamTrack::CanvasCaptureMediaStreamTrack):
     30        (WebCore::CanvasCaptureMediaStreamTrack::Source::create):
     31        (WebCore::CanvasCaptureMediaStreamTrack::Source::Source):
     32        (WebCore::CanvasCaptureMediaStreamTrack::Source::startProducingData):
     33        (WebCore::CanvasCaptureMediaStreamTrack::Source::stopProducingData):
     34        (WebCore::CanvasCaptureMediaStreamTrack::Source::requestFrameTimerFired):
     35        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasDestroyed):
     36        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasResized):
     37        (WebCore::CanvasCaptureMediaStreamTrack::Source::canvasChanged):
     38        (WebCore::CanvasCaptureMediaStreamTrack::Source::captureCanvas):
     39        (WebCore::CanvasCaptureMediaStreamTrack::Source::paintCurrentFrameInContext):
     40        (WebCore::CanvasCaptureMediaStreamTrack::Source::currentFrameImage):
     41        * Modules/mediastream/CanvasCaptureMediaStreamTrack.h: Added.
     42        (isType):
     43        * Modules/mediastream/CanvasCaptureMediaStreamTrack.idl: Added.
     44        * Modules/mediastream/MediaStreamTrack.h:
     45        (WebCore::MediaStreamTrack::isCanvas):
     46        * Modules/mediastream/MediaStreamTrack.idl:
     47        * WebCore.xcodeproj/project.pbxproj:
     48        * bindings/js/JSMediaStreamTrackCustom.cpp:
     49        (WebCore::toJSNewlyCreated):
     50        (WebCore::toJS):
     51        * html/HTMLCanvasElement.cpp:
     52        (WebCore::HTMLCanvasElement::toMediaSample):
     53        (WebCore::HTMLCanvasElement::captureStream):
     54        * html/HTMLCanvasElement.h:
     55        * html/HTMLCanvasElement.idl:
     56        * html/canvas/WebGL2RenderingContext.cpp:
     57        (WebCore::WebGL2RenderingContext::clear):
     58        * html/canvas/WebGLRenderingContextBase.cpp:
     59        (WebCore::WebGLRenderingContextBase::markContextChangedAndNotifyCanvasObserver):
     60        (WebCore::WebGLRenderingContextBase::drawArrays):
     61        (WebCore::WebGLRenderingContextBase::drawElements):
     62        (WebCore::WebGLRenderingContextBase::drawArraysInstanced):
     63        (WebCore::WebGLRenderingContextBase::drawElementsInstanced):
     64        * html/canvas/WebGLRenderingContextBase.h:
     65        * platform/graphics/ImageBuffer.cpp:
     66        (WebCore::ImageBuffer::toBGRAData):
     67        * platform/graphics/ImageBuffer.h:
     68        * platform/graphics/avfoundation/MediaSampleAVFObjC.h:
     69        * platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm:
     70        (WebCore::releaseUint8Vector):
     71        (WebCore::MediaSampleAVFObjC::createImageSample):
     72        * platform/graphics/cg/ImageBufferCG.cpp:
     73        * platform/graphics/cg/ImageBufferDataCG.cpp:
     74        (WebCore::transferData):
     75        (WebCore::ImageBufferData::toBGRAData):
     76        * platform/graphics/cg/ImageBufferDataCG.h:
     77
    1782017-03-07  Anders Carlsson  <andersca@apple.com>
    279
  • trunk/Source/WebCore/DerivedSources.make

    r213489 r213598  
    157157    $(WebCore)/Modules/mediasource/VideoPlaybackQuality.idl \
    158158    $(WebCore)/Modules/mediasource/VideoTrackMediaSource.idl \
     159    $(WebCore)/Modules/mediastream/CanvasCaptureMediaStreamTrack.idl \
    159160    $(WebCore)/Modules/mediastream/DOMURLMediaStream.idl \
    160161    $(WebCore)/Modules/mediastream/DoubleRange.idl \
  • trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.h

    r209959 r213598  
    4444struct MediaTrackConstraints;
    4545
    46 class MediaStreamTrack final : public RefCounted<MediaStreamTrack>, public ActiveDOMObject, public EventTargetWithInlineData, private MediaStreamTrackPrivate::Observer {
     46class MediaStreamTrack : public RefCounted<MediaStreamTrack>, public ActiveDOMObject, public EventTargetWithInlineData, private MediaStreamTrackPrivate::Observer {
    4747public:
    4848    class Observer {
     
    5454    static Ref<MediaStreamTrack> create(ScriptExecutionContext&, Ref<MediaStreamTrackPrivate>&&);
    5555    virtual ~MediaStreamTrack();
     56
     57    virtual bool isCanvas() const { return false; }
    5658
    5759    const AtomicString& kind() const;
     
    118120    using RefCounted::deref;
    119121
     122protected:
     123    MediaStreamTrack(ScriptExecutionContext&, Ref<MediaStreamTrackPrivate>&&);
     124
    120125private:
    121     MediaStreamTrack(ScriptExecutionContext&, Ref<MediaStreamTrackPrivate>&&);
    122126    explicit MediaStreamTrack(MediaStreamTrack&);
    123127
     
    136140
    137141    // MediaStreamTrackPrivate::Observer
    138     void trackEnded(MediaStreamTrackPrivate&) override;
    139     void trackMutedChanged(MediaStreamTrackPrivate&) override;
    140     void trackSettingsChanged(MediaStreamTrackPrivate&) override;
    141     void trackEnabledChanged(MediaStreamTrackPrivate&) override;
     142    void trackEnded(MediaStreamTrackPrivate&) final;
     143    void trackMutedChanged(MediaStreamTrackPrivate&) final;
     144    void trackSettingsChanged(MediaStreamTrackPrivate&) final;
     145    void trackEnabledChanged(MediaStreamTrackPrivate&) final;
    142146
    143147    WeakPtr<MediaStreamTrack> createWeakPtr() { return m_weakPtrFactory.createWeakPtr(); }
  • trunk/Source/WebCore/Modules/mediastream/MediaStreamTrack.idl

    r209959 r213598  
    2929    ActiveDOMObject,
    3030    Conditional=MEDIA_STREAM,
     31    CustomToJSObject,
    3132    PrivateIdentifier,
    3233    PublicIdentifier,
    33     SkipVTableValidation,
    3434] interface MediaStreamTrack : EventTarget {
    3535    readonly attribute DOMString kind;
  • trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj

    r213567 r213598  
    114114                0720B0A014D3323500642955 /* GenericEventQueue.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 0720B09E14D3323500642955 /* GenericEventQueue.cpp */; };
    115115                0720B0A114D3323500642955 /* GenericEventQueue.h in Headers */ = {isa = PBXBuildFile; fileRef = 0720B09F14D3323500642955 /* GenericEventQueue.h */; settings = {ATTRIBUTES = (Private, ); }; };
     116                07277E4C17D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07277E4017D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.cpp */; };
     117                07277E4D17D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4117D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h */; };
    116118                07277E4C17D018CC0015534D /* JSMediaStream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 07277E4017D018CC0015534D /* JSMediaStream.cpp */; };
    117119                07277E4D17D018CC0015534D /* JSMediaStream.h in Headers */ = {isa = PBXBuildFile; fileRef = 07277E4117D018CC0015534D /* JSMediaStream.h */; };
     
    15631565                4157EBFA1E3AB67900AC9FE9 /* MockLibWebRTCPeerConnection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4157EBF91E3AB06800AC9FE9 /* MockLibWebRTCPeerConnection.cpp */; };
    15641566                4157EBFB1E3AB67F00AC9FE9 /* MockLibWebRTCPeerConnection.h in Headers */ = {isa = PBXBuildFile; fileRef = 4157EBF81E3AB06800AC9FE9 /* MockLibWebRTCPeerConnection.h */; };
     1567                415CDAF41E6B8F87004F11EE /* CanvasCaptureMediaStreamTrack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41C7E1051E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.cpp */; };
     1568                415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */ = {isa = PBXBuildFile; fileRef = 41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */; };
     1569                415CDAF71E6CE0DE004F11EE /* JSMediaStreamTrackCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 415CDAF61E6CE0D3004F11EE /* JSMediaStreamTrackCustom.cpp */; };
    15651570                41614A781DA6423B004AD06F /* HTTPHeaderValues.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 41614A761DA64236004AD06F /* HTTPHeaderValues.cpp */; };
    15661571                41614A791DA64241004AD06F /* HTTPHeaderValues.h in Headers */ = {isa = PBXBuildFile; fileRef = 41614A771DA64236004AD06F /* HTTPHeaderValues.h */; };
     
    72907295                07221BAD17CF0AD400848E51 /* RTCSessionDescriptionRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCSessionDescriptionRequest.h; sourceTree = "<group>"; };
    72917296                07221BB017CF0AD400848E51 /* RTCVoidRequest.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = RTCVoidRequest.h; sourceTree = "<group>"; };
     7297                07277E4017D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSCanvasCaptureMediaStreamTrack.cpp; sourceTree = "<group>"; };
     7298                07277E4117D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSCanvasCaptureMediaStreamTrack.h; sourceTree = "<group>"; };
    72927299                07277E4017D018CC0015534D /* JSMediaStream.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSMediaStream.cpp; sourceTree = "<group>"; };
    72937300                07277E4117D018CC0015534D /* JSMediaStream.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = JSMediaStream.h; sourceTree = "<group>"; };
     
    88838890                4157EBF81E3AB06800AC9FE9 /* MockLibWebRTCPeerConnection.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = MockLibWebRTCPeerConnection.h; sourceTree = "<group>"; };
    88848891                4157EBF91E3AB06800AC9FE9 /* MockLibWebRTCPeerConnection.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = MockLibWebRTCPeerConnection.cpp; sourceTree = "<group>"; };
     8892                415CDAF61E6CE0D3004F11EE /* JSMediaStreamTrackCustom.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = JSMediaStreamTrackCustom.cpp; sourceTree = "<group>"; };
    88858893                41614A761DA64236004AD06F /* HTTPHeaderValues.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = HTTPHeaderValues.cpp; sourceTree = "<group>"; };
    88868894                41614A771DA64236004AD06F /* HTTPHeaderValues.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = HTTPHeaderValues.h; sourceTree = "<group>"; };
     
    89458953                41BF700E0FE86F61005E8DEC /* PlatformMessagePortChannel.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = PlatformMessagePortChannel.h; path = default/PlatformMessagePortChannel.h; sourceTree = "<group>"; };
    89468954                41C760B00EDE03D300C1655F /* ScriptState.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ScriptState.h; sourceTree = "<group>"; };
     8955                41C7E1051E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = CanvasCaptureMediaStreamTrack.cpp; sourceTree = "<group>"; };
     8956                41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = CanvasCaptureMediaStreamTrack.h; sourceTree = "<group>"; };
     8957                41C7E1081E6AA37C0027B4DE /* CanvasCaptureMediaStreamTrack.idl */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = CanvasCaptureMediaStreamTrack.idl; sourceTree = "<group>"; };
    89478958                41CF8BE41D46222000707DC9 /* FetchBodyConsumer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = FetchBodyConsumer.cpp; sourceTree = "<group>"; };
    89488959                41CF8BE51D46222000707DC9 /* FetchBodyConsumer.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = FetchBodyConsumer.h; sourceTree = "<group>"; };
     
    1544215453                                93A806111E03B51C008A1F26 /* DoubleRange.h */,
    1544315454                                93A806121E03B51C008A1F26 /* DoubleRange.idl */,
     15455                                41C7E1051E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.cpp */,
     15456                                41C7E1061E6A54360027B4DE /* CanvasCaptureMediaStreamTrack.h */,
     15457                                41C7E1081E6AA37C0027B4DE /* CanvasCaptureMediaStreamTrack.idl */,
    1544415458                                0779BF0B18453168000B6AE7 /* HTMLMediaElementMediaStream.h */,
    1544515459                                0779BF0C18453168000B6AE7 /* HTMLMediaElementMediaStream.idl */,
     
    1569315707                                15739BB81B42012200D258C1 /* JSMediaDevices.cpp */,
    1569415708                                15739BB91B42012200D258C1 /* JSMediaDevices.h */,
     15709                                07277E4017D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.cpp */,
     15710                                07277E4117D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h */,
    1569515711                                07277E4017D018CC0015534D /* JSMediaStream.cpp */,
    1569615712                                07277E4117D018CC0015534D /* JSMediaStream.h */,
     
    2271422730                                2D9BF7481DBFDDF8007A7D99 /* JSMediaKeySessionCustom.cpp */,
    2271522731                                410B7E711045FAB000D8224F /* JSMessageEventCustom.cpp */,
     22732                                415CDAF61E6CE0D3004F11EE /* JSMediaStreamTrackCustom.cpp */,
    2271622733                                A1E5B31D1AAD1DA4006EBEFB /* JSMockContentFilterSettingsCustom.cpp */,
    2271722734                                C6F0917E143A2BB900685849 /* JSMutationObserverCustom.cpp */,
     
    2704827065                                7C5343FD17B74B63004232F0 /* JSMediaQueryListListener.h in Headers */,
    2704927066                                CD9DE17517AAC74C00EA386D /* JSMediaSource.h in Headers */,
     27067                                07277E4D17D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.h in Headers */,
    2705027068                                07277E4D17D018CC0015534D /* JSMediaStream.h in Headers */,
    2705127069                                07277E4F17D018CC0015534D /* JSMediaStreamAudioDestinationNode.h in Headers */,
     
    2866228680                                B2227AA00D00BF220071B782 /* SVGRenderingIntent.h in Headers */,
    2866328681                                BC2274790E8366E200E7F975 /* SVGRenderStyle.h in Headers */,
     28682                                415CDAF51E6B8F8B004F11EE /* CanvasCaptureMediaStreamTrack.h in Headers */,
    2866428683                                BC22747B0E8366E200E7F975 /* SVGRenderStyleDefs.h in Headers */,
    2866528684                                436708F212D9CA4B00044234 /* SVGRenderSupport.h in Headers */,
     
    3080330822                                A80E7B140A19D606007FB8C5 /* JSHTMLHeadElement.cpp in Sources */,
    3080430823                                1AE2AA2E0A1CDAB400B42B25 /* JSHTMLHeadingElement.cpp in Sources */,
     30824                                415CDAF41E6B8F87004F11EE /* CanvasCaptureMediaStreamTrack.cpp in Sources */,
    3080530825                                1AE2AA300A1CDAB400B42B25 /* JSHTMLHRElement.cpp in Sources */,
    3080630826                                1A85B18F0A1B18A200D8C87C /* JSHTMLHtmlElement.cpp in Sources */,
     
    3091430934                                C9DADBCB1B1D3B97001F17D8 /* JSMediaSession.cpp in Sources */,
    3091530935                                CD9DE17417AAC74C00EA386D /* JSMediaSource.cpp in Sources */,
     30936                                07277E4C17D018CC0015534E /* JSCanvasCaptureMediaStreamTrack.cpp in Sources */,
    3091630937                                07277E4C17D018CC0015534D /* JSMediaStream.cpp in Sources */,
    3091730938                                07277E4E17D018CC0015534D /* JSMediaStreamAudioDestinationNode.cpp in Sources */,
     
    3152831549                                C6F0900E14327B6100685849 /* MutationObserver.cpp in Sources */,
    3152931550                                D6E528A3149A926D00EFE1F3 /* MutationObserverInterestGroup.cpp in Sources */,
     31551                                415CDAF71E6CE0DE004F11EE /* JSMediaStreamTrackCustom.cpp in Sources */,
    3153031552                                D6E276AF14637455001D280A /* MutationObserverRegistration.cpp in Sources */,
    3153131553                                C6F08FBC1430FE8F00685849 /* MutationRecord.cpp in Sources */,
  • trunk/Source/WebCore/bindings/js/JSBindingsAllInOne.cpp

    r212207 r213598  
    8787#include "JSLocationCustom.cpp"
    8888#include "JSMainThreadExecState.cpp"
     89#include "JSMediaStreamTrackCustom.cpp"
    8990#include "JSMessageChannelCustom.cpp"
    9091#include "JSMessageEventCustom.cpp"
  • trunk/Source/WebCore/bindings/js/JSMediaStreamTrackCustom.cpp

    r213597 r213598  
    11/*
    2  * Copyright (C) 2006, 2008, 2009 Apple Inc. All rights reserved.
    3  * Copyright (C) 2010 Torch Mobile (Beijing) Co. Ltd. All rights reserved.
     2 * Copyright (C) 2017 Apple Inc. All rights reserved.
    43 *
    54 * Redistribution and use in source and binary forms, with or without
     
    2221 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
    2322 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
    24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
     23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
    2524 */
    2625
    27 typedef (CanvasRenderingContext2D or WebGLRenderingContextBase) RenderingContext;
     26#include "config.h"
     27#include "JSMediaStreamTrack.h"
    2828
    29 [
    30     JSGenerateToNativeObject,
    31     ReportExtraMemoryCost,
    32     ReportExternalMemoryCost,
    33 ] interface HTMLCanvasElement : HTMLElement {
    34     attribute unsigned long width;
    35     attribute unsigned long height;
     29#if ENABLE(MEDIA_STREAM)
    3630
    37     [Custom] RenderingContext? getContext(DOMString contextId, any... arguments);
     31#include "JSCanvasCaptureMediaStreamTrack.h"
     32#include "JSDOMBinding.h"
    3833
    39     [Custom, MayThrowException] DOMString toDataURL(optional DOMString? type);
    40     [CallWith=ScriptExecutionContext, MayThrowException] void toBlob(BlobCallback callback, optional DOMString type, optional any quality);
    41 };
     34namespace WebCore {
     35
     36JSC::JSValue toJSNewlyCreated(JSC::ExecState*, JSDOMGlobalObject* globalObject, Ref<MediaStreamTrack>&& object)
     37{
     38    if (is<CanvasCaptureMediaStreamTrack>(object.get()))
     39        return createWrapper<CanvasCaptureMediaStreamTrack>(globalObject, WTFMove(object));
     40    return createWrapper<MediaStreamTrack>(globalObject, WTFMove(object));
     41}
     42
     43JSC::JSValue toJS(JSC::ExecState* state, JSDOMGlobalObject* globalObject, MediaStreamTrack& track)
     44{
     45    return wrap(state, globalObject, track);
     46}
     47
     48}
     49
     50#endif
  • trunk/Source/WebCore/html/HTMLCanvasElement.cpp

    r213437 r213598  
    5353#include <wtf/text/StringBuilder.h>
    5454
    55 #if ENABLE(WEBGL)   
     55#if ENABLE(MEDIA_STREAM)
     56#include "CanvasCaptureMediaStreamTrack.h"
     57#include "MediaStream.h"
     58#endif
     59
     60#if ENABLE(WEBGL)
    5661#include "WebGLContextAttributes.h"
    5762#include "WebGLRenderingContextBase.h"
     63#endif
     64
     65#if PLATFORM(COCOA)
     66#include "MediaSampleAVFObjC.h"
     67
     68#include "CoreMediaSoftLink.h"
    5869#endif
    5970
     
    300311        FloatRect r = mapRect(dirtyRect, FloatRect(0, 0, size().width(), size().height()), destRect);
    301312        r.intersect(destRect);
    302         if (r.isEmpty() || m_dirtyRect.contains(r))
    303             return;
    304 
    305         m_dirtyRect.unite(r);
    306         ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
     313        if (!r.isEmpty() && !m_dirtyRect.contains(r)) {
     314            m_dirtyRect.unite(r);
     315            ro->repaintRectangle(enclosingIntRect(m_dirtyRect));
     316        }
    307317    }
    308318    notifyObserversCanvasChanged(dirtyRect);
     
    538548}
    539549
     550#if ENABLE(MEDIA_STREAM)
     551
     552RefPtr<MediaSample> HTMLCanvasElement::toMediaSample()
     553{
     554    auto* imageBuffer = buffer();
     555    if (!imageBuffer)
     556        return nullptr;
     557
     558#if PLATFORM(COCOA)
     559    makeRenderingResultsAvailable();
     560    return MediaSampleAVFObjC::createImageSample(imageBuffer->toBGRAData(), width(), height());
     561#else
     562    return nullptr;
     563#endif
     564}
     565
     566ExceptionOr<Ref<MediaStream>> HTMLCanvasElement::captureStream(ScriptExecutionContext& context, std::optional<double>&& frameRequestRate)
     567{
     568    if (!originClean())
     569        return Exception(SECURITY_ERR, ASCIILiteral("Canvas is tainted"));
     570
     571    if (frameRequestRate && frameRequestRate.value() < 0)
     572        return Exception(NOT_SUPPORTED_ERR, ASCIILiteral("frameRequestRate is negative"));
     573   
     574    auto track = CanvasCaptureMediaStreamTrack::create(context, *this, WTFMove(frameRequestRate));
     575    auto stream =  MediaStream::create(context);
     576    stream->addTrack(track);
     577    return WTFMove(stream);
     578}
     579#endif
     580
    540581FloatRect HTMLCanvasElement::convertLogicalToDevice(const FloatRect& logicalRect) const
    541582{
  • trunk/Source/WebCore/html/HTMLCanvasElement.h

    r213412 r213598  
    4848class ImageBuffer;
    4949class ImageData;
     50class MediaSample;
     51class MediaStream;
    5052
    5153namespace DisplayList {
     
    116118    CanvasRenderingContext* renderingContext() const { return m_context.get(); }
    117119
     120#if ENABLE(MEDIA_STREAM)
     121    RefPtr<MediaSample> toMediaSample();
     122    ExceptionOr<Ref<MediaStream>> captureStream(ScriptExecutionContext&, std::optional<double>&& frameRequestRate);
     123#endif
     124
    118125    ImageBuffer* buffer() const;
    119126    Image* copiedImage() const;
  • trunk/Source/WebCore/html/HTMLCanvasElement.idl

    r213412 r213598  
    3939    [Custom, MayThrowException] DOMString toDataURL(optional DOMString? type);
    4040    [CallWith=ScriptExecutionContext, MayThrowException] void toBlob(BlobCallback callback, optional DOMString type, optional any quality);
     41
     42    [Conditional=MEDIA_STREAM, CallWith=ScriptExecutionContext, MayThrowException, NewObject] MediaStream captureStream(optional double frameRequestRate);
    4143};
  • trunk/Source/WebCore/html/canvas/WebGL2RenderingContext.cpp

    r210567 r213598  
    603603    if (!clearIfComposited(mask))
    604604        m_context->clear(mask);
    605     markContextChanged();
     605    markContextChangedAndNotifyCanvasObserver();
    606606}
    607607
  • trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.cpp

    r212784 r213598  
    713713}
    714714
     715void WebGLRenderingContextBase::markContextChangedAndNotifyCanvasObserver()
     716{
     717    markContextChanged();
     718    if (!isAccelerated())
     719        return;
     720   
     721    RenderBox* renderBox = canvas().renderBox();
     722    if (renderBox && renderBox->hasAcceleratedCompositing())
     723        canvas().notifyObserversCanvasChanged(FloatRect(FloatPoint(0, 0), clampedCanvasSize()));
     724}
     725
    715726bool WebGLRenderingContextBase::clearIfComposited(GC3Dbitfield mask)
    716727{
     
    19902001    if (usesFallbackTexture)
    19912002        checkTextureCompleteness("drawArrays", false);
    1992     markContextChanged();
     2003    markContextChangedAndNotifyCanvasObserver();
    19932004}
    19942005
     
    20182029    if (usesFallbackTexture)
    20192030        checkTextureCompleteness("drawElements", false);
    2020     markContextChanged();
     2031    markContextChangedAndNotifyCanvasObserver();
    20212032}
    20222033
     
    58355846    if (!isGLES2NPOTStrict())
    58365847        checkTextureCompleteness("drawArraysInstanced", false);
    5837     markContextChanged();
     5848    markContextChangedAndNotifyCanvasObserver();
    58385849}
    58395850
     
    58665877    if (!isGLES2NPOTStrict())
    58675878        checkTextureCompleteness("drawElementsInstanced", false);
    5868     markContextChanged();
     5879    markContextChangedAndNotifyCanvasObserver();
    58695880}
    58705881
  • trunk/Source/WebCore/html/canvas/WebGLRenderingContextBase.h

    r212784 r213598  
    397397    void destroyGraphicsContext3D();
    398398    void markContextChanged();
     399    void markContextChangedAndNotifyCanvasObserver();
    399400
    400401    void addActivityStateChangeObserverIfNecessary();
  • trunk/Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp

    r212927 r213598  
    4949SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVOpenGLESTextureGetName, GLuint, (CVOpenGLESTextureRef image), (image))
    5050SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferCreate, CVReturn, (CFAllocatorRef allocator, size_t width, size_t height, OSType pixelFormatType, CFDictionaryRef pixelBufferAttributes, CVPixelBufferRef *pixelBufferOut), (allocator, width, height, pixelFormatType, pixelBufferAttributes, pixelBufferOut))
     51SOFT_LINK_FUNCTION_FOR_SOURCE(WebCore, CoreVideo, CVPixelBufferCreateWithBytes, CVReturn, (CFAllocatorRef allocator, size_t width, size_t height, OSType pixelFormatType, void* data, size_t bytesPerRow, void (*releaseCallback)(void*, const void*), void* releasePointer, CFDictionaryRef pixelBufferAttributes, CVPixelBufferRef *pixelBufferOut), (allocator, width, height, pixelFormatType, data, bytesPerRow, releaseCallback, releasePointer, pixelBufferAttributes, pixelBufferOut))
    5152SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, CoreVideo, kCVPixelBufferCGBitmapContextCompatibilityKey, CFStringRef)
    5253SOFT_LINK_CONSTANT_FOR_SOURCE(WebCore, CoreVideo, kCVPixelBufferCGImageCompatibilityKey, CFStringRef)
  • trunk/Source/WebCore/platform/cocoa/CoreVideoSoftLink.h

    r212927 r213598  
    6767SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferCreate, CVReturn, (CFAllocatorRef allocator, size_t width, size_t height, OSType pixelFormatType, CFDictionaryRef pixelBufferAttributes, CVPixelBufferRef *pixelBufferOut), (allocator, width, height, pixelFormatType, pixelBufferAttributes, pixelBufferOut))
    6868#define CVPixelBufferCreate softLink_CoreVideo_CVPixelBufferCreate
     69SOFT_LINK_FUNCTION_FOR_HEADER(WebCore, CoreVideo, CVPixelBufferCreateWithBytes, CVReturn, (CFAllocatorRef allocator, size_t width, size_t height, OSType pixelFormatType, void* data, size_t bytesPerRow, void (*releaseCallback)(void*, const void*), void* releasePointer, CFDictionaryRef pixelBufferAttributes, CVPixelBufferRef *pixelBufferOut), (allocator, width, height, pixelFormatType, data, bytesPerRow, releaseCallback, releasePointer, pixelBufferAttributes, pixelBufferOut))
     70#define CVPixelBufferCreateWithBytes softLink_CoreVideo_CVPixelBufferCreateWithBytes
    6971
    7072SOFT_LINK_CONSTANT_FOR_HEADER(WebCore, CoreVideo, kCVPixelBufferCGBitmapContextCompatibilityKey, CFStringRef)
  • trunk/Source/WebCore/platform/graphics/ImageBuffer.cpp

    r207357 r213598  
    103103}
    104104
     105Vector<uint8_t> ImageBuffer::toBGRAData() const
     106{
     107#if USE(CG)
     108    if (context().isAcceleratedContext())
     109        flushContext();
     110    return m_data.toBGRAData(context().isAcceleratedContext(), m_size.width(), m_size.height());
     111#else
     112    // FIXME: Implement this for other backends.
     113    return { };
     114#endif
     115}
     116
    105117#if !(USE(CG) || USE(DIRECT2D))
    106118FloatSize ImageBuffer::sizeForDestinationSize(FloatSize size) const
  • trunk/Source/WebCore/platform/graphics/ImageBuffer.h

    r213508 r213598  
    114114    String toDataURL(const String& mimeType, std::optional<double> quality = std::nullopt, CoordinateSystem = LogicalCoordinateSystem) const;
    115115    Vector<uint8_t> toData(const String& mimeType, std::optional<double> quality = std::nullopt) const;
     116    Vector<uint8_t> toBGRAData() const;
     117
    116118#if !USE(CG)
    117119    AffineTransform baseTransform() const { return AffineTransform(); }
  • trunk/Source/WebCore/platform/graphics/avfoundation/MediaSampleAVFObjC.h

    r210621 r213598  
    2929#include "MediaTimeAVFoundation.h"
    3030
     31#include <runtime/Uint8ClampedArray.h>
     32#include <wtf/Vector.h>
     33
    3134namespace WebCore {
    32 
     35   
    3336class MediaSampleAVFObjC final : public MediaSample {
    3437public:
     
    3639    static Ref<MediaSampleAVFObjC> create(CMSampleBufferRef sample, AtomicString trackID) { return adoptRef(*new MediaSampleAVFObjC(sample, trackID)); }
    3740    static Ref<MediaSampleAVFObjC> create(CMSampleBufferRef sample) { return adoptRef(*new MediaSampleAVFObjC(sample)); }
     41    static RefPtr<MediaSampleAVFObjC> createImageSample(Ref<JSC::Uint8ClampedArray>&&, unsigned long width, unsigned long height);
     42    static RefPtr<MediaSampleAVFObjC> createImageSample(Vector<uint8_t>&&, unsigned long width, unsigned long height);
    3843
    3944private:
  • trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm

    r211399 r213598  
    3030
    3131#import "CoreMediaSoftLink.h"
     32#import "CoreVideoSoftLink.h"
    3233
    3334namespace WebCore {
     35
     36static inline void releaseUint8Vector(void *array, const void*)
     37{
     38    adoptMallocPtr(static_cast<uint8_t*>(array));
     39}
     40
     41RefPtr<MediaSampleAVFObjC> MediaSampleAVFObjC::createImageSample(Vector<uint8_t>&& array, unsigned long width, unsigned long height)
     42{
     43    CVPixelBufferRef imageBuffer = nullptr;
     44    auto status = CVPixelBufferCreateWithBytes(kCFAllocatorDefault, width, height, kCVPixelFormatType_32BGRA, array.data(), width * 4, releaseUint8Vector, array.releaseBuffer().leakPtr(), NULL, &imageBuffer);
     45
     46    ASSERT_UNUSED(status, !status);
     47    if (!imageBuffer)
     48        return nullptr;
     49
     50    CMVideoFormatDescriptionRef formatDescription = nullptr;
     51    status = CMVideoFormatDescriptionCreateForImageBuffer(kCFAllocatorDefault, imageBuffer, &formatDescription);
     52    ASSERT(!status);
     53
     54    CMSampleTimingInfo sampleTimingInformation = { kCMTimeInvalid, kCMTimeInvalid, kCMTimeInvalid };
     55
     56    CMSampleBufferRef sample;
     57    status = CMSampleBufferCreateReadyWithImageBuffer(kCFAllocatorDefault, imageBuffer, formatDescription, &sampleTimingInformation, &sample);
     58    ASSERT(!status);
     59
     60    CFArrayRef attachmentsArray = CMSampleBufferGetSampleAttachmentsArray(sample, true);
     61    for (CFIndex i = 0; i < CFArrayGetCount(attachmentsArray); ++i) {
     62        CFMutableDictionaryRef attachments = (CFMutableDictionaryRef)CFArrayGetValueAtIndex(attachmentsArray, i);
     63        CFDictionarySetValue(attachments, kCMSampleAttachmentKey_DisplayImmediately, kCFBooleanTrue);
     64    }
     65    return create(sample);
     66}
    3467
    3568MediaTime MediaSampleAVFObjC::presentationTime() const
  • trunk/Source/WebCore/platform/graphics/cg/ImageBufferDataCG.cpp

    r206830 r213598  
    9191#endif // USE(ACCELERATE)
    9292
     93static inline void transferData(void* output, void* input, int width, int height, size_t inputBytesPerRow)
     94{
     95#if USE(ACCELERATE)
     96    vImage_Buffer src;
     97    src.width = width;
     98    src.height = height;
     99    src.rowBytes = inputBytesPerRow;
     100    src.data = input;
     101
     102    vImage_Buffer dest;
     103    dest.width = width;
     104    dest.height = height;
     105    dest.rowBytes = width * 4;
     106    dest.data = output;
     107
     108    vImageUnpremultiplyData_BGRA8888(&src, &dest, kvImageNoFlags);
     109#else
     110    UNUSED_PARAM(output);
     111    UNUSED_PARAM(input);
     112    UNUSED_PARAM(width);
     113    UNUSED_PARAM(height);
     114    // FIXME: Add support for not ACCELERATE.
     115    ASSERT_NOT_REACHED();
     116#endif
     117}
     118
     119Vector<uint8_t> ImageBufferData::toBGRAData(bool accelerateRendering, int width, int height) const
     120{
     121    Vector<uint8_t> result(4 * width * height);
     122
     123    if (!accelerateRendering) {
     124        transferData(result.data(), data, width, height, 4 * backingStoreSize.width());
     125        return result;
     126    }
     127#if USE(IOSURFACE_CANVAS_BACKING_STORE)
     128    IOSurfaceRef surfaceRef = surface->surface();
     129    IOSurfaceLock(surfaceRef, kIOSurfaceLockReadOnly, nullptr);
     130    transferData(result.data(), IOSurfaceGetBaseAddress(surfaceRef), width, height, IOSurfaceGetBytesPerRow(surfaceRef));
     131    IOSurfaceUnlock(surfaceRef, kIOSurfaceLockReadOnly, nullptr);
     132#else
     133    ASSERT_NOT_REACHED();
     134#endif
     135    return result;
     136}
     137
     138
    93139RefPtr<Uint8ClampedArray> ImageBufferData::getData(const IntRect& rect, const IntSize& size, bool accelerateRendering, bool unmultiplied, float resolutionScale) const
    94140{
  • trunk/Source/WebCore/platform/graphics/cg/ImageBufferDataCG.h

    r187681 r213598  
    3030#include <wtf/RefPtr.h>
    3131#include <wtf/RetainPtr.h>
     32#include <wtf/Vector.h>
    3233
    3334#if PLATFORM(COCOA) && USE(CA) && !PLATFORM(IOS_SIMULATOR)
     
    5960#endif
    6061
     62    Vector<uint8_t> toBGRAData(bool accelerateRendering, int width, int height) const;
    6163    RefPtr<Uint8ClampedArray> getData(const IntRect&, const IntSize&, bool accelerateRendering, bool unmultiplied, float resolutionScale) const;
    6264    void putData(Uint8ClampedArray*& source, const IntSize& sourceSize, const IntRect& sourceRect, const IntPoint& destPoint, const IntSize&, bool accelerateRendering, bool unmultiplied, float resolutionScale);
Note: See TracChangeset for help on using the changeset viewer.