Skip to content

Commit

Permalink
Use dav1d decoder instead of libaom decoder
Browse files Browse the repository at this point in the history
https://bugs.webkit.org/show_bug.cgi?id=248523
rdar://problem/102804765

Reviewed by Jean-Yves Avenard.

dav1d decoder is more efficient than libaom decoder so it is best to use dav1d.
dav1d is a librarly linked in WebCore so we create a dav1d webrtc decoder in WebCore and not libwebrtc.
We integrate this decoder at WebKit level.

We have to export more headers, including libyuv from libwebrtc to be used in WebCore.
We update xcconfig for that purpose.

We link dav1d conditionnaly on ENABLE_WEB_RTC if it is not already linked through libavif.

* Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp:
* Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp:
* Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp:
* Source/ThirdParty/libwebrtc/Configurations/libwebrtc.xcconfig:
* Source/ThirdParty/libwebrtc/Configurations/libyuv.xcconfig:
* Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h:
* Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.mm:
(webrtc::RemoteVideoDecoder::RemoteVideoDecoder):
(webrtc::RemoteVideoDecoderFactory::CreateVideoDecoder):
* Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m:
(-[RTCDefaultVideoDecoderFactory supportedCodecs]):
(-[RTCDefaultVideoDecoderFactory createDecoder:]):
* Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m:
(+[RTCDefaultVideoEncoderFactory supportedCodecsWithH265:vp9Profile0:vp9Profile2:av1:]):
(-[RTCDefaultVideoEncoderFactory createEncoder:]):
* Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj:
* Source/WebCore/PAL/libavif/dav1d/dav1d.xcodeproj/project.pbxproj:
* Source/WebCore/WebCore.xcodeproj/project.pbxproj:
* Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCDav1dDecoder.cpp: Added.
(WebCore::ScopedDav1dData::~ScopedDav1dData):
(WebCore::ScopedDav1dData::Data):
(WebCore::ScopedDav1dPicture::~ScopedDav1dPicture):
(WebCore::ScopedDav1dPicture::Picture):
(WebCore::NullFreeCallback):
(WebCore::Dav1dDecoder::Dav1dDecoder):
(WebCore::Dav1dDecoder::~Dav1dDecoder):
(WebCore::Dav1dDecoder::Configure):
(WebCore::Dav1dDecoder::RegisterDecodeCompleteCallback):
(WebCore::Dav1dDecoder::Release):
(WebCore::Dav1dDecoder::GetDecoderInfo const):
(WebCore::Dav1dDecoder::ImplementationName const):
(WebCore::Dav1dDecoder::Decode):
(WebCore::createLibWebRTCDav1dDecoder):
* Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCDav1dDecoder.h: Added.
* Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
(WebKit::createVideoDecoder):
(WebKit::releaseVideoDecoder):
(WebKit::decodeVideoFrame):
(WebKit::registerDecodeCompleteCallback):

Canonical link: https://commits.webkit.org/257283@main
  • Loading branch information
youennf committed Dec 2, 2022
1 parent 0a9f425 commit 111902f
Show file tree
Hide file tree
Showing 18 changed files with 534 additions and 35 deletions.
15 changes: 14 additions & 1 deletion Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp
Expand Up @@ -204,7 +204,7 @@ __ZN6webrtc17setDecodingFormatEPvPKhmtt
__ZN6webrtc11decodeFrameEPvxPKhm
__ZN6webrtc24videoDecoderTaskCompleteEPvjjP10__CVBuffer
__ZN6webrtc24videoDecoderTaskCompleteEPvjjS0_PFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmttEPFiS0_S0_E
__ZN6webrtc24setVideoDecoderCallbacksEPFNS_18WebKitVideoDecoderERKNS_14SdpVideoFormatEEPFiPvEPFiS6_jPKhmttEPFiS6_S6_E
__ZN6webrtc24toWebRTCVideoFrameBufferEPvPFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24videoFrameBufferProviderERKNS_10VideoFrameE
__ZN6webrtc19setDecoderFrameSizeEPvtt
Expand Down Expand Up @@ -362,3 +362,16 @@ __ZNK6webrtc10ColorSpace5rangeEv
__ZNK6webrtc10ColorSpace6matrixEv
__ZNK6webrtc10ColorSpace8transferEv
__ZNK6webrtc10ColorSpace9primariesEv
_I420Copy
__ZN6webrtc10VideoFrame7Builder15set_color_spaceEPKNS_10ColorSpaceE
__ZN6webrtc10VideoFrame7Builder15set_ntp_time_msEx
__ZN6webrtc10VideoFrame7Builder17set_timestamp_rtpEj
__ZN6webrtc10VideoFrame7Builder22set_video_frame_bufferERKN3rtc13scoped_refptrINS_16VideoFrameBufferEEE
__ZN6webrtc10VideoFrame7Builder5buildEv
__ZN6webrtc10VideoFrame7BuilderC1Ev
__ZN6webrtc10VideoFrame7BuilderD1Ev
__ZN6webrtc20VideoFrameBufferPool16CreateI420BufferEii
__ZN6webrtc20VideoFrameBufferPool7ReleaseEv
__ZN6webrtc20VideoFrameBufferPoolC1Ebm
__ZN6webrtc20VideoFrameBufferPoolD1Ev
__ZTVN6webrtc12VideoDecoderE
15 changes: 14 additions & 1 deletion Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp
Expand Up @@ -204,7 +204,7 @@ __ZN6webrtc17setDecodingFormatEPvPKhmtt
__ZN6webrtc11decodeFrameEPvxPKhm
__ZN6webrtc24videoDecoderTaskCompleteEPvjjP10__CVBuffer
__ZN6webrtc24videoDecoderTaskCompleteEPvjjS0_PFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmttEPFiS0_S0_E
__ZN6webrtc24setVideoDecoderCallbacksEPFNS_18WebKitVideoDecoderERKNS_14SdpVideoFormatEEPFiPvEPFiS6_jPKhmttEPFiS6_S6_E
__ZN6webrtc24toWebRTCVideoFrameBufferEPvPFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24videoFrameBufferProviderERKNS_10VideoFrameE
__ZN6webrtc19setDecoderFrameSizeEPvtt
Expand Down Expand Up @@ -362,3 +362,16 @@ __ZNK6webrtc10ColorSpace5rangeEv
__ZNK6webrtc10ColorSpace6matrixEv
__ZNK6webrtc10ColorSpace8transferEv
__ZNK6webrtc10ColorSpace9primariesEv
_I420Copy
__ZN6webrtc10VideoFrame7Builder15set_color_spaceEPKNS_10ColorSpaceE
__ZN6webrtc10VideoFrame7Builder15set_ntp_time_msEx
__ZN6webrtc10VideoFrame7Builder17set_timestamp_rtpEj
__ZN6webrtc10VideoFrame7Builder22set_video_frame_bufferERKN3rtc13scoped_refptrINS_16VideoFrameBufferEEE
__ZN6webrtc10VideoFrame7Builder5buildEv
__ZN6webrtc10VideoFrame7BuilderC1Ev
__ZN6webrtc10VideoFrame7BuilderD1Ev
__ZN6webrtc20VideoFrameBufferPool16CreateI420BufferEii
__ZN6webrtc20VideoFrameBufferPool7ReleaseEv
__ZN6webrtc20VideoFrameBufferPoolC1Ebm
__ZN6webrtc20VideoFrameBufferPoolD1Ev
__ZTVN6webrtc12VideoDecoderE
15 changes: 14 additions & 1 deletion Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp
Expand Up @@ -206,7 +206,7 @@ __ZN6webrtc24videoDecoderTaskCompleteEPvjjP10__CVBuffer
__ZN6webrtc24videoDecoderTaskCompleteEPvjjS0_PFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24toWebRTCVideoFrameBufferEPvPFP10__CVBufferS0_EPFvS0_Eii
__ZN6webrtc24videoFrameBufferProviderERKNS_10VideoFrameE
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmttEPFiS0_S0_E
__ZN6webrtc24setVideoDecoderCallbacksEPFNS_18WebKitVideoDecoderERKNS_14SdpVideoFormatEEPFiPvEPFiS6_jPKhmttEPFiS6_S6_E
__ZN6webrtc19setDecoderFrameSizeEPvtt
__ZN6webrtc18RtpCodecCapabilityC1Ev
__ZN6webrtc24encoderVideoTaskCompleteEPvNS_14VideoCodecTypeEPKhmRKNS_22WebKitEncodedFrameInfoE
Expand Down Expand Up @@ -362,3 +362,16 @@ __ZNK6webrtc10ColorSpace5rangeEv
__ZNK6webrtc10ColorSpace6matrixEv
__ZNK6webrtc10ColorSpace8transferEv
__ZNK6webrtc10ColorSpace9primariesEv
_I420Copy
__ZN6webrtc10VideoFrame7Builder15set_color_spaceEPKNS_10ColorSpaceE
__ZN6webrtc10VideoFrame7Builder15set_ntp_time_msEx
__ZN6webrtc10VideoFrame7Builder17set_timestamp_rtpEj
__ZN6webrtc10VideoFrame7Builder22set_video_frame_bufferERKN3rtc13scoped_refptrINS_16VideoFrameBufferEEE
__ZN6webrtc10VideoFrame7Builder5buildEv
__ZN6webrtc10VideoFrame7BuilderC1Ev
__ZN6webrtc10VideoFrame7BuilderD1Ev
__ZN6webrtc20VideoFrameBufferPool16CreateI420BufferEii
__ZN6webrtc20VideoFrameBufferPool7ReleaseEv
__ZN6webrtc20VideoFrameBufferPoolC1Ebm
__ZN6webrtc20VideoFrameBufferPoolD1Ev
__ZTVN6webrtc12VideoDecoderE
Expand Up @@ -56,7 +56,7 @@ PUBLIC_HEADERS_FOLDER_PREFIX = $(WK_LIBRARY_HEADERS_FOLDER_PATH);
INSTALL_PUBLIC_HEADER_PREFIX = $(INSTALL_PATH_PREFIX)$(PUBLIC_HEADERS_FOLDER_PREFIX);
SYSTEM_PUBLIC_HEADER_PREFIX = $(SYSTEM_PUBLIC_HEADER_PREFIX_$(USE_SYSTEM_CONTENT_PATH));
SYSTEM_PUBLIC_HEADER_PREFIX_YES = $(DSTROOT)$(PUBLIC_HEADERS_FOLDER_PREFIX);
HEADER_FOLDER_LIST = absl libwebrtc webm webrtc;
HEADER_FOLDER_LIST = absl libwebrtc webm webrtc libyuv;

PUBLIC_LIBRARY_FOLDER_PREFIX = $(WK_LIBRARY_INSTALL_PATH);
INSTALL_PUBLIC_LIBRARY_PREFIX = $(INSTALL_PATH_PREFIX)$(PUBLIC_LIBRARY_FOLDER_PREFIX);
Expand Down
6 changes: 5 additions & 1 deletion Source/ThirdParty/libwebrtc/Configurations/libyuv.xcconfig
Expand Up @@ -9,7 +9,11 @@ ENABLE_STRICT_OBJC_MSGSEND = YES;

HEADER_SEARCH_PATHS = Source/third_party/libyuv/include;
INSTALL_PATH = $(INSTALL_PATH_PREFIX)$(WK_LIBRARY_INSTALL_PATH);
PUBLIC_HEADERS_FOLDER_PATH = $(INSTALL_PATH_PREFIX)$(WK_LIBRARY_HEADERS_FOLDER_PATH)/libwebrtc;
USE_HEADERMAP = NO;

OTHER_LDFLAGS = $(inherited) $(SOURCE_VERSION_LDFLAGS);

APPLY_RULES_IN_COPY_HEADERS = $(WK_USE_NEW_BUILD_SYSTEM);
PUBLIC_HEADERS_FOLDER_PATH = $(PUBLIC_HEADERS_FOLDER_PATH_$(WK_WHICH_BUILD_SYSTEM));
PUBLIC_HEADERS_FOLDER_PATH_not_legacy = $(INSTALL_PATH_PREFIX)$(WK_LIBRARY_HEADERS_FOLDER_PATH)/liyuv;
PUBLIC_HEADERS_FOLDER_PATH_legacy = $(WK_LIBRARY_HEADERS_FOLDER_PATH)/libyuv_flattened;
Expand Up @@ -45,11 +45,15 @@ namespace webrtc {
struct SdpVideoFormat;
class VideoDecoderFactory;

using WebKitVideoDecoder = void*;
struct WebKitVideoDecoder {
using Value = void*;
Value value { nullptr };
bool isWebRTCVideoDecoder { false };
};
using VideoDecoderCreateCallback = WebKitVideoDecoder(*)(const SdpVideoFormat& format);
using VideoDecoderReleaseCallback = int32_t(*)(WebKitVideoDecoder);
using VideoDecoderDecodeCallback = int32_t(*)(WebKitVideoDecoder, uint32_t timeStamp, const uint8_t*, size_t length, uint16_t width, uint16_t height);
using VideoDecoderRegisterDecodeCompleteCallback = int32_t(*)(WebKitVideoDecoder, void* decodedImageCallback);
using VideoDecoderReleaseCallback = int32_t(*)(WebKitVideoDecoder::Value);
using VideoDecoderDecodeCallback = int32_t(*)(WebKitVideoDecoder::Value, uint32_t timeStamp, const uint8_t*, size_t length, uint16_t width, uint16_t height);
using VideoDecoderRegisterDecodeCompleteCallback = int32_t(*)(WebKitVideoDecoder::Value, void* decodedImageCallback);

void setVideoDecoderCallbacks(VideoDecoderCreateCallback, VideoDecoderReleaseCallback, VideoDecoderDecodeCallback, VideoDecoderRegisterDecodeCompleteCallback);

Expand Down
Expand Up @@ -161,7 +161,7 @@ - (void)flush {

class RemoteVideoDecoder final : public webrtc::VideoDecoder {
public:
RemoteVideoDecoder(WebKitVideoDecoder, bool isVP9);
RemoteVideoDecoder(WebKitVideoDecoder::Value, bool isVP9);
~RemoteVideoDecoder();

bool isVP9() const { return m_isVP9; }
Expand All @@ -173,7 +173,7 @@ - (void)flush {
int32_t Release() final;
const char* ImplementationName() const final { return "RemoteVideoToolBox"; }

WebKitVideoDecoder m_internalDecoder;
WebKitVideoDecoder::Value m_internalDecoder;
bool m_isVP9 { false };
};

Expand All @@ -198,7 +198,7 @@ void setVideoDecoderCallbacks(VideoDecoderCreateCallback createCallback, VideoDe
callbacks.registerDecodeCompleteCallback = registerDecodeCompleteCallback;
}

RemoteVideoDecoder::RemoteVideoDecoder(WebKitVideoDecoder internalDecoder, bool isVP9)
RemoteVideoDecoder::RemoteVideoDecoder(WebKitVideoDecoder::Value internalDecoder, bool isVP9)
: m_internalDecoder(internalDecoder)
, m_isVP9(isVP9)
{
Expand Down Expand Up @@ -280,11 +280,14 @@ void videoDecoderTaskComplete(void* callback, uint32_t timeStamp, uint32_t timeS
if (!videoDecoderCallbacks().createCallback)
return m_internalFactory->CreateVideoDecoder(format);

auto identifier = videoDecoderCallbacks().createCallback(format);
if (!identifier)
auto createdDecoder = videoDecoderCallbacks().createCallback(format);
if (!createdDecoder.value)
return m_internalFactory->CreateVideoDecoder(format);

auto decoder = std::make_unique<RemoteVideoDecoder>(identifier, format.name == "VP9");
if (createdDecoder.isWebRTCVideoDecoder)
return std::unique_ptr<VideoDecoder> { static_cast<VideoDecoder*>(createdDecoder.value) };

auto decoder = std::make_unique<RemoteVideoDecoder>(createdDecoder.value, format.name == "VP9");
if (!decoder->isVP9())
return decoder;
return webrtc::CreateVideoDecoderSoftwareFallbackWrapper(m_internalFactory->CreateVideoDecoder(format), std::move(decoder));
Expand Down
Expand Up @@ -23,7 +23,7 @@
#import "RTCH265ProfileLevelId.h"
#import "RTCVideoDecoderH265.h"
#endif
#if !defined(DISABLE_LIBAOM_AV1)
#if !defined(DISABLE_RTC_AV1)
#import "sdk/objc/api/video_codec/RTCVideoDecoderAV1.h"
#endif

Expand Down Expand Up @@ -97,7 +97,7 @@ - (id)initWithH265:(bool)supportsH265 vp9Profile0:(bool)supportsVP9Profile0 vp9P
}]];
}
#endif
#if !defined(DISABLE_LIBAOM_AV1)
#if !defined(DISABLE_RTC_AV1)
if (_supportsAv1) {
[codecs addObject:[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecAv1Name]];
}
Expand All @@ -122,7 +122,7 @@ - (id)initWithH265:(bool)supportsH265 vp9Profile0:(bool)supportsVP9Profile0 vp9P
return [RTCVideoDecoderVP9 vp9Decoder];
}
#endif
#if !defined(DISABLE_LIBAOM_AV1)
#if !defined(DISABLE_RTC_AV1)
} else if ([info.name isEqualToString:kRTCVideoCodecAv1Name]) {
return [RTCVideoDecoderAV1 av1Decoder];
}
Expand Down
Expand Up @@ -22,7 +22,7 @@
#import "RTCH265ProfileLevelId.h"
#import "RTCVideoEncoderH265.h"
#endif
#if !defined(DISABLE_LIBAOM_AV1_ENCODER)
#if !defined(DISABLE_RTC_AV1)
#import "sdk/objc/api/video_codec/RTCVideoEncoderAV1.h"
#endif

Expand Down Expand Up @@ -98,7 +98,7 @@ - (id)initWithH265:(bool)supportsH265 vp9Profile0:(bool)supportsVP9Profile0 vp9P
}]];
}
#endif
#if !defined(DISABLE_LIBAOM_AV1)
#if !defined(DISABLE_RTC_AV1)
if (supportsAv1) {
[codecs addObject:[[RTCVideoCodecInfo alloc] initWithName:kRTCVideoCodecAv1Name]];
}
Expand All @@ -125,7 +125,7 @@ - (id)initWithH265:(bool)supportsH265 vp9Profile0:(bool)supportsVP9Profile0 vp9P
}
#endif
}
#if !defined(DISABLE_LIBAOM_AV1)
#if !defined(DISABLE_RTC_AV1)
if ([info.name isEqualToString:kRTCVideoCodecAv1Name]) {
return [RTCVideoEncoderAV1 av1Encoder];
}
Expand Down

0 comments on commit 111902f

Please sign in to comment.