Branch: refs/heads/main
Home: https://github.com/WebKit/WebKit
Commit: 4242fa3522c554886a7173f2f6e929f1fba3a1f8
https://github.com/WebKit/WebKit/commit/4242fa3522c554886a7173f2f6e929f1fba3a1f8
Author: Youenn Fablet <[email protected]>
Date: 2026-09-28 (Mon, 28 Sep 2026)
Changed paths:
M Source/WebCore/SourcesCocoa.txt
M Source/WebCore/WebCore.xcodeproj/project.pbxproj
M Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp
M Source/WebCore/platform/cocoa/CoreVideoSoftLink.h
M Source/WebCore/platform/graphics/AnnexBUtilities.cpp
M Source/WebCore/platform/graphics/AnnexBUtilities.h
M Source/WebCore/platform/graphics/H264Utilities.cpp
M Source/WebCore/platform/graphics/H264Utilities.h
M Source/WebCore/platform/graphics/HEVCUtilities.cpp
M Source/WebCore/platform/graphics/HEVCUtilities.h
M Source/WebCore/platform/graphics/cocoa/H264UtilitiesCocoa.h
M Source/WebCore/platform/graphics/cocoa/H264UtilitiesCocoa.mm
M Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.mm
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoder.mm
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTB.h
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTB.mm
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH264.h
A Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH264.mm
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH265.h
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH265.mm
M Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.mm
M Tools/TestWebKitAPI/Tests/WebCore/H264UtilitiesTests.cpp
M Tools/TestWebKitAPI/Tests/WebCore/cocoa/H264UtilitiesCocoaTests.mm
Log Message:
-----------
Implement a VideoToolbox H264 decoder in WebCore
rdar://188171149
https://bugs.webkit.org/show_bug.cgi?id=324951
Reviewed by Eric Carlson.
Like done for H265 with GPUVideoDecoderVTBH265, we implement H264 decoding with
GPUVideoDecoderVTBH264.
It reuses the same infrastructure.
We need some specific routines that were implemented by libwebrtc for
RTCVideoDecoderH264, in particular the qp parsing and annexB H264 handling.
We reimplement these routines following what is done in libwebrtc.
We add some unit tests to cover these new WebCore routines.
We still keep color space handling as before, a follow-up will properly support
color space handling.
The only change is that we are now correctly handling full range on encoder and
decoder side.
Covered by existing tests.
* Source/WebCore/SourcesCocoa.txt:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/graphics/H264Utilities.cpp:
(WebCore::findH264AnnexBSpsIndex):
(WebCore::findH264AnnexBMaxNumReorderFrames):
(WebCore::findAVCCMaxNumReorderFrames):
(WebCore::maxDpbMbsFromLevelNumber):
(WebCore::skipH264HRDParameters):
(WebCore::H264BitstreamParser::parseSpsMaxNumReorderFrames):
* Source/WebCore/platform/graphics/H264Utilities.h:
* Source/WebCore/platform/graphics/cocoa/H264UtilitiesCocoa.h:
* Source/WebCore/platform/graphics/cocoa/H264UtilitiesCocoa.mm:
(WebCore::createVideoInfoFromAVCC):
(WebCore::h264AnnexBSpsIsFollowedByPps):
(WebCore::createVideoInfoFromAVCAnnexBStream):
(WebCore::convertAVCAnnexBToLengthPrefixed):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH264.h: Added.
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH264.mm: Added.
(WebCore::GPUVideoDecoderVTBH264::GPUVideoDecoderVTBH264):
(WebCore::GPUVideoDecoderVTBH264::decodeFrame):
(WebCore::GPUVideoDecoderVTBH264::setFormat):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoEncoderVTB.mm:
(WebCore::GPUVideoEncoderVTB::encodeFrame):
(WebCore::defaultH264EncodingColorSpace): Deleted.
* Tools/TestWebKitAPI/Tests/WebCore/H264UtilitiesTests.cpp:
(TestWebKitAPI::TEST(H264BitstreamParser,
ComputesZeroMaxNumReorderFramesWhenPicOrderCntTypeIsTwo)):
(TestWebKitAPI::TestBitWriter::writeFlag):
(TestWebKitAPI::TestBitWriter::writeBits):
(TestWebKitAPI::TestBitWriter::writeExpGolomb):
(TestWebKitAPI::TestBitWriter::takeBytes):
(TestWebKitAPI::TestBitWriter::writeBit):
(TestWebKitAPI::TestBitWriter::flushByte):
(TestWebKitAPI::makeSpsWithMaxNumReorderFrames):
(TestWebKitAPI::makeAVCCWithSingleSps):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesParsesEmbeddedSps)):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesReturnsNonZeroValueFromBitstreamRestriction)):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesRejectsTooShortRecord)):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesRejectsZeroSequenceParameterSets)):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesRejectsSpsSizeOfJustTheNaluHeader)):
(TestWebKitAPI::TEST(H264Utilities,
FindAVCCMaxNumReorderFramesRejectsTruncatedSps)):
* Tools/TestWebKitAPI/Tests/WebCore/cocoa/H264UtilitiesCocoaTests.mm:
(TestWebKitAPI::TEST(H264UtilitiesCocoa, CreatesVideoInfoFromAnnexBSpsPpsPair)):
(TestWebKitAPI::TEST(H264UtilitiesCocoa,
ConvertsAnnexBToLengthPrefixedSkippingLeadingParameterSets)):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoder.mm:
(WebCore::GPUVideoDecoder::create):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTB.mm:
(WebCore::overrideColorSpaceAttachments):
(WebCore::createMultiImageCallback):
(WebCore::GPUVideoDecoderVTB::decodeFrameInternal):
* Source/WebCore/platform/cocoa/CoreVideoSoftLink.cpp:
* Source/WebCore/platform/cocoa/CoreVideoSoftLink.h:
* Source/WebCore/platform/graphics/AnnexBUtilities.cpp:
(WebCore::annexBToLengthPrefixed):
* Source/WebCore/platform/graphics/AnnexBUtilities.h:
* Source/WebCore/platform/graphics/cocoa/HEVCUtilitiesCocoa.mm:
(WebCore::convertHEVCAnnexBToLengthPrefixed):
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTB.h:
(WebCore::GPUVideoDecoderVTB::shouldOverrideColorSpaceAttachments const):
* Source/WebCore/platform/graphics/HEVCUtilities.cpp:
* Source/WebCore/platform/graphics/HEVCUtilities.h:
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH265.h:
* Source/WebCore/platform/video-codecs/cocoa/GPUVideoDecoderVTBH265.mm:
Canonical link: https://commits.webkit.org/322034@main
To unsubscribe from these emails, change your notification settings at
https://github.com/WebKit/WebKit/settings/notifications