Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: fbe5639c6728d8944ecec3b43884885e788821d4
https://github.com/WebKit/WebKit/commit/fbe5639c6728d8944ecec3b43884885e788821d4
Author: Youenn Fablet <[email protected]>
Date: 2026-09-21 (Mon, 21 Sep 2026)
Changed paths:
M Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.cpp
M Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.h
M Source/WebCore/PAL/pal/cf/VideoToolboxSoftLink.cpp
M Source/WebCore/PAL/pal/cf/VideoToolboxSoftLink.h
M Source/WebCore/SourcesCocoa.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/platform/graphics/HEVCUtilities.cpp
M Source/WebCore/platform/graphics/HEVCUtilities.h
M Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.h
M Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.mm
M Source/WebCore/platform/video-codecs/BitReader.cpp
M Source/WebCore/platform/video-codecs/BitReader.h
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoder.h
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoder.mm
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.h
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.mm
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTBH265.h
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTBH265.mm
A Source/WebCore/platform/video-codecs/cocoa/VideoEncoderVTBSession.h
A Source/WebCore/platform/video-codecs/cocoa/VideoEncoderVTBSession.mm
M Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h
M Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm
M Tools/TestWebKitAPI/CMakeLists.txt
M Tools/TestWebKitAPI/PlatformCocoa.cmake
M Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj
A Tools/TestWebKitAPI/Tests/WebCore/HEVCUtilitiesTests.cpp
A Tools/TestWebKitAPI/Tests/WebCore/cocoa/HEVCUtilitiesCocoaTests.mm
Log Message:
-----------
Implement a VideoToolbox H265 encoder in WebCore
https://bugs.webkit.org/show_bug.cgi?id=324332
rdar://problem/187565323
We implement directly in WebCore a H265 encoder using VideoToolbox.
It is implemented as WebRTCVideoEncoderVTBH265 with
VideoEncoderVTB/WebRTCVideoEncoderVTB as base classes.
WebRTCVideoEncoderVTBH265 is instantiated when
WebRTCWebCoreVideoEncodersEnabled is set.
H264 still goes through libwebrtc.
We add support for QP-extraction bitstream parsing and H265 Annex B conversion
by introducing routines into HEVCUtilitiesCocoa/HEVCUtilities.
These are replacements to libwebrtc's H265CMSampleBufferToAnnexBBuffer and
H265BitstreamParser, implemented with safe C++ guidelines.
Covered by existing tests and API tests.
Reviewed by Jean-Yves Avenard.
* Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.cpp:
* Source/WebCore/PAL/pal/cf/CoreMediaSoftLink.h:
* Source/WebCore/PAL/pal/cf/VideoToolboxSoftLink.cpp:
* Source/WebCore/PAL/pal/cf/VideoToolboxSoftLink.h:
* Source/WebCore/SourcesCocoa.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/HEVCUtilities.cpp:
(WebCore::findHEVCNaluIndices):
(WebCore::hevcNaluType):
(WebCore::parseRbsp):
(WebCore::HEVCBitstreamParser::parseProfileTierLevel):
(WebCore::HEVCBitstreamParser::parseScalingListData):
(WebCore::HEVCBitstreamParser::parseShortTermRefPicSet):
(WebCore::HEVCBitstreamParser::parseSps):
(WebCore::HEVCBitstreamParser::parsePps):
(WebCore::HEVCBitstreamParser::parseNonParameterSetNalu):
(WebCore::HEVCBitstreamParser::parseSlice):
(WebCore::HEVCBitstreamParser::pps const):
(WebCore::HEVCBitstreamParser::sps const):
(WebCore::HEVCBitstreamParser::parseBitstream):
(WebCore::HEVCBitstreamParser::lastSliceQP const):
* Source/WebCore/platform/graphics/HEVCUtilities.h:
* Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.h:
* Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.mm:
(WebCore::convertHEVCCMSampleBufferToAnnexB):
* Source/WebCore/platform/video-codecs/BitReader.cpp:
(WebCore::BitReader::readBits):
(WebCore::BitReader::readFlag):
(WebCore::BitReader::consumeBits):
(WebCore::BitReader::readExpGolomb):
(WebCore::BitReader::readSignedExpGolomb):
* Source/WebCore/platform/video-codecs/BitReader.h:
(WebCore::BitReader::ok const):
* Tools/TestWebKitAPI/CMakeLists.txt:
* Tools/TestWebKitAPI/PlatformCocoa.cmake:
* Tools/TestWebKitAPI/TestWebKitAPI.xcodeproj/project.pbxproj:
* Tools/TestWebKitAPI/Tests/WebCore/HEVCUtilitiesTests.cpp: Added.
(TestWebKitAPI::TEST(HEVCBitstreamParser, ReportsNoQpBeforeAnyParsing)):
(TestWebKitAPI::TEST(HEVCBitstreamParser,
ReportsNoQpAfterParsingOnlyParameterSets)):
(TestWebKitAPI::TEST(HEVCBitstreamParser, ReportsQpForImageSlices)):
(TestWebKitAPI::TEST(HEVCBitstreamParser,
ReportsQpFromShortTermReferencePicSetSlice)):
(TestWebKitAPI::TEST(HEVCBitstreamParser, ReportsQpWithPredWeightTable)):
(TestWebKitAPI::TEST(HEVCBitstreamParser, RejectsOutOfRangeQp)):
* Tools/TestWebKitAPI/Tests/WebCore/cocoa/HEVCUtilitiesCocoaTests.mm: Added.
(TestWebKitAPI::appendByte):
(TestWebKitAPI::appendBytes):
(TestWebKitAPI::makeHVCCData):
(TestWebKitAPI::createHEVCFormatDescription):
(TestWebKitAPI::createHEVCSampleBuffer):
(TestWebKitAPI::annexBStartCode):
(TestWebKitAPI::TEST(HEVCUtilitiesCocoa, KeyframePrependsParameterSets)):
(TestWebKitAPI::TEST(HEVCUtilitiesCocoa, NonKeyframeOmitsParameterSets)):
(TestWebKitAPI::TEST(HEVCUtilitiesCocoa,
MultipleNALUsOfDifferentSizesAreAllExtracted)):
(TestWebKitAPI::TEST(HEVCUtilitiesCocoa, TruncatedNALULengthReturnsEmpty)):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoder.h:
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoder.mm:
(WebCore::GPUVideoEncoder::create):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.h: Added.
(WebCore::GPUVideoEncoderVTB::width const):
(WebCore::GPUVideoEncoderVTB::height const):
(WebCore::GPUVideoEncoderVTB::useAnnexB const):
(WebCore::GPUVideoEncoderVTB::needsToSendDescription const):
(WebCore::GPUVideoEncoderVTB::setNeedsToSendDescription):
(WebCore::GPUVideoEncoderVTB::creationThreadID const):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.mm: Added.
(WebCore::GPUVideoEncoderBitrateAdjuster::setTargetBitrateBps):
(WebCore::GPUVideoEncoderBitrateAdjuster::adjustedBitrateBps const):
(WebCore::GPUVideoEncoderBitrateAdjuster::update):
(WebCore::GPUVideoEncoderBitrateAdjuster::isWithinTolerance):
(WebCore::GPUVideoEncoderBitrateAdjuster::WTF_REQUIRES_LOCK):
(WebCore::GPUVideoEncoderBitrateAdjuster::WTF_GUARDED_BY_LOCK):
(WebCore::GPUVideoEncoderVTB::GPUVideoEncoderVTB):
(WebCore::GPUVideoEncoderVTB::notifyEncodedFrame):
(WebCore::GPUVideoEncoderVTB::notifyDescription):
(WebCore::GPUVideoEncoderVTB::notifyError):
(WebCore::GPUVideoEncoderVTB::notifyFrameDropped):
(WebCore::GPUVideoEncoderVTB::setLowLatency):
(WebCore::GPUVideoEncoderVTB::initialize):
(WebCore::GPUVideoEncoderVTB::resetCompressionSession):
(WebCore::GPUVideoEncoderVTB::configureCompressionSession):
(WebCore::GPUVideoEncoderVTB::setEncoderBitrateBps):
(WebCore::GPUVideoEncoderVTB::setRates):
(WebCore::GPUVideoEncoderVTB::encodeFrame):
(WebCore::GPUVideoEncoderVTB::flush):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTBH265.h: Copied
from Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.h.
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTBH265.mm: Added.
(WebCore::GPUVideoEncoderVTBH265::GPUVideoEncoderVTBH265):
(WebCore::GPUVideoEncoderVTBH265::codecType const):
(WebCore::GPUVideoEncoderVTBH265::convertAndNotify):
* Source/WebCore/platform/video-codecs/cocoa/VideoEncoderVTBSession.h: Added.
(WebCore::VideoEncoderVTBSession::VideoEncoderVTBSession):
* Source/WebCore/platform/video-codecs/cocoa/VideoEncoderVTBSession.mm: Added.
(WebCore::VideoEncoderVTBSession::create):
(WebCore::VideoEncoderVTBSession::~VideoEncoderVTBSession):
(WebCore::VideoEncoderVTBSession::isHardwareAccelerated const):
(WebCore::VideoEncoderVTBSession::setProperty):
(WebCore::VideoEncoderVTBSession::prepareToEncodeFrames):
(WebCore::VideoEncoderVTBSession::completeFrames):
(WebCore::VideoEncoderVTBSession::encodeFrame):
* Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
* Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:
(WebKit::LibWebRTCCodecsProxy::createEncoder):
Canonical link: https://commits.webkit.org/321522@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications