Modified: trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm (267520 => 267521)
--- trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm 2020-09-24 07:01:36 UTC (rev 267520)
+++ trunk/Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm 2020-09-24 07:10:26 UTC (rev 267521)
@@ -399,9 +399,8 @@
}
-static inline RetainPtr<CMSampleBufferRef> copySampleBufferWithCurrentTimeStamp(CMSampleBufferRef originalBuffer)
+static inline RetainPtr<CMSampleBufferRef> copySampleBufferWithCurrentTimeStamp(CMSampleBufferRef originalBuffer, CMTime startTime)
{
- CMTime startTime = CMClockGetTime(CMClockGetHostTimeClock());
CMItemCount count = 0;
CMSampleBufferGetSampleTimingInfoArray(originalBuffer, 0, nil, &count);
@@ -425,6 +424,7 @@
{
if (!m_firstVideoFrame) {
m_firstVideoFrame = true;
+ m_firstVideoSampleTime = CMClockGetTime(CMClockGetHostTimeClock());
if (sample.videoRotation() != MediaSample::VideoRotation::None || sample.videoMirrored()) {
auto videoTransform = CGAffineTransformMakeRotation(static_cast<int>(sample.videoRotation()) * M_PI / 180);
if (sample.videoMirrored())
@@ -432,8 +432,9 @@
m_videoAssetWriterInput.get().transform = videoTransform;
}
}
- // FIXME: We should not set the timestamps if they are already set.
- if (auto bufferWithCurrentTime = copySampleBufferWithCurrentTimeStamp(sample.platformSample().sample.cmSampleBuffer))
+
+ CMTime sampleTime = CMTimeSubtract(CMClockGetTime(CMClockGetHostTimeClock()), m_firstVideoSampleTime);
+ if (auto bufferWithCurrentTime = copySampleBufferWithCurrentTimeStamp(sample.platformSample().sample.cmSampleBuffer, sampleTime))
m_videoCompressor->addSampleBuffer(bufferWithCurrentTime.get());
}
@@ -449,7 +450,7 @@
return adoptCF(format);
}
-static inline RetainPtr<CMSampleBufferRef> createAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, const WTF::MediaTime& time, size_t sampleCount)
+static inline RetainPtr<CMSampleBufferRef> createAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, CMTime time, size_t sampleCount)
{
auto format = createAudioFormatDescription(description);
if (!format)
@@ -456,7 +457,7 @@
return nullptr;
CMSampleBufferRef sampleBuffer = nullptr;
- auto error = CMAudioSampleBufferCreateWithPacketDescriptions(kCFAllocatorDefault, NULL, false, NULL, NULL, format.get(), sampleCount, toCMTime(time), NULL, &sampleBuffer);
+ auto error = CMAudioSampleBufferCreateWithPacketDescriptions(kCFAllocatorDefault, NULL, false, NULL, NULL, format.get(), sampleCount, time, NULL, &sampleBuffer);
if (error) {
RELEASE_LOG_ERROR(MediaStream, "MediaRecorderPrivateWriter createAudioSampleBufferWithPacketDescriptions failed with %d", error);
return nullptr;
@@ -471,10 +472,11 @@
return buffer;
}
-void MediaRecorderPrivateWriter::appendAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, const WTF::MediaTime& time, size_t sampleCount)
+void MediaRecorderPrivateWriter::appendAudioSampleBuffer(const PlatformAudioData& data, const AudioStreamDescription& description, const WTF::MediaTime&, size_t sampleCount)
{
- if (auto sampleBuffer = createAudioSampleBuffer(data, description, time, sampleCount))
+ if (auto sampleBuffer = createAudioSampleBuffer(data, description, m_currentAudioSampleTime, sampleCount))
m_audioCompressor->addSampleBuffer(sampleBuffer.get());
+ m_currentAudioSampleTime = CMTimeAdd(m_currentAudioSampleTime, toCMTime(MediaTime(sampleCount, description.sampleRate())));
}
void MediaRecorderPrivateWriter::finishedFlushingSamples()