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

Reply via email to