Title: [258215] trunk/Source/WebCore
Revision
258215
Author
jer.no...@apple.com
Date
2020-03-10 10:36:25 -0700 (Tue, 10 Mar 2020)

Log Message

[MSE] Use CMSampleBufferGetOutputPresentationTimeStamp / CMSampleBufferGetOutputDuration for all presentation times and durations
https://bugs.webkit.org/show_bug.cgi?id=208827

Reviewed by Eric Carlson.

CMSampleBufferGetOutputPresentationTimeStamp takes into account pre-roll trim durations and
movie edit lists, and as such, should be used as the "correct" value for "presentation
time".

outputPresentationTime() is inconsistently used, so rather than replacing all references of
outputPresentationTime() with presentationTime(), simply redefine presetationTime() in terms
of CMSampleBufferGetPresentationTimeStamp() and remove outputPresentationTime() entirely.

* Modules/mediasource/SourceBuffer.cpp:
(WebCore::SourceBuffer::updateMinimumUpcomingPresentationTime):
* platform/MediaSample.h:
(WebCore::MediaSample::outputPresentationTime const): Deleted.
(WebCore::MediaSample::outputDuration const): Deleted.
* platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
(WebCore::MediaPlayerPrivateMediaStreamAVFObjC::calculateTimelineOffset):
* platform/graphics/avfoundation/objc/MediaSampleAVFObjC.h:
* platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm:
(WebCore::MediaSampleAVFObjC::presentationTime const):
(WebCore::MediaSampleAVFObjC::duration const):
(WebCore::MediaSampleAVFObjC::outputDuration const):
(WebCore::MediaSampleAVFObjC::dump const):
(WebCore::MediaSampleAVFObjC::toJSONString const):
(WebCore::MediaSampleAVFObjC::outputPresentationTime const): Deleted.
* platform/mediastream/RealtimeVideoCaptureSource.cpp:
(WebCore::RealtimeVideoCaptureSource::adaptVideoSample):

Modified Paths

Diff

Modified: trunk/Source/WebCore/ChangeLog (258214 => 258215)


--- trunk/Source/WebCore/ChangeLog	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/ChangeLog	2020-03-10 17:36:25 UTC (rev 258215)
@@ -1,3 +1,36 @@
+2020-03-10  Jer Noble  <jer.no...@apple.com>
+
+        [MSE] Use CMSampleBufferGetOutputPresentationTimeStamp / CMSampleBufferGetOutputDuration for all presentation times and durations
+        https://bugs.webkit.org/show_bug.cgi?id=208827
+
+        Reviewed by Eric Carlson.
+
+        CMSampleBufferGetOutputPresentationTimeStamp takes into account pre-roll trim durations and
+        movie edit lists, and as such, should be used as the "correct" value for "presentation
+        time".
+
+        outputPresentationTime() is inconsistently used, so rather than replacing all references of
+        outputPresentationTime() with presentationTime(), simply redefine presetationTime() in terms
+        of CMSampleBufferGetPresentationTimeStamp() and remove outputPresentationTime() entirely.
+
+        * Modules/mediasource/SourceBuffer.cpp:
+        (WebCore::SourceBuffer::updateMinimumUpcomingPresentationTime):
+        * platform/MediaSample.h:
+        (WebCore::MediaSample::outputPresentationTime const): Deleted.
+        (WebCore::MediaSample::outputDuration const): Deleted.
+        * platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm:
+        (WebCore::MediaPlayerPrivateMediaStreamAVFObjC::calculateTimelineOffset):
+        * platform/graphics/avfoundation/objc/MediaSampleAVFObjC.h:
+        * platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm:
+        (WebCore::MediaSampleAVFObjC::presentationTime const):
+        (WebCore::MediaSampleAVFObjC::duration const):
+        (WebCore::MediaSampleAVFObjC::outputDuration const):
+        (WebCore::MediaSampleAVFObjC::dump const):
+        (WebCore::MediaSampleAVFObjC::toJSONString const):
+        (WebCore::MediaSampleAVFObjC::outputPresentationTime const): Deleted.
+        * platform/mediastream/RealtimeVideoCaptureSource.cpp:
+        (WebCore::RealtimeVideoCaptureSource::adaptVideoSample):
+
 2020-03-10  Chris Dumez  <cdu...@apple.com>
 
         Add release logging for when a navigation by a third-party (or untrusted) iframe is blocked

Modified: trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp (258214 => 258215)


--- trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/Modules/mediasource/SourceBuffer.cpp	2020-03-10 17:36:25 UTC (rev 258215)
@@ -2097,7 +2097,7 @@
     }
 
     auto minPts = std::min_element(trackBuffer.decodeQueue.begin(), trackBuffer.decodeQueue.end(), [](auto& left, auto& right) -> bool {
-        return left.second->outputPresentationTime() < right.second->outputPresentationTime();
+        return left.second->presentationTime() < right.second->presentationTime();
     });
 
     if (minPts == trackBuffer.decodeQueue.end()) {
@@ -2106,7 +2106,7 @@
         return;
     }
 
-    trackBuffer.minimumEnqueuedPresentationTime = minPts->second->outputPresentationTime();
+    trackBuffer.minimumEnqueuedPresentationTime = minPts->second->presentationTime();
     m_private->setMinimumUpcomingPresentationTime(trackID, trackBuffer.minimumEnqueuedPresentationTime);
 }
 

Modified: trunk/Source/WebCore/platform/MediaSample.h (258214 => 258215)


--- trunk/Source/WebCore/platform/MediaSample.h	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/platform/MediaSample.h	2020-03-10 17:36:25 UTC (rev 258215)
@@ -59,10 +59,8 @@
     virtual ~MediaSample() = default;
 
     virtual MediaTime presentationTime() const = 0;
-    virtual MediaTime outputPresentationTime() const { return presentationTime(); }
     virtual MediaTime decodeTime() const = 0;
     virtual MediaTime duration() const = 0;
-    virtual MediaTime outputDuration() const { return duration(); }
     virtual AtomString trackID() const = 0;
     virtual void setTrackID(const String&) = 0;
     virtual size_t sizeInBytes() const = 0;

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm (258214 => 258215)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaPlayerPrivateMediaStreamAVFObjC.mm	2020-03-10 17:36:25 UTC (rev 258215)
@@ -225,9 +225,7 @@
 
 MediaTime MediaPlayerPrivateMediaStreamAVFObjC::calculateTimelineOffset(const MediaSample& sample, double latency)
 {
-    MediaTime sampleTime = sample.outputPresentationTime();
-    if (!sampleTime || !sampleTime.isValid())
-        sampleTime = sample.presentationTime();
+    MediaTime sampleTime = sample.presentationTime();
     MediaTime timelineOffset = streamTime() - sampleTime + MediaTime::createWithDouble(latency);
     if (timelineOffset.timeScale() != sampleTime.timeScale())
         timelineOffset = PAL::toMediaTime(CMTimeConvertScale(PAL::toCMTime(timelineOffset), sampleTime.timeScale(), kCMTimeRoundingMethod_Default));

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.h (258214 => 258215)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.h	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.h	2020-03-10 17:36:25 UTC (rev 258215)
@@ -44,10 +44,8 @@
     RefPtr<JSC::Uint8ClampedArray> getRGBAImageData() const override;
 
     MediaTime presentationTime() const override;
-    MediaTime outputPresentationTime() const override;
     MediaTime decodeTime() const override;
     MediaTime duration() const override;
-    MediaTime outputDuration() const override;
 
     AtomString trackID() const override { return m_id; }
     void setTrackID(const String& id) override { m_id = id; }

Modified: trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm (258214 => 258215)


--- trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/platform/graphics/avfoundation/objc/MediaSampleAVFObjC.mm	2020-03-10 17:36:25 UTC (rev 258215)
@@ -79,14 +79,12 @@
 
 MediaTime MediaSampleAVFObjC::presentationTime() const
 {
-    return PAL::toMediaTime(CMSampleBufferGetPresentationTimeStamp(m_sample.get()));
+    auto timeStamp = CMSampleBufferGetOutputPresentationTimeStamp(m_sample.get());
+    if (CMTIME_IS_INVALID(timeStamp))
+        timeStamp = CMSampleBufferGetPresentationTimeStamp(m_sample.get());
+    return PAL::toMediaTime(timeStamp);
 }
 
-MediaTime MediaSampleAVFObjC::outputPresentationTime() const
-{
-    return PAL::toMediaTime(CMSampleBufferGetOutputPresentationTimeStamp(m_sample.get()));
-}
-
 MediaTime MediaSampleAVFObjC::decodeTime() const
 {
     return PAL::toMediaTime(CMSampleBufferGetDecodeTimeStamp(m_sample.get()));
@@ -94,14 +92,12 @@
 
 MediaTime MediaSampleAVFObjC::duration() const
 {
-    return PAL::toMediaTime(CMSampleBufferGetDuration(m_sample.get()));
+    auto duration = CMSampleBufferGetOutputDuration(m_sample.get());
+    if (CMTIME_IS_INVALID(duration))
+        duration = CMSampleBufferGetDuration(m_sample.get());
+    return PAL::toMediaTime(duration);
 }
 
-MediaTime MediaSampleAVFObjC::outputDuration() const
-{
-    return PAL::toMediaTime(CMSampleBufferGetOutputDuration(m_sample.get()));
-}
-
 size_t MediaSampleAVFObjC::sizeInBytes() const
 {
     return CMSampleBufferGetTotalSampleSize(m_sample.get());
@@ -172,7 +168,7 @@
 
 void MediaSampleAVFObjC::dump(PrintStream& out) const
 {
-    out.print("{PTS(", presentationTime(), "), OPTS(", outputPresentationTime(), "), DTS(", decodeTime(), "), duration(", duration(), "), flags(", (int)flags(), "), presentationSize(", presentationSize().width(), "x", presentationSize().height(), ")}");
+    out.print("{PTS(", presentationTime(), "), DTS(", decodeTime(), "), duration(", duration(), "), flags(", (int)flags(), "), presentationSize(", presentationSize().width(), "x", presentationSize().height(), ")}");
 }
 
 void MediaSampleAVFObjC::offsetTimestampsBy(const MediaTime& offset)
@@ -325,7 +321,6 @@
     auto object = JSON::Object::create();
 
     object->setObject("pts"_s, presentationTime().toJSONObject());
-    object->setObject("opts"_s, outputPresentationTime().toJSONObject());
     object->setObject("dts"_s, decodeTime().toJSONObject());
     object->setObject("duration"_s, duration().toJSONObject());
     object->setInteger("flags"_s, static_cast<unsigned>(flags()));

Modified: trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp (258214 => 258215)


--- trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp	2020-03-10 17:26:45 UTC (rev 258214)
+++ trunk/Source/WebCore/platform/mediastream/RealtimeVideoCaptureSource.cpp	2020-03-10 17:36:25 UTC (rev 258215)
@@ -378,9 +378,7 @@
 
 RefPtr<MediaSample> RealtimeVideoCaptureSource::adaptVideoSample(MediaSample& sample)
 {
-    MediaTime sampleTime = sample.outputPresentationTime();
-    if (!sampleTime || !sampleTime.isValid())
-        sampleTime = sample.presentationTime();
+    MediaTime sampleTime = sample.presentationTime();
 
     auto frameTime = sampleTime.toDouble();
     m_observedFrameTimeStamps.append(frameTime);
_______________________________________________
webkit-changes mailing list
webkit-changes@lists.webkit.org
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to