Title: [106978] trunk/Source
Revision
106978
Author
jer.no...@apple.com
Date
2012-02-07 12:48:30 -0800 (Tue, 07 Feb 2012)

Log Message

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

Reviewed by Eric Carlson.

Source/_javascript_Core:

* 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):

Modified Paths

Added Paths

Diff

Modified: trunk/Source/_javascript_Core/ChangeLog (106977 => 106978)


--- trunk/Source/_javascript_Core/ChangeLog	2012-02-07 20:45:52 UTC (rev 106977)
+++ trunk/Source/_javascript_Core/ChangeLog	2012-02-07 20:48:30 UTC (rev 106978)
@@ -1,3 +1,12 @@
+2012-02-06  Jer Noble  <jer.no...@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  <fpi...@apple.com>
 
         ValueToNumber and ValueToDouble nodes don't do anything and should be removed

Modified: trunk/Source/_javascript_Core/wtf/Platform.h (106977 => 106978)


--- trunk/Source/_javascript_Core/wtf/Platform.h	2012-02-07 20:45:52 UTC (rev 106977)
+++ trunk/Source/_javascript_Core/wtf/Platform.h	2012-02-07 20:48:30 UTC (rev 106978)
@@ -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

Modified: trunk/Source/WebCore/ChangeLog (106977 => 106978)


--- trunk/Source/WebCore/ChangeLog	2012-02-07 20:45:52 UTC (rev 106977)
+++ trunk/Source/WebCore/ChangeLog	2012-02-07 20:48:30 UTC (rev 106978)
@@ -1,3 +1,27 @@
+2012-02-06  Jer Noble  <jer.no...@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  <ander...@apple.com>
 
         ScrollableAreaSet should be moved from Page to FrameView

Modified: trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj (106977 => 106978)


--- trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-02-07 20:45:52 UTC (rev 106977)
+++ trunk/Source/WebCore/WebCore.xcodeproj/project.pbxproj	2012-02-07 20:48:30 UTC (rev 106978)
@@ -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;
 		};

Modified: trunk/Source/WebCore/platform/Clock.cpp (106977 => 106978)


--- trunk/Source/WebCore/platform/Clock.cpp	2012-02-07 20:45:52 UTC (rev 106977)
+++ trunk/Source/WebCore/platform/Clock.cpp	2012-02-07 20:48:30 UTC (rev 106978)
@@ -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 @@
 
 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());

Copied: trunk/Source/WebCore/platform/mac/PlatformClockCM.h (from rev 106977, trunk/Source/WebCore/platform/Clock.cpp) (0 => 106978)


--- trunk/Source/WebCore/platform/mac/PlatformClockCM.h	                        (rev 0)
+++ trunk/Source/WebCore/platform/mac/PlatformClockCM.h	2012-02-07 20:48:30 UTC (rev 106978)
@@ -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

Added: trunk/Source/WebCore/platform/mac/PlatformClockCM.mm (0 => 106978)


--- trunk/Source/WebCore/platform/mac/PlatformClockCM.mm	                        (rev 0)
+++ trunk/Source/WebCore/platform/mac/PlatformClockCM.mm	2012-02-07 20:48:30 UTC (rev 106978)
@@ -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
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
http://lists.webkit.org/mailman/listinfo.cgi/webkit-changes

Reply via email to