[webkit-changes] [WebKit/WebKit] d27040: [Cocoa] Add webm support to MediaRecorder

Jean-Yves Avenard noreply at github.com
Fri Oct 11 23:13:36 PDT 2024


  Branch: refs/heads/main
  Home:   https://github.com/WebKit/WebKit
  Commit: d27040f0d729453dbf87696eddd077ec1f6d25d3
      https://github.com/WebKit/WebKit/commit/d27040f0d729453dbf87696eddd077ec1f6d25d3
  Author: Jean-Yves Avenard <jya at apple.com>
  Date:   2024-10-11 (Fri, 11 Oct 2024)

  Changed paths:
    M Configurations/WebKitProjectPaths.xcconfig
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-AV-audio-video-dataavailable-gpuprocess-expected.txt
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-AV-audio-video-dataavailable-gpuprocess.html
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-audio-bitrate-expected.txt
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-audio-bitrate.html
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-requestData-expected.txt
    M LayoutTests/http/wpt/mediarecorder/MediaRecorder-requestData.html
    M LayoutTests/http/wpt/mediarecorder/mimeType-expected.txt
    M LayoutTests/http/wpt/mediarecorder/mimeType.html
    M LayoutTests/http/wpt/mediarecorder/pause-recording-expected.txt
    M LayoutTests/http/wpt/mediarecorder/pause-recording.html
    M LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-mimetype-expected.txt
    M LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-peerconnection.https-expected.txt
    M LayoutTests/platform/glib/TestExpectations
    M Source/ThirdParty/libwebrtc/CMakeLists.txt
    M Source/ThirdParty/libwebrtc/Configurations/BaseTarget-libwebm.xcconfig
    M Source/ThirdParty/libwebrtc/Configurations/libwebm.xcconfig
    M Source/ThirdParty/libwebrtc/Configurations/libwebrtc.exp
    M Source/ThirdParty/libwebrtc/Source/third_party/libwebm/CMakeLists.txt
    M Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj
    M Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml
    M Source/WTF/wtf/PlatformEnable.h
    M Source/WTF/wtf/PlatformEnableCocoa.h
    M Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp
    M Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp
    M Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h
    M Source/WebCore/PlatformMac.cmake
    M Source/WebCore/SourcesCocoa.txt
    M Source/WebCore/WebCore.xcodeproj/project.pbxproj
    M Source/WebCore/platform/graphics/cocoa/SourceBufferParserWebM.h
    M Source/WebCore/platform/graphics/cocoa/VP9UtilitiesCocoa.mm
    M Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.h
    M Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.mm
    M Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp
    A Source/WebCore/platform/mediarecorder/MediaRecorderPrivateWriter.cpp
    A Source/WebCore/platform/mediarecorder/MediaRecorderPrivateWriter.h
    M Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.h
    M Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm
    M Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h
    M Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm
    A Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterWebM.h
    A Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterWebM.mm
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h
    M Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.messages.in
    M Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm
    M Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp

  Log Message:
  -----------
  [Cocoa] Add webm support to MediaRecorder
https://bugs.webkit.org/show_bug.cgi?id=281106
rdar://137560454

Reviewed by Youenn Fablet.

We add a MediaRecorderPrivateWriterWebM that uses the mkvmuxer from libwebm and the WebCodecs video encoders.
The WebM MediaRecorder is behind a preferences, currently disabled by default.

The MediaRecorderPrivateWriterWebM is currently used in the GPU process, in place of the MediaRecorderPrivateWriterCocoa
for ease of integration.
Performing the encoding and muxing will be moved to the Web Process in a follow-up change.

Amending existing tests to exercise the code.

* Configurations/WebKitProjectPaths.xcconfig:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-AV-audio-video-dataavailable-gpuprocess-expected.txt:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-AV-audio-video-dataavailable-gpuprocess.html:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-audio-bitrate-expected.txt:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-audio-bitrate.html:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-requestData-expected.txt:
* LayoutTests/http/wpt/mediarecorder/MediaRecorder-requestData.html:
* LayoutTests/http/wpt/mediarecorder/mimeType-expected.txt:
* LayoutTests/http/wpt/mediarecorder/mimeType.html:
* LayoutTests/http/wpt/mediarecorder/pause-recording-expected.txt:
* LayoutTests/http/wpt/mediarecorder/pause-recording.html:
* LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-mimetype-expected.txt:
* LayoutTests/imported/w3c/web-platform-tests/mediacapture-record/MediaRecorder-peerconnection.https-expected.txt:
* LayoutTests/platform/glib/TestExpectations: GStreamer MediaRecorder always create a MP4 one.
* Source/ThirdParty/libwebrtc/CMakeLists.txt:
* Source/ThirdParty/libwebrtc/Configurations/BaseTarget-libwebm.xcconfig:
* Source/ThirdParty/libwebrtc/Configurations/libwebm.xcconfig:
* Source/ThirdParty/libwebrtc/Configurations/libwebrtc.exp:
* Source/ThirdParty/libwebrtc/Source/third_party/libwebm/CMakeLists.txt:
* Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj:
* Source/WTF/Scripts/Preferences/UnifiedWebPreferences.yaml:
* Source/WTF/wtf/PlatformEnable.h:
* Source/WTF/wtf/PlatformEnableCocoa.h:
* Source/WebCore/Modules/mediarecorder/MediaRecorder.cpp:
(WebCore::MediaRecorder::isTypeSupported):
* Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.cpp:
(WebCore::MediaRecorderProvider::isSupported):
(WebCore::MediaRecorderProvider::isWebMAndSupported):
* Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h:
* Source/WebCore/PlatformMac.cmake:
* Source/WebCore/SourcesCocoa.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/cocoa/SourceBufferParserWebM.h:
* Source/WebCore/platform/graphics/cocoa/VP9UtilitiesCocoa.mm:
* Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.h:
* Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.mm:
(WebCore::span8):
(WebCore::createOpusPrivateData):
* Source/WebCore/platform/mediarecorder/MediaRecorderPrivateAVFImpl.cpp:
(WebCore::MediaRecorderPrivateAVFImpl::create):
* Source/WebCore/platform/mediarecorder/MediaRecorderPrivateWriter.cpp: Copied from Source/WebCore/Modules/mediarecorder/MediaRecorderProvider.h.
(WebCore::MediaRecorderPrivateWriter::create):
* Source/WebCore/platform/mediarecorder/MediaRecorderPrivateWriter.h: Added.
* Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.h:
* Source/WebCore/platform/mediarecorder/cocoa/AudioSampleBufferCompressor.mm:
(WebCore::AudioSampleBufferCompressor::create):
(WebCore::AudioSampleBufferCompressor::AudioSampleBufferCompressor):
(WebCore::AudioSampleBufferCompressor::initAudioConverterForSourceFormatDescription):
(WebCore::AudioSampleBufferCompressor::getOutputSampleBuffer const):
(WebCore::AudioSampleBufferCompressor::isEmpty const):
(WebCore::AudioSampleBufferCompressor::getOutputSampleBuffer): Deleted.
* Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h:
* Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.mm:
(WebCore::MediaRecorderPrivateWriter::create):
(WebCore::MediaRecorderPrivateWriterAVFObjC::create):
(WebCore::MediaRecorderPrivateWriterAVFObjC::compressedVideoOutputBufferCallback):
(WebCore::MediaRecorderPrivateWriterAVFObjC::compressedAudioOutputBufferCallback):
(WebCore::MediaRecorderPrivateWriterAVFObjC::MediaRecorderPrivateWriterAVFObjC):
(WebCore::MediaRecorderPrivateWriterAVFObjC::~MediaRecorderPrivateWriterAVFObjC):
(WebCore::MediaRecorderPrivateWriterAVFObjC::close):
(WebCore::MediaRecorderPrivateWriterAVFObjC::initialize):
(WebCore::MediaRecorderPrivateWriterAVFObjC::processNewCompressedVideoSampleBuffers):
(WebCore::MediaRecorderPrivateWriterAVFObjC::processNewCompressedAudioSampleBuffers):
(WebCore::MediaRecorderPrivateWriterAVFObjC::startAssetWriter):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendCompressedAudioSampleBufferIfPossible):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendCompressedVideoSampleBufferIfPossible):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendCompressedVideoSampleBuffer):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendCompressedSampleBuffers):
(WebCore::MediaRecorderPrivateWriterAVFObjC::flushCompressedSampleBuffers):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendVideoFrame):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendAudioSampleBuffer):
(WebCore::MediaRecorderPrivateWriterAVFObjC::finishedFlushingSamples):
(WebCore::MediaRecorderPrivateWriterAVFObjC::stopRecording):
(WebCore::MediaRecorderPrivateWriterAVFObjC::fetchData):
(WebCore::MediaRecorderPrivateWriterAVFObjC::completeFetchData):
(WebCore::MediaRecorderPrivateWriterAVFObjC::appendData):
(WebCore::MediaRecorderPrivateWriterAVFObjC::takeData):
(WebCore::MediaRecorderPrivateWriterAVFObjC::pause):
(WebCore::MediaRecorderPrivateWriterAVFObjC::resume):
(WebCore::MediaRecorderPrivateWriterAVFObjC::mimeType const):
(WebCore::MediaRecorderPrivateWriterAVFObjC::audioBitRate const):
(WebCore::MediaRecorderPrivateWriterAVFObjC::videoBitRate const):
(WebCore::MediaRecorderPrivateWriter::compressedVideoOutputBufferCallback): Deleted.
(WebCore::MediaRecorderPrivateWriter::compressedAudioOutputBufferCallback): Deleted.
(WebCore::MediaRecorderPrivateWriter::MediaRecorderPrivateWriter): Deleted.
(WebCore::MediaRecorderPrivateWriter::~MediaRecorderPrivateWriter): Deleted.
(WebCore::MediaRecorderPrivateWriter::close): Deleted.
(WebCore::MediaRecorderPrivateWriter::initialize): Deleted.
(WebCore::MediaRecorderPrivateWriter::processNewCompressedVideoSampleBuffers): Deleted.
(WebCore::MediaRecorderPrivateWriter::processNewCompressedAudioSampleBuffers): Deleted.
(WebCore::MediaRecorderPrivateWriter::startAssetWriter): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendCompressedAudioSampleBufferIfPossible): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendCompressedVideoSampleBufferIfPossible): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendCompressedVideoSampleBuffer): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendCompressedSampleBuffers): Deleted.
(WebCore::MediaRecorderPrivateWriter::flushCompressedSampleBuffers): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendVideoFrame): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendAudioSampleBuffer): Deleted.
(WebCore::MediaRecorderPrivateWriter::finishedFlushingSamples): Deleted.
(WebCore::MediaRecorderPrivateWriter::stopRecording): Deleted.
(WebCore::MediaRecorderPrivateWriter::fetchData): Deleted.
(WebCore::MediaRecorderPrivateWriter::completeFetchData): Deleted.
(WebCore::MediaRecorderPrivateWriter::appendData): Deleted.
(WebCore::MediaRecorderPrivateWriter::takeData): Deleted.
(WebCore::MediaRecorderPrivateWriter::pause): Deleted.
(WebCore::MediaRecorderPrivateWriter::resume): Deleted.
(WebCore::MediaRecorderPrivateWriter::mimeType const): Deleted.
(WebCore::MediaRecorderPrivateWriter::audioBitRate const): Deleted.
(WebCore::MediaRecorderPrivateWriter::videoBitRate const): Deleted.
* Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterWebM.h: Copied from Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterCocoa.h.
* Source/WebCore/platform/mediarecorder/cocoa/MediaRecorderPrivateWriterWebM.mm: Added.
(WebCore::MediaRecorderPrivateWriterWebMDelegate::MediaRecorderPrivateWriterWebMDelegate):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::addAudioTrack):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::addVideoTrack):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::addFrame):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::forceNewClusterOnNextFrame):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::finalize):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::hasAddedFrame const):
(WebCore::MediaRecorderPrivateWriterWebMDelegate::protectedParent const):
(WebCore::MediaRecorderPrivateWriterWebM::create):
(WebCore::mkvCodeIcForMediaVideoCodecId):
(WebCore::codecStringForMediaVideoCodecId):
(WebCore::MediaRecorderPrivateWriterWebM::MediaRecorderPrivateWriterWebM):
(WebCore::MediaRecorderPrivateWriterWebM::~MediaRecorderPrivateWriterWebM):
(WebCore::MediaRecorderPrivateWriterWebM::close):
(WebCore::MediaRecorderPrivateWriterWebM::compressedAudioOutputBufferCallback):
(WebCore::MediaRecorderPrivateWriterWebM::initialize):
(WebCore::MediaRecorderPrivateWriterWebM::enqueueCompressedAudioSampleBuffers):
(WebCore::MediaRecorderPrivateWriterWebM::maybeStartWriting):
(WebCore::MediaRecorderPrivateWriterWebM::appendVideoFrame):
(WebCore::MediaRecorderPrivateWriterWebM::nextVideoFrameTime const):
(WebCore::MediaRecorderPrivateWriterWebM::resumeVideoTime const):
(WebCore::MediaRecorderPrivateWriterWebM::sampleTime const):
(WebCore::MediaRecorderPrivateWriterWebM::encodePendingVideoFrames):
(WebCore::MediaRecorderPrivateWriterWebM::appendAudioSampleBuffer):
(WebCore::MediaRecorderPrivateWriterWebM::flushEncodedQueues):
(WebCore::MediaRecorderPrivateWriterWebM::partiallyFlushEncodedQueues):
(WebCore::MediaRecorderPrivateWriterWebM::muxNextFrame):
(WebCore::MediaRecorderPrivateWriterWebM::stopRecording):
(WebCore::MediaRecorderPrivateWriterWebM::fetchData):
(WebCore::MediaRecorderPrivateWriterWebM::completeFetchData):
(WebCore::MediaRecorderPrivateWriterWebM::flushPendingData):
(WebCore::MediaRecorderPrivateWriterWebM::appendData):
(WebCore::MediaRecorderPrivateWriterWebM::takeData):
(WebCore::MediaRecorderPrivateWriterWebM::pause):
(WebCore::MediaRecorderPrivateWriterWebM::resume):
(WebCore::MediaRecorderPrivateWriterWebM::mimeType const):
(WebCore::MediaRecorderPrivateWriterWebM::audioBitRate const):
(WebCore::MediaRecorderPrivateWriterWebM::videoBitRate const):
(WebCore::MediaRecorderPrivateWriterWebM::maybeForceNewCluster):
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.cpp:
(WebKit::RemoteMediaRecorder::fetchData):
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.h:
* Source/WebKit/GPUProcess/webrtc/RemoteMediaRecorder.messages.in:
* Source/WebKit/UIProcess/Cocoa/PlaybackSessionManagerProxy.mm:
(WebKit::PlaybackSessionManagerProxy::seekableRangesVectorChanged):
* Source/WebKit/WebProcess/GPU/webrtc/MediaRecorderPrivate.cpp:
(WebKit::MediaRecorderPrivate::fetchData):

Canonical link: https://commits.webkit.org/285061@main



To unsubscribe from these emails, change your notification settings at https://github.com/WebKit/WebKit/settings/notifications


More information about the webkit-changes mailing list