Skip to content

Commit 5e174d0

Browse files
committed
Opus and Vorbis webm aren't available in the content process on some platforms.
https://bugs.webkit.org/show_bug.cgi?id=300013 rdar://161800673 Reviewed by Youenn Fablet. We check the Opus and Vorbis capabilities on creation of the GPU process. This value is then cached in the UI process and passed on follow-up WebContent process creation; re-using the infrastucture that used to exist for VP9 and AV1 hardware detection. We simplify the code and combine all the media codecs information into a single GPUProcessMediaCodecCapabilities structure. Added test for opus. * LayoutTests/media/media-can-play-webm-expected.txt: * LayoutTests/media/media-can-play-webm.html: * Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.h: * Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.mm: (WebCore::setHasOpusDecoder): (WebCore::setHasVorbisDecoder): (WebCore::isOpusDecoderAvailable): (WebCore::isVorbisDecoderAvailable): * Source/WebKit/CMakeLists.txt: * Source/WebKit/DerivedSources-input.xcfilelist: * Source/WebKit/DerivedSources.make: * Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp: (WebKit::m_sharedPreferencesForWebProcess): * Source/WebKit/Shared/GPUProcessConnectionParameters.h: * Source/WebKit/Shared/GPUProcessConnectionParameters.serialization.in: * Source/WebKit/Shared/GPUProcessMediaCodecCapabilities.h: Copied from Source/WebKit/Shared/GPUProcessConnectionParameters.h. * Source/WebKit/Shared/GPUProcessMediaCodecCapabilities.serialization.in: Copied from Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.serialization.in. * Source/WebKit/UIProcess/GPU/GPUProcessProxy.cpp: (WebKit::GPUProcessProxy::createGPUProcessConnection): (WebKit::GPUProcessProxy::didFinishLaunching): * Source/WebKit/UIProcess/GPU/GPUProcessProxy.h: * Source/WebKit/UIProcess/GPU/GPUProcessProxy.messages.in: * Source/WebKit/WebKit.xcodeproj/project.pbxproj: * Source/WebKit/WebProcess/GPU/GPUProcessConnection.cpp: (WebKit::GPUProcessConnection::didInitialize): * Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.h: * Source/WebKit/WebProcess/GPU/GPUProcessConnectionInfo.serialization.in: Canonical link: https://commits.webkit.org/300939@main
1 parent ad89f25 commit 5e174d0

20 files changed

Lines changed: 195 additions & 86 deletions

‎LayoutTests/media/media-can-play-webm-expected.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ EXPECTED (video.canPlayType('audio/webm') == 'maybe') OK
77
EXPECTED (video.canPlayType('video/webm') == 'maybe') OK
88
EXPECTED (video.canPlayType('audio/webm; codecs=vorbis') == 'probably') OK
99
EXPECTED (video.canPlayType('video/webm; codecs=vp8,vorbis') == 'probably') OK
10+
EXPECTED (video.canPlayType('audio/webm; codecs=opus') == 'probably') OK
11+
EXPECTED (video.canPlayType('video/webm; codecs=vp8,opus') == 'probably') OK
1012
END OF TEST
1113

‎LayoutTests/media/media-can-play-webm.html‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@
1212
testExpected("video.canPlayType('audio/webm; codecs=vorbis')", "probably");
1313
testExpected("video.canPlayType('video/webm; codecs=vp8,vorbis')", "probably");
1414

15+
testExpected("video.canPlayType('audio/webm; codecs=opus')", "probably");
16+
testExpected("video.canPlayType('video/webm; codecs=vp8,opus')", "probably");
17+
1518
endTest();
1619
}
1720
</script>

‎LayoutTests/platform/mac-wk1/media/media-can-play-webm-expected.txt‎

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@ EXPECTED (video.canPlayType('audio/webm') == 'maybe'), OBSERVED '' FAIL
77
EXPECTED (video.canPlayType('video/webm') == 'maybe'), OBSERVED '' FAIL
88
EXPECTED (video.canPlayType('audio/webm; codecs=vorbis') == 'probably'), OBSERVED '' FAIL
99
EXPECTED (video.canPlayType('video/webm; codecs=vp8,vorbis') == 'probably'), OBSERVED '' FAIL
10+
EXPECTED (video.canPlayType('audio/webm; codecs=opus') == 'probably'), OBSERVED '' FAIL
11+
EXPECTED (video.canPlayType('video/webm; codecs=vp8,opus') == 'probably'), OBSERVED '' FAIL
1012
END OF TEST
1113

‎Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.h‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,13 @@ bool parseOpusTOCData(std::span<const uint8_t> frameData, OpusCookieContents&);
7070
RefPtr<AudioInfo> createOpusAudioInfo(const OpusCookieContents&);
7171
Vector<uint8_t> createOpusPrivateData(const AudioStreamBasicDescription&, uint16_t preSkip = 0);
7272

73+
#if ENABLE(OPUS)
74+
WEBCORE_EXPORT void setHasOpusDecoder(bool);
75+
#endif
76+
#if ENABLE(VORBIS)
77+
WEBCORE_EXPORT void setHasVorbisDecoder(bool);
78+
#endif
79+
7380
}
7481

7582
#endif // && PLATFORM(COCOA)

‎Source/WebCore/platform/graphics/cocoa/WebMAudioUtilitiesCocoa.mm‎

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,22 @@
5151

5252
namespace WebCore {
5353

54+
namespace WebMAudioUtilities {
55+
#if ENABLE(OPUS)
56+
static std::optional<bool> s_hasOpusDecoder;
57+
#endif
58+
#if ENABLE(VORBIS)
59+
static std::optional<bool> s_hasVorbisDecoder;
60+
#endif
61+
}
62+
63+
#if ENABLE(OPUS)
64+
void setHasOpusDecoder(bool hasDecoder) { WebMAudioUtilities::s_hasOpusDecoder = hasDecoder; }
65+
#endif
66+
#if ENABLE(VORBIS)
67+
void setHasVorbisDecoder(bool hasDecoder) { WebMAudioUtilities::s_hasVorbisDecoder = hasDecoder; }
68+
#endif
69+
5470
#if ENABLE(VORBIS) || ENABLE(OPUS)
5571
static bool registerDecoderFactory(ASCIILiteral decoderName, OSType decoderType)
5672
{
@@ -368,7 +384,9 @@ bool parseOpusTOCData(std::span<const uint8_t> frameData, OpusCookieContents& co
368384
bool isOpusDecoderAvailable()
369385
{
370386
#if ENABLE(OPUS)
371-
return registerOpusDecoderIfNeeded();
387+
if (registerOpusDecoderIfNeeded())
388+
return true;
389+
return WebMAudioUtilities::s_hasOpusDecoder.value_or(false);
372390
#else
373391
return false;
374392
#endif
@@ -493,7 +511,9 @@ bool registerOpusDecoderIfNeeded()
493511
bool isVorbisDecoderAvailable()
494512
{
495513
#if ENABLE(VORBIS)
496-
return registerVorbisDecoderIfNeeded();
514+
if (registerVorbisDecoderIfNeeded())
515+
return true;
516+
return WebMAudioUtilities::s_hasVorbisDecoder.value_or(false);
497517
#else
498518
return false;
499519
#endif

‎Source/WebKit/CMakeLists.txt‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,7 @@ set(WebKit_SERIALIZATION_IN_FILES
485485
Shared/FrameTreeNodeData.serialization.in
486486
Shared/FullScreenMediaDetails.serialization.in
487487
Shared/GPUProcessConnectionParameters.serialization.in
488+
Shared/GPUProcessMediaCodecCapabilities.serialization.in
488489
Shared/GoToBackForwardItemParameters.serialization.in
489490
Shared/ImageOptions.serialization.in
490491
Shared/InspectorExtensionTypes.serialization.in

‎Source/WebKit/DerivedSources-input.xcfilelist‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -316,6 +316,7 @@ $(PROJECT_DIR)/Shared/FrameTreeCreationParameters.serialization.in
316316
$(PROJECT_DIR)/Shared/FrameTreeNodeData.serialization.in
317317
$(PROJECT_DIR)/Shared/FullScreenMediaDetails.serialization.in
318318
$(PROJECT_DIR)/Shared/GPUProcessConnectionParameters.serialization.in
319+
$(PROJECT_DIR)/Shared/GPUProcessMediaCodecCapabilities.serialization.in
319320
$(PROJECT_DIR)/Shared/Gamepad/GamepadData.serialization.in
320321
$(PROJECT_DIR)/Shared/GoToBackForwardItemParameters.serialization.in
321322
$(PROJECT_DIR)/Shared/HTTPSUpgrade/HTTPSUpgradeList.txt

‎Source/WebKit/DerivedSources.make‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -726,6 +726,7 @@ SERIALIZATION_DESCRIPTION_FILES = \
726726
Shared/FullScreenMediaDetails.serialization.in \
727727
Shared/Gamepad/GamepadData.serialization.in \
728728
Shared/GPUProcessConnectionParameters.serialization.in \
729+
Shared/GPUProcessMediaCodecCapabilities.serialization.in \
729730
Shared/GoToBackForwardItemParameters.serialization.in \
730731
Shared/ImageOptions.serialization.in \
731732
Shared/InspectorExtensionTypes.serialization.in \

‎Source/WebKit/GPUProcess/GPUConnectionToWebProcess.cpp‎

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "GPUProcessConnectionInfo.h"
3434
#include "GPUProcessConnectionMessages.h"
3535
#include "GPUProcessConnectionParameters.h"
36+
#include "GPUProcessMediaCodecCapabilities.h"
3637
#include "GPUProcessMessages.h"
3738
#include "GPUProcessProxyMessages.h"
3839
#include "LayerHostingContext.h"
@@ -149,6 +150,9 @@
149150
#if ENABLE(VP9) && PLATFORM(COCOA)
150151
#include <WebCore/VP9UtilitiesCocoa.h>
151152
#endif
153+
#if (ENABLE(OPUS) || ENABLE(VORBIS)) && PLATFORM(COCOA)
154+
#include <WebCore/WebMAudioUtilitiesCocoa.h>
155+
#endif
152156

153157
#if ENABLE(ROUTING_ARBITRATION) && HAVE(AVAUDIO_ROUTING_ARBITER)
154158
#include "LocalAudioSessionRoutingArbitrator.h"
@@ -357,35 +361,31 @@ GPUConnectionToWebProcess::GPUConnectionToWebProcess(GPUProcess& gpuProcess, Web
357361
connection->setOnlySendMessagesAsDispatchWhenWaitingForSyncReplyWhenProcessingSuchAMessage(true);
358362
connection->open(*this);
359363

364+
auto capabilities = parameters.mediaCodecCapabilities.value_or(GPUProcessMediaCodecCapabilities {
360365
#if ENABLE(VP9)
361-
bool hasVP9HardwareDecoder;
362-
if (parameters.hasVP9HardwareDecoder)
363-
hasVP9HardwareDecoder = *parameters.hasVP9HardwareDecoder;
364-
else {
365-
hasVP9HardwareDecoder = WebCore::vp9HardwareDecoderAvailableInProcess();
366-
gpuProcess.send(Messages::GPUProcessProxy::SetHasVP9HardwareDecoder(hasVP9HardwareDecoder));
367-
}
366+
.hasVP9HardwareDecoder = WebCore::vp9HardwareDecoderAvailableInProcess(),
368367
#endif
369368
#if ENABLE(AV1)
370-
bool hasAV1HardwareDecoder;
371-
if (parameters.hasAV1HardwareDecoder)
372-
hasAV1HardwareDecoder = *parameters.hasAV1HardwareDecoder;
373-
else {
374-
hasAV1HardwareDecoder = WebCore::av1HardwareDecoderAvailable();
375-
gpuProcess.send(Messages::GPUProcessProxy::SetHasAV1HardwareDecoder(hasAV1HardwareDecoder));
376-
}
369+
.hasAV1HardwareDecoder = WebCore::av1HardwareDecoderAvailable(),
377370
#endif
378-
379-
WebKit::GPUProcessConnectionInfo info {
380-
#if HAVE(AUDIT_TOKEN)
381-
gpuProcess.protectedParentProcessConnection()->getAuditToken(),
371+
#if PLATFORM(COCOA)
372+
#if ENABLE(OPUS)
373+
.hasOpusDecoder = WebCore::isOpusDecoderAvailable(),
382374
#endif
383-
#if ENABLE(VP9)
384-
hasVP9HardwareDecoder,
375+
#if ENABLE(VORBIS)
376+
.hasVorbisDecoder = WebCore::isVorbisDecoderAvailable()
385377
#endif
386-
#if ENABLE(AV1)
387-
hasAV1HardwareDecoder
388378
#endif
379+
});
380+
381+
if (!parameters.mediaCodecCapabilities)
382+
gpuProcess.send(Messages::GPUProcessProxy::SetMediaCodecCapabilities(capabilities));
383+
384+
GPUProcessConnectionInfo info {
385+
#if HAVE(AUDIT_TOKEN)
386+
.auditToken = gpuProcess.protectedParentProcessConnection()->getAuditToken(),
387+
#endif
388+
.mediaCodecCapabilities = capabilities
389389
};
390390
m_connection->send(Messages::GPUProcessConnection::DidInitialize(info), 0);
391391
++gObjectCountForTesting;

‎Source/WebKit/Shared/GPUProcessConnectionParameters.h‎

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@
2727

2828
#if ENABLE(GPU_PROCESS)
2929

30+
#include "GPUProcessMediaCodecCapabilities.h"
3031
#include "SharedPreferencesForWebProcess.h"
3132
#include <WebCore/ProcessIdentity.h>
3233
#include <wtf/MachSendRight.h>
@@ -51,12 +52,7 @@ struct GPUProcessConnectionParameters {
5152
#if PLATFORM(COCOA)
5253
String applicationBundleIdentifier;
5354
#endif
54-
#if ENABLE(VP9)
55-
std::optional<bool> hasVP9HardwareDecoder;
56-
#endif
57-
#if ENABLE(AV1)
58-
std::optional<bool> hasAV1HardwareDecoder;
59-
#endif
55+
std::optional<GPUProcessMediaCodecCapabilities> mediaCodecCapabilities;
6056
};
6157

6258
}; // namespace WebKit

0 commit comments

Comments
 (0)