Skip to content
Permalink
Browse files
Use CMClock as a timing source for PlatformClock where available.
https://bugs.webkit.org/show_bug.cgi?id=77885

Reviewed by Eric Carlson.

Source/JavaScriptCore:

* wtf/Platform.h: Added WTF_USE_COREMEDIA.

Source/WebCore:

No new tests; performance improvement covered by existing test cases.

* WebCore.xcodeproj/project.pbxproj:
* platform/Clock.cpp:
(Clock::create): Use PlatformClockCM if available.
* platform/mac/PlatformClockCM.h: Added.
(WebCore::PlatformClockCM::playRate):
(WebCore::PlatformClockCM::isRunning):
* platform/mac/PlatformClockCM.mm: Added.
(PlatformClockCM::PlatformClockCM):
(PlatformClockCM::initializeWithTimingSource):
(PlatformClockCM::setCurrentTime):
(PlatformClockCM::currentTime):
(PlatformClockCM::setPlayRate):
(PlatformClockCM::start):
(PlatformClockCM::stop):

Canonical link: https://commits.webkit.org/94895@main
git-svn-id: https://svn.webkit.org/repository/webkit/trunk@106978 268f45cc-cd09-0410-ab3c-d52691b4dbfc
  • Loading branch information
jernoble committed Feb 7, 2012
1 parent 4b7eb91 commit f47f5a7f4ceed56a9399c0df1025cc530477f773
Showing 7 changed files with 228 additions and 2 deletions.
@@ -1,3 +1,12 @@
2012-02-06 Jer Noble <jer.noble@apple.com>

Use CMClock as a timing source for PlatformClock where available.
https://bugs.webkit.org/show_bug.cgi?id=77885

Reviewed by Eric Carlson.

* wtf/Platform.h: Added WTF_USE_COREMEDIA.

2012-02-06 Filip Pizlo <fpizlo@apple.com>

ValueToNumber and ValueToDouble nodes don't do anything and should be removed
@@ -1141,6 +1141,10 @@
#define WTF_USE_AVFOUNDATION 1
#endif

#if PLATFORM(MAC) && !defined(BUILDING_ON_LEOPARD) && !defined(BUILDING_ON_SNOW_LEOPARD) && !defined(BUILDING_ON_LION)
#define WTF_USE_COREMEDIA 1
#endif

#if PLATFORM(MAC) || PLATFORM(GTK) || PLATFORM(EFL) || (PLATFORM(WIN) && !OS(WINCE) && !PLATFORM(WIN_CAIRO)) || PLATFORM(QT)
#define WTF_USE_REQUEST_ANIMATION_FRAME_TIMER 1
#endif
@@ -1,3 +1,27 @@
2012-02-06 Jer Noble <jer.noble@apple.com>

Use CMClock as a timing source for PlatformClock where available.
https://bugs.webkit.org/show_bug.cgi?id=77885

Reviewed by Eric Carlson.

No new tests; performance improvement covered by existing test cases.

* WebCore.xcodeproj/project.pbxproj:
* platform/Clock.cpp:
(Clock::create): Use PlatformClockCM if available.
* platform/mac/PlatformClockCM.h: Added.
(WebCore::PlatformClockCM::playRate):
(WebCore::PlatformClockCM::isRunning):
* platform/mac/PlatformClockCM.mm: Added.
(PlatformClockCM::PlatformClockCM):
(PlatformClockCM::initializeWithTimingSource):
(PlatformClockCM::setCurrentTime):
(PlatformClockCM::currentTime):
(PlatformClockCM::setPlayRate):
(PlatformClockCM::start):
(PlatformClockCM::stop):

2012-02-06 Anders Carlsson <andersca@apple.com>

ScrollableAreaSet should be moved from Page to FrameView
@@ -5598,6 +5598,7 @@
CD82030D1395AB6A00F956C6 /* WebVideoFullscreenHUDWindowController.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD8203091395AB6A00F956C6 /* WebVideoFullscreenHUDWindowController.mm */; };
CD8203101395ACE700F956C6 /* WebWindowAnimation.h in Headers */ = {isa = PBXBuildFile; fileRef = CD82030E1395ACE700F956C6 /* WebWindowAnimation.h */; };
CD8203111395ACE700F956C6 /* WebWindowAnimation.mm in Sources */ = {isa = PBXBuildFile; fileRef = CD82030F1395ACE700F956C6 /* WebWindowAnimation.mm */; };
CDAA8D0A14D71B2E0061EA60 /* PlatformClockCM.mm in Sources */ = {isa = PBXBuildFile; fileRef = CDAA8D0814D385600061EA60 /* PlatformClockCM.mm */; };
CDD525D7145B6DD0008D204D /* JSHTMLMediaElementCustom.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDF65CCC145B6AFE00C4C7AA /* JSHTMLMediaElementCustom.cpp */; };
CDEA763014608A53008B31F1 /* PlatformClockCA.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA762E146084DE008B31F1 /* PlatformClockCA.cpp */; };
CDEA76341460B56F008B31F1 /* ClockGeneric.cpp in Sources */ = {isa = PBXBuildFile; fileRef = CDEA76321460AE29008B31F1 /* ClockGeneric.cpp */; };
@@ -12550,6 +12551,8 @@
CD8203091395AB6A00F956C6 /* WebVideoFullscreenHUDWindowController.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebVideoFullscreenHUDWindowController.mm; sourceTree = "<group>"; };
CD82030E1395ACE700F956C6 /* WebWindowAnimation.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebWindowAnimation.h; sourceTree = "<group>"; };
CD82030F1395ACE700F956C6 /* WebWindowAnimation.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebWindowAnimation.mm; sourceTree = "<group>"; };
CDAA8D0714D385600061EA60 /* PlatformClockCM.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = PlatformClockCM.h; sourceTree = "<group>"; };
CDAA8D0814D385600061EA60 /* PlatformClockCM.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = PlatformClockCM.mm; sourceTree = "<group>"; };
CDBD93BA1333BD4B002570E3 /* fullscreenQuickTime.css */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.css; path = fullscreenQuickTime.css; sourceTree = "<group>"; };
CDCE5CD014633BC900D47CCA /* EventTargetFactory.in */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text; path = EventTargetFactory.in; sourceTree = "<group>"; };
CDEA762C14608224008B31F1 /* Clock.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = Clock.h; sourceTree = "<group>"; };
@@ -15035,6 +15038,8 @@
4B2709810AF2E5E00065127F /* PasteboardMac.mm */,
CDEA762E146084DE008B31F1 /* PlatformClockCA.cpp */,
CDEA762F146084EE008B31F1 /* PlatformClockCA.h */,
CDAA8D0714D385600061EA60 /* PlatformClockCM.h */,
CDAA8D0814D385600061EA60 /* PlatformClockCM.mm */,
BCAA486E14A052530088FAC4 /* PlatformEventFactoryMac.h */,
BCAA486D14A052530088FAC4 /* PlatformEventFactoryMac.mm */,
BC94D1070C274F88006BC617 /* PlatformScreenMac.mm */,
@@ -27092,6 +27097,7 @@
1AAADDE314DC8C8F00AF64B3 /* ScrollingTreeNode.cpp in Sources */,
1AAADDE814DC8DF800AF64B3 /* ScrollingTreeNodeMac.mm in Sources */,
7A54857F14E02D51006AE05A /* InspectorHistory.cpp in Sources */,
CDAA8D0A14D71B2E0061EA60 /* PlatformClockCM.mm in Sources */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@@ -26,7 +26,9 @@
#include "config.h"
#include "Clock.h"

#if USE(COREAUDIO)
#if USE(COREMEDIA)
#include "PlatformClockCM.h"
#elif USE(COREAUDIO)
#include "PlatformClockCA.h"
#else
#include "ClockGeneric.h"
@@ -36,7 +38,9 @@ using namespace WebCore;

PassRefPtr<Clock> Clock::create()
{
#if USE(COREAUDIO)
#if USE(COREMEDIA)
return adoptRef(new PlatformClockCM());
#elif USE(COREAUDIO)
return adoptRef(new PlatformClockCA());
#else
return adoptRef(new ClockGeneric());
@@ -0,0 +1,66 @@
/*
* Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#ifndef PlatformClockCM_h
#define PlatformClockCM_h

#if USE(COREMEDIA)

#include "Clock.h"
#include <wtf/RetainPtr.h>

typedef struct OpaqueCMTimebase* CMTimebaseRef;
typedef struct OpaqueCMClock* CMClockRef;

namespace WebCore {

class PlatformClockCM : public Clock {
public:
PlatformClockCM();
PlatformClockCM(CMClockRef);

private:
void initializeWithTimingSource(CMClockRef);

virtual void setCurrentTime(float);
virtual float currentTime() const;

virtual void setPlayRate(float);
virtual float playRate() const { return m_rate; }

virtual void start();
virtual void stop();
virtual bool isRunning() const { return m_running; }

RetainPtr<CMTimebaseRef> m_timebase;
float m_rate;
bool m_running;
};

}

#endif

#endif
@@ -0,0 +1,113 @@
/*
* Copyright (C) 2012 Apple Inc. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE COMPUTER, INC. OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
* EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
* PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
* PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

#import "config.h"

#if USE(COREMEDIA)

#import "PlatformClockCM.h"

#import "FloatConversion.h"
#import "SoftLinking.h"
#import <CoreMedia/CMAudioDeviceClock.h>

SOFT_LINK_FRAMEWORK_OPTIONAL(CoreMedia)

SOFT_LINK(CoreMedia, CMAudioDeviceClockCreate, int32_t, (CFAllocatorRef allocator, CFStringRef deviceUID, CMClockRef *clockOut), (allocator, deviceUID, clockOut))
SOFT_LINK(CoreMedia, CMTimebaseCreateWithMasterClock, int32_t, (CFAllocatorRef allocator, CMClockRef masterClock, CMTimebaseRef *timebaseOut), (allocator, masterClock, timebaseOut))
SOFT_LINK(CoreMedia, CMTimebaseSetTime, int32_t, (CMTimebaseRef timebase, CMTime time), (timebase, time))
SOFT_LINK(CoreMedia, CMTimebaseGetTime, CMTime, (CMTimebaseRef timebase), (timebase))
SOFT_LINK(CoreMedia, CMTimebaseSetRate, int32_t, (CMTimebaseRef timebase, Float64 rate), (timebase, rate))
SOFT_LINK(CoreMedia, CMTimeMakeWithSeconds, CMTime, (Float64 seconds, int32_t preferredTimeScale), (seconds, preferredTimeScale))
SOFT_LINK(CoreMedia, CMTimeGetSeconds, Float64, (CMTime time), (time))

using namespace WebCore;

// A default time scale of 1000 allows milli-second CMTime precision without scaling the timebase.
static const int32_t DefaultTimeScale = 1000;

PlatformClockCM::PlatformClockCM()
: m_timebase(0)
, m_running(false)
{
CMClockRef rawClockPtr = 0;
CMAudioDeviceClockCreate(kCFAllocatorDefault, NULL, &rawClockPtr);
RetainPtr<CMClockRef> clock(AdoptCF, rawClockPtr);
initializeWithTimingSource(clock.get());
}

PlatformClockCM::PlatformClockCM(CMClockRef clock)
: m_timebase(0)
, m_running(false)
{
initializeWithTimingSource(clock);
}

void PlatformClockCM::initializeWithTimingSource(CMClockRef clock)
{
CMTimebaseRef rawTimebasePtr = 0;
CMTimebaseCreateWithMasterClock(kCFAllocatorDefault, clock, &rawTimebasePtr);
m_timebase.adoptCF(rawTimebasePtr);
}

void PlatformClockCM::setCurrentTime(float time)
{
CMTime cmTime = CMTimeMakeWithSeconds(time, DefaultTimeScale);
CMTimebaseSetTime(m_timebase.get(), cmTime);
}

float PlatformClockCM::currentTime() const
{
CMTime cmTime = CMTimebaseGetTime(m_timebase.get());
return narrowPrecisionToFloat(CMTimeGetSeconds(cmTime));
}

void PlatformClockCM::setPlayRate(float rate)
{
if (m_rate == rate)
return;

m_rate = rate;
if (m_running)
CMTimebaseSetRate(m_timebase.get(), rate);
}

void PlatformClockCM::start()
{
if (m_running)
return;
m_running = true;
CMTimebaseSetRate(m_timebase.get(), m_rate);
}

void PlatformClockCM::stop()
{
if (!m_running)
return;
m_running = false;
CMTimebaseSetRate(m_timebase.get(), 0);
}

#endif

0 comments on commit f47f5a7

Please sign in to comment.