Diff
Modified: trunk/Source/ThirdParty/libwebrtc/ChangeLog (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/ChangeLog 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/ChangeLog 2020-11-03 12:33:03 UTC (rev 269293)
@@ -1,5 +1,41 @@
2020-11-03 Youenn Fablet <[email protected]>
+ Allow low latency H264 encoder in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=218442
+
+ Reviewed by Eric Carlson.
+
+ Add a useLowLatency boolean in RTCVideoEncoderH264 and in encoder factory.
+ Encoder is set by the factory at creation time.
+ useLowLatency factory value is set at creation of the factory.
+
+ Clean up WebKitXX.h headers to do less include and move declarations in specific headers.
+
+ * Configurations/libwebrtc.iOS.exp:
+ * Configurations/libwebrtc.iOSsim.exp:
+ * Configurations/libwebrtc.mac.exp:
+ * Source/webrtc/sdk/WebKit/WebKitDecoder.h:
+ * Source/webrtc/sdk/WebKit/WebKitDecoder.mm:
+ (webrtc::videoDecoderTaskComplete):
+ * Source/webrtc/sdk/WebKit/WebKitEncoder.h:
+ * Source/webrtc/sdk/WebKit/WebKitEncoder.mm:
+ (-[WK_RTCLocalVideoH264H265Encoder setLowLatency:]):
+ (webrtc::createWebKitEncoderFactory):
+ (webrtc::setLocalEncoderLowLatency):
+ * Source/webrtc/sdk/WebKit/WebKitUtilities.h:
+ * Source/webrtc/sdk/WebKit/WebKitUtilities.mm:
+ * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h:
+ * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m:
+ (-[RTCDefaultVideoEncoderFactory initWithH265:vp9:lowLatencyH264:]):
+ (-[RTCDefaultVideoEncoderFactory createEncoder:]):
+ * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h:
+ * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm:
+ (-[RTCVideoEncoderH264 initWithCodecInfo:]):
+ (-[RTCVideoEncoderH264 setH264LowLatencyEncoderEnabled:]):
+ (-[RTCVideoEncoderH264 resetCompressionSessionWithPixelFormat:]):
+
+2020-11-03 Youenn Fablet <[email protected]>
+
Update WebRTC libyuv to M87
https://bugs.webkit.org/show_bug.cgi?id=218434
Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp 2020-11-03 12:33:03 UTC (rev 269293)
@@ -105,9 +105,8 @@
__ZNK6webrtc21IceCandidateInterface10server_urlEv
__ZN6webrtc20setApplicationStatusEb
__ZN6webrtc26createWebKitDecoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_12WebKitVP9VTBE
-__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9E
+__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_20WebKitH264LowLatencyE
__ZN6webrtc29setH264HardwareEncoderAllowedEb
-__ZN6webrtc31setH264LowLatencyEncoderEnabledEb
__ZN6webrtc24registerWebKitVP9DecoderEv
__ZN6webrtc20pixelBufferFromFrameERKNS_10VideoFrameERKNSt3__18functionIFP10__CVBuffermmNS_10BufferTypeEEEE
__ZN6webrtc18pixelBufferToFrameEP10__CVBuffer
@@ -242,7 +241,7 @@
__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
__ZN6webrtc19releaseLocalDecoderEPv
__ZN6webrtc11decodeFrameEPvjPKhm
-__ZN6webrtc18RemoteVideoDecoder14decodeCompleteEPvjP10__CVBufferj
+__ZN6webrtc24videoDecoderTaskCompleteEPvjP10__CVBufferj
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmEPFiS0_S0_E
__ZN6webrtc18RtpCodecCapabilityC1Ev
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmEPFiS0_S0_E
@@ -253,6 +252,7 @@
__ZN6webrtc22RTPFragmentationHeader6ResizeEm
__ZN6webrtc24setVideoEncoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_RKNS_10VideoCodecEEPFiS0_RKNS_10VideoFrameEbEPFiS0_S0_EPFvS0_RKNS_12VideoEncoder21RateControlParametersEE
__ZN6webrtc20setLocalEncoderRatesEPvjj
+__ZN6webrtc25setLocalEncoderLowLatencyEPvb
__ZN6webrtc22initializeLocalEncoderEPvttjjjj
__ZN6webrtc14SdpVideoFormatC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE
__ZN6webrtc18createLocalEncoderERKNS_14SdpVideoFormatEU13block_pointerFvPKhmRKNS_22WebKitEncodedFrameInfoEPNS_22RTPFragmentationHeaderEE
Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp 2020-11-03 12:33:03 UTC (rev 269293)
@@ -105,9 +105,8 @@
__ZNK6webrtc21IceCandidateInterface10server_urlEv
__ZN6webrtc20setApplicationStatusEb
__ZN6webrtc26createWebKitDecoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_12WebKitVP9VTBE
-__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9E
+__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_20WebKitH264LowLatencyE
__ZN6webrtc29setH264HardwareEncoderAllowedEb
-__ZN6webrtc31setH264LowLatencyEncoderEnabledEb
__ZN6webrtc24registerWebKitVP9DecoderEv
__ZN6webrtc20pixelBufferFromFrameERKNS_10VideoFrameERKNSt3__18functionIFP10__CVBuffermmNS_10BufferTypeEEEE
__ZN6webrtc18pixelBufferToFrameEP10__CVBuffer
@@ -242,7 +241,7 @@
__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
__ZN6webrtc19releaseLocalDecoderEPv
__ZN6webrtc11decodeFrameEPvjPKhm
-__ZN6webrtc18RemoteVideoDecoder14decodeCompleteEPvjP10__CVBufferj
+__ZN6webrtc24videoDecoderTaskCompleteEPvjP10__CVBufferj
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmEPFiS0_S0_E
__ZN6webrtc18RtpCodecCapabilityC1Ev
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmEPFiS0_S0_E
@@ -253,6 +252,7 @@
__ZN6webrtc22RTPFragmentationHeader6ResizeEm
__ZN6webrtc24setVideoEncoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_RKNS_10VideoCodecEEPFiS0_RKNS_10VideoFrameEbEPFiS0_S0_EPFvS0_RKNS_12VideoEncoder21RateControlParametersEE
__ZN6webrtc20setLocalEncoderRatesEPvjj
+__ZN6webrtc25setLocalEncoderLowLatencyEPvb
__ZN6webrtc22initializeLocalEncoderEPvttjjjj
__ZN6webrtc14SdpVideoFormatC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE
__ZN6webrtc18createLocalEncoderERKNS_14SdpVideoFormatEU13block_pointerFvPKhmRKNS_22WebKitEncodedFrameInfoEPNS_22RTPFragmentationHeaderEE
Modified: trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp 2020-11-03 12:33:03 UTC (rev 269293)
@@ -105,9 +105,8 @@
__ZNK6webrtc21IceCandidateInterface10server_urlEv
__ZN6webrtc20setApplicationStatusEb
__ZN6webrtc26createWebKitDecoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_12WebKitVP9VTBE
-__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9E
+__ZN6webrtc26createWebKitEncoderFactoryENS_10WebKitH265ENS_9WebKitVP9ENS_20WebKitH264LowLatencyE
__ZN6webrtc29setH264HardwareEncoderAllowedEb
-__ZN6webrtc31setH264LowLatencyEncoderEnabledEb
__ZN6webrtc24registerWebKitVP9DecoderEv
__ZN6webrtc20pixelBufferFromFrameERKNS_10VideoFrameERKNSt3__18functionIFP10__CVBuffermmNS_10BufferTypeEEEE
__ZN6webrtc18pixelBufferToFrameEP10__CVBuffer
@@ -242,7 +241,7 @@
__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
__ZN6webrtc19releaseLocalDecoderEPv
__ZN6webrtc11decodeFrameEPvjPKhm
-__ZN6webrtc18RemoteVideoDecoder14decodeCompleteEPvjP10__CVBufferj
+__ZN6webrtc24videoDecoderTaskCompleteEPvjP10__CVBufferj
__ZN6webrtc24setVideoDecoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_jPKhmEPFiS0_S0_E
__ZN6webrtc18RtpCodecCapabilityC1Ev
__ZN6webrtc22RTPFragmentationHeaderD1Ev
@@ -251,6 +250,7 @@
__ZN6webrtc22RTPFragmentationHeader6ResizeEm
__ZN6webrtc24setVideoEncoderCallbacksEPFPvRKNS_14SdpVideoFormatEEPFiS0_EPFiS0_RKNS_10VideoCodecEEPFiS0_RKNS_10VideoFrameEbEPFiS0_S0_EPFvS0_RKNS_12VideoEncoder21RateControlParametersEE
__ZN6webrtc20setLocalEncoderRatesEPvjj
+__ZN6webrtc25setLocalEncoderLowLatencyEPvb
__ZN6webrtc22initializeLocalEncoderEPvttjjjj
__ZN6webrtc14SdpVideoFormatC1ERKNSt3__112basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKNS1_3mapIS7_S7_NS1_4lessIS7_EENS5_INS1_4pairIS8_S7_EEEEEE
__ZN6webrtc18createLocalEncoderERKNS_14SdpVideoFormatEU13block_pointerFvPKhmRKNS_22WebKitEncodedFrameInfoEPNS_22RTPFragmentationHeaderEE
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -25,7 +25,7 @@
#pragma once
-#include "api/video_codecs/video_decoder.h"
+#include "WebKitUtilities.h"
#include "api/video_codecs/video_decoder_factory.h"
typedef struct __CVBuffer* CVPixelBufferRef;
@@ -33,6 +33,7 @@
namespace webrtc {
struct SdpVideoFormat;
+class VideoDecoderFactory;
using WebKitVideoDecoder = void*;
using VideoDecoderCreateCallback = WebKitVideoDecoder(*)(const SdpVideoFormat& format);
@@ -42,35 +43,10 @@
void setVideoDecoderCallbacks(VideoDecoderCreateCallback, VideoDecoderReleaseCallback, VideoDecoderDecodeCallback, VideoDecoderRegisterDecodeCompleteCallback);
-class RemoteVideoDecoderFactory final : public VideoDecoderFactory {
-public:
- explicit RemoteVideoDecoderFactory(std::unique_ptr<VideoDecoderFactory>&&);
- ~RemoteVideoDecoderFactory() = default;
+std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitH265, WebKitVP9, WebKitVP9VTB);
+void videoDecoderTaskComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef, uint32_t timeStampRTP);
-private:
- std::vector<SdpVideoFormat> GetSupportedFormats() const final;
- std::unique_ptr<VideoDecoder> CreateVideoDecoder(const SdpVideoFormat& format) final;
- std::unique_ptr<VideoDecoderFactory> m_internalFactory;
-};
-
-class RemoteVideoDecoder final : public webrtc::VideoDecoder {
-public:
- explicit RemoteVideoDecoder(WebKitVideoDecoder);
- ~RemoteVideoDecoder() = default;
-
- static void decodeComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef, uint32_t timeStampRTP);
-
-private:
- int32_t InitDecode(const VideoCodec*, int32_t number_of_cores) final;
- int32_t Decode(const EncodedImage&, bool missing_frames, int64_t render_time_ms) final;
- int32_t RegisterDecodeCompleteCallback(DecodedImageCallback*) final;
- int32_t Release() final;
- const char* ImplementationName() const final { return "RemoteVideoToolBox"; }
-
- WebKitVideoDecoder m_internalDecoder;
-};
-
using LocalDecoder = void*;
using LocalDecoderCallback = void (^)(CVPixelBufferRef, uint32_t timeStamp, uint32_t timeStampNs);
void* createLocalH264Decoder(LocalDecoderCallback);
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.mm (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.mm 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.mm 2020-11-03 12:33:03 UTC (rev 269293)
@@ -29,6 +29,10 @@
#import "Framework/Headers/WebRTC/RTCVideoFrameBuffer.h"
#import "Framework/Native/api/video_decoder_factory.h"
#import "WebKitUtilities.h"
+#import "api/video_codecs/video_decoder.h"
+#import "api/video_codecs/video_decoder_factory.h"
+#import "modules/video_coding/codecs/h264/include/h264.h"
+#import "modules/video_coding/include/video_error_codes.h"
#import "sdk/objc/components/video_codec/RTCVideoDecoderH264.h"
#import "sdk/objc/components/video_codec/RTCVideoDecoderH265.h"
@@ -83,6 +87,33 @@
namespace webrtc {
+class RemoteVideoDecoderFactory final : public VideoDecoderFactory {
+public:
+ explicit RemoteVideoDecoderFactory(std::unique_ptr<VideoDecoderFactory>&&);
+ ~RemoteVideoDecoderFactory() = default;
+
+private:
+ std::vector<SdpVideoFormat> GetSupportedFormats() const final;
+ std::unique_ptr<VideoDecoder> CreateVideoDecoder(const SdpVideoFormat& format) final;
+
+ std::unique_ptr<VideoDecoderFactory> m_internalFactory;
+};
+
+class RemoteVideoDecoder final : public webrtc::VideoDecoder {
+public:
+ explicit RemoteVideoDecoder(WebKitVideoDecoder);
+ ~RemoteVideoDecoder() = default;
+
+private:
+ int32_t InitDecode(const VideoCodec*, int32_t number_of_cores) final;
+ int32_t Decode(const EncodedImage&, bool missing_frames, int64_t render_time_ms) final;
+ int32_t RegisterDecodeCompleteCallback(DecodedImageCallback*) final;
+ int32_t Release() final;
+ const char* ImplementationName() const final { return "RemoteVideoToolBox"; }
+
+ WebKitVideoDecoder m_internalDecoder;
+};
+
struct VideoDecoderCallbacks {
VideoDecoderCreateCallback createCallback;
VideoDecoderReleaseCallback releaseCallback;
@@ -109,7 +140,7 @@
{
}
-void RemoteVideoDecoder::decodeComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef pixelBuffer, uint32_t timeStampRTP)
+void videoDecoderTaskComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef pixelBuffer, uint32_t timeStampRTP)
{
auto videoFrame = VideoFrame::Builder().set_video_frame_buffer(pixelBufferToFrame(pixelBuffer))
.set_timestamp_rtp(timeStampRTP)
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.h (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -25,10 +25,12 @@
#pragma once
+#include "WebKitUtilities.h"
#include "api/video_codecs/video_encoder.h"
#include "api/video_codecs/video_encoder_factory.h"
#include "api/video/encoded_image.h"
#include "modules/include/module_common_types.h"
+#include "modules/video_coding/include/video_error_codes.h"
using CVPixelBufferRef = struct __CVBuffer*;
@@ -40,23 +42,8 @@
struct SdpVideoFormat;
class Settings;
-class VideoEncoderFactoryWithSimulcast final : public VideoEncoderFactory {
-public:
- explicit VideoEncoderFactoryWithSimulcast(std::unique_ptr<VideoEncoderFactory>&& factory)
- : m_internalEncoderFactory(std::move(factory))
- {
- }
+std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitH265, WebKitVP9, WebKitH264LowLatency);
- VideoEncoderFactory::CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const final { return m_internalEncoderFactory->QueryVideoEncoder(format); }
-
- std::unique_ptr<VideoEncoder> CreateVideoEncoder(const SdpVideoFormat& format) final;
-
- std::vector<SdpVideoFormat> GetSupportedFormats() const final { return m_internalEncoderFactory->GetSupportedFormats(); }
-
-private:
- const std::unique_ptr<VideoEncoderFactory> m_internalEncoderFactory;
-};
-
using WebKitVideoEncoder = void*;
using VideoEncoderCreateCallback = WebKitVideoEncoder(*)(const SdpVideoFormat& format);
using VideoEncoderReleaseCallback = int32_t(*)(WebKitVideoEncoder);
@@ -124,6 +111,7 @@
void initializeLocalEncoder(LocalEncoder, uint16_t width, uint16_t height, unsigned int startBitrate, unsigned int maxBitrate, unsigned int minBitrate, uint32_t maxFramerate);
void encodeLocalEncoderFrame(LocalEncoder, CVPixelBufferRef, int64_t timeStamp, webrtc::VideoRotation, bool isKeyframeRequired);
void setLocalEncoderRates(LocalEncoder, uint32_t bitRate, uint32_t frameRate);
+void setLocalEncoderLowLatency(LocalEncoder, bool isLowLatencyEnabled);
template<class Decoder>
bool WebKitEncodedFrameInfo::decode(Decoder& decoder, WebKitEncodedFrameInfo& info)
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm 2020-11-03 12:33:03 UTC (rev 269293)
@@ -28,6 +28,7 @@
#include "WebKitUtilities.h"
#include "api/video/video_frame.h"
#include "components/video_codec/RTCCodecSpecificInfoH264+Private.h"
+#include "media/engine/encoder_simulcast_proxy.h"
#include "modules/video_coding/utility/simulcast_utility.h"
#include "sdk/objc/api/peerconnection/RTCEncodedImage+Private.h"
#include "sdk/objc/api/peerconnection/RTCRtpFragmentationHeader+Private.h"
@@ -46,6 +47,7 @@
- (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores;
- (NSInteger)encode:(RTCVideoFrame *)frame codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info frameTypes:(NSArray<NSNumber *> *)frameTypes;
- (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate;
+- (void)setLowLatency:(bool)lowLatencyEnabled;
@end
@implementation WK_RTCLocalVideoH264H265Encoder {
@@ -92,10 +94,30 @@
return [m_h264Encoder setBitrate:bitrateKbit framerate:framerate];
return [m_h265Encoder setBitrate:bitrateKbit framerate:framerate];
}
+- (void)setLowLatency:(bool)lowLatencyEnabled {
+ if (m_h264Encoder)
+ [m_h264Encoder setH264LowLatencyEncoderEnabled:lowLatencyEnabled];
+}
@end
+
namespace webrtc {
-std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitH265 supportsH265, WebKitVP9 supportsVP9)
+class VideoEncoderFactoryWithSimulcast final : public VideoEncoderFactory {
+public:
+ explicit VideoEncoderFactoryWithSimulcast(std::unique_ptr<VideoEncoderFactory>&& factory)
+ : m_internalEncoderFactory(std::move(factory))
+ {
+ }
+
+ VideoEncoderFactory::CodecInfo QueryVideoEncoder(const SdpVideoFormat& format) const final { return m_internalEncoderFactory->QueryVideoEncoder(format); }
+ std::unique_ptr<VideoEncoder> CreateVideoEncoder(const SdpVideoFormat& format) final;
+ std::vector<SdpVideoFormat> GetSupportedFormats() const final { return m_internalEncoderFactory->GetSupportedFormats(); }
+
+private:
+ const std::unique_ptr<VideoEncoderFactory> m_internalEncoderFactory;
+};
+
+std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitH265 supportsH265, WebKitVP9 supportsVP9, WebKitH264LowLatency useH264LowLatency)
{
#if ENABLE_VCP_ENCODER || ENABLE_VCP_VTB_ENCODER
static std::once_flag onceFlag;
@@ -104,7 +126,7 @@
});
#endif
- auto internalFactory = ObjCToNativeVideoEncoderFactory([[RTCDefaultVideoEncoderFactory alloc] initWithH265: supportsH265 == WebKitH265::On vp9:supportsVP9 == WebKitVP9::On]);
+ auto internalFactory = ObjCToNativeVideoEncoderFactory([[RTCDefaultVideoEncoderFactory alloc] initWithH265: supportsH265 == WebKitH265::On vp9:supportsVP9 == WebKitVP9::On lowLatencyH264:useH264LowLatency == WebKitH264LowLatency::On]);
return std::make_unique<VideoEncoderFactoryWithSimulcast>(std::move(internalFactory));
}
@@ -119,17 +141,6 @@
return h264HardwareEncoderAllowed;
}
-static bool h264LowLatencyEncoderEnabled = false;
-void setH264LowLatencyEncoderEnabled(bool enabled)
-{
- h264LowLatencyEncoderEnabled = enabled;
-}
-
-bool isH264LowLatencyEncoderEnabled()
-{
- return h264LowLatencyEncoderEnabled;
-}
-
std::unique_ptr<VideoEncoder> VideoEncoderFactoryWithSimulcast::CreateVideoEncoder(const SdpVideoFormat& format)
{
return std::make_unique<EncoderSimulcastProxy>(m_internalEncoderFactory.get(), format);
@@ -305,4 +316,10 @@
[encoder setBitrate:bitRate framerate:frameRate];
}
+void setLocalEncoderLowLatency(LocalEncoder localEncoder, bool isLowLatencyEnabled)
+{
+ auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
+ [encoder setLowLatency:isLowLatencyEnabled];
}
+
+}
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -27,34 +27,24 @@
#include "api/video/video_frame_buffer.h"
#include "api/scoped_refptr.h"
-#include "api/video_codecs/video_decoder_factory.h"
-#include "api/video_codecs/video_encoder_factory.h"
-#include "media/engine/encoder_simulcast_proxy.h"
+#include <functional>
using CVPixelBufferRef = struct __CVBuffer*;
-using CVPixelBufferPoolRef = struct __CVPixelBufferPool*;
namespace webrtc {
-class VideoDecoderFactory;
-class VideoEncoderFactory;
class VideoFrame;
enum class WebKitH265 { Off, On };
enum class WebKitVP9 { Off, On };
enum class WebKitVP9VTB { Off, On };
+enum class WebKitH264LowLatency { Off, On };
-std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitH265, WebKitVP9);
-std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitH265, WebKitVP9, WebKitVP9VTB);
-
void setApplicationStatus(bool isActive);
void setH264HardwareEncoderAllowed(bool);
bool isH264HardwareEncoderAllowed();
-void setH264LowLatencyEncoderEnabled(bool);
-bool isH264LowLatencyEncoderEnabled();
-
enum class BufferType { I420, I010 };
CVPixelBufferRef pixelBufferFromFrame(const VideoFrame&, const std::function<CVPixelBufferRef(size_t, size_t, BufferType)>&);
rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef);
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm 2020-11-03 12:33:03 UTC (rev 269293)
@@ -25,6 +25,7 @@
#include "WebKitUtilities.h"
+#include "api/video/video_frame.h"
#include "native/src/objc_frame_buffer.h"
#include "rtc_base/logging.h"
#include "third_party/libyuv/include/libyuv/convert_from.h"
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -22,7 +22,7 @@
__attribute__((objc_runtime_name("WK_RTCDefaultVideoEncoderFactory")))
@interface RTCDefaultVideoEncoderFactory : NSObject <RTCVideoEncoderFactory>
-- (id)initWithH265:(bool)supportH265 vp9:(bool)supportsVP9;
+- (id)initWithH265:(bool)supportH265 vp9:(bool)supportsVP9 lowLatencyH264:(bool)useLowLatencyH264;
+ (NSArray<RTCVideoCodecInfo *> *)supportedCodecs;
+ (NSArray<RTCVideoCodecInfo *> *)supportedCodecsWithH265:(bool)supportsH265 vp9:(bool)supportsVP9;
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m 2020-11-03 12:33:03 UTC (rev 269293)
@@ -26,14 +26,16 @@
@implementation RTCDefaultVideoEncoderFactory {
bool _supportsH265;
bool _supportsVP9;
+ bool _useLowLatencyH264;
}
-- (id)initWithH265:(bool)supportsH265 vp9:(bool)supportsVP9
+- (id)initWithH265:(bool)supportsH265 vp9:(bool)supportsVP9 lowLatencyH264:(bool)useLowLatencyH264
{
self = [super init];
if (self) {
_supportsH265 = supportsH265;
_supportsVP9 = supportsVP9;
+ _useLowLatencyH264 = useLowLatencyH264;
}
return self;
}
@@ -92,7 +94,9 @@
- (id<RTCVideoEncoder>)createEncoder:(RTCVideoCodecInfo *)info {
if ([info.name isEqualToString:kRTCVideoCodecH264Name]) {
- return [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
+ RTCVideoEncoderH264* encoder = [[RTCVideoEncoderH264 alloc] initWithCodecInfo:info];
+ [encoder setH264LowLatencyEncoderEnabled:_useLowLatencyH264];
+ return encoder;
} else if ([info.name isEqualToString:kRTCVideoCodecVp8Name]) {
return [RTCVideoEncoderVP8 vp8Encoder];
#if defined(RTC_ENABLE_VP9)
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -19,5 +19,5 @@
@interface RTCVideoEncoderH264 : NSObject <RTCVideoEncoder>
- (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo;
-
+- (void)setH264LowLatencyEncoderEnabled:(bool)enabled;
@end
Modified: trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm (269292 => 269293)
--- trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH264.mm 2020-11-03 12:33:03 UTC (rev 269293)
@@ -348,6 +348,7 @@
std::vector<uint8_t> _frameScaleBuffer;
bool _disableEncoding;
bool _isKeyFrameRequired;
+ bool _isH264LowLatencyEncoderEnabled;
}
// .5 is set as a mininum to prevent overcompensating for large temporary
@@ -375,10 +376,16 @@
RTC_CHECK([codecInfo.name isEqualToString:kRTCVideoCodecH264Name]);
}
_isKeyFrameRequired = false;
+ _isH264LowLatencyEncoderEnabled = true;
return self;
}
+- (void)setH264LowLatencyEncoderEnabled:(bool)enabled
+{
+ _isH264LowLatencyEncoderEnabled = enabled;
+}
+
- (void)dealloc {
[self destroyCompressionSession];
}
@@ -696,7 +703,7 @@
#endif
}
#elif HAVE_VTB_REQUIREDLOWLATENCY
- if (webrtc::isH264LowLatencyEncoderEnabled() && _useVCP)
+ if (_isH264LowLatencyEncoderEnabled && _useVCP)
CFDictionarySetValue(encoderSpecs, kVTVideoEncoderSpecification_RequiredLowLatency, kCFBooleanTrue);
#endif
Modified: trunk/Source/WebCore/ChangeLog (269292 => 269293)
--- trunk/Source/WebCore/ChangeLog 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebCore/ChangeLog 2020-11-03 12:33:03 UTC (rev 269293)
@@ -1,3 +1,16 @@
+2020-11-03 Youenn Fablet <[email protected]>
+
+ Allow low latency H264 encoder in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=218442
+
+ Reviewed by Eric Carlson.
+
+ Pass useLowLatency boolean when creating encoder factory.
+ Manually tested.
+
+ * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp:
+ (WebCore::LibWebRTCProviderCocoa::createEncoderFactory):
+
2020-11-02 Xabier Rodriguez Calvar <[email protected]>
[GStreamer] Fix GStreamerCommon.cpp debug category
Modified: trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp (269292 => 269293)
--- trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebCore/platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp 2020-11-03 12:33:03 UTC (rev 269293)
@@ -31,7 +31,8 @@
#include "RuntimeEnabledFeatures.h"
ALLOW_UNUSED_PARAMETERS_BEGIN
-#include <webrtc/sdk/WebKit/WebKitUtilities.h>
+#include <webrtc/sdk/WebKit/WebKitDecoder.h>
+#include <webrtc/sdk/WebKit/WebKitEncoder.h>
ALLOW_UNUSED_PARAMETERS_END
#include <webrtc/sdk/WebKit/WebKitVP9Decoder.h>
#include <wtf/MainThread.h>
@@ -73,8 +74,7 @@
if (!webRTCAvailable())
return nullptr;
- webrtc::setH264LowLatencyEncoderEnabled(RuntimeEnabledFeatures::sharedFeatures().webRTCH264LowLatencyEncoderEnabled());
- return webrtc::createWebKitEncoderFactory(isSupportingH265() ? webrtc::WebKitH265::On : webrtc::WebKitH265::Off, isSupportingVP9() ? webrtc::WebKitVP9::On : webrtc::WebKitVP9::Off);
+ return webrtc::createWebKitEncoderFactory(isSupportingH265() ? webrtc::WebKitH265::On : webrtc::WebKitH265::Off, isSupportingVP9() ? webrtc::WebKitVP9::On : webrtc::WebKitVP9::Off, RuntimeEnabledFeatures::sharedFeatures().webRTCH264LowLatencyEncoderEnabled() ? webrtc::WebKitH264LowLatency::On : webrtc::WebKitH264LowLatency::Off);
}
void LibWebRTCProviderCocoa::setActive(bool value)
Modified: trunk/Source/WebKit/ChangeLog (269292 => 269293)
--- trunk/Source/WebKit/ChangeLog 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebKit/ChangeLog 2020-11-03 12:33:03 UTC (rev 269293)
@@ -1,3 +1,20 @@
+2020-11-03 Youenn Fablet <[email protected]>
+
+ Allow low latency H264 encoder in GPUProcess
+ https://bugs.webkit.org/show_bug.cgi?id=218442
+
+ Reviewed by Eric Carlson.
+
+ Pass useLowLatency boolean from WebProcess to GPUProcess.
+
+ * GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
+ * GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in:
+ * GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:
+ (WebKit::LibWebRTCCodecsProxy::createEncoder):
+ * WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:
+ (WebKit::LibWebRTCCodecs::completedDecoding):
+ (WebKit::LibWebRTCCodecs::createEncoder):
+
2020-11-03 Chris Lord <[email protected]>
[GTK] Zooming causes page to scroll to top
Modified: trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h (269292 => 269293)
--- trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h 2020-11-03 12:33:03 UTC (rev 269293)
@@ -72,7 +72,7 @@
void releaseDecoder(RTCDecoderIdentifier);
void decodeFrame(RTCDecoderIdentifier, uint32_t timeStamp, const IPC::DataReference&);
- void createEncoder(RTCEncoderIdentifier, const String&, const Vector<std::pair<String, String>>&);
+ void createEncoder(RTCEncoderIdentifier, const String&, const Vector<std::pair<String, String>>&, bool useLowLatency);
void releaseEncoder(RTCEncoderIdentifier);
void initializeEncoder(RTCEncoderIdentifier, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate);
void encodeFrame(RTCEncoderIdentifier, WebCore::RemoteVideoSample&&, bool shouldEncodeAsKeyFrame);
Modified: trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in (269292 => 269293)
--- trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in 2020-11-03 12:33:03 UTC (rev 269293)
@@ -29,7 +29,7 @@
ReleaseDecoder(WebKit::RTCDecoderIdentifier id)
DecodeFrame(WebKit::RTCDecoderIdentifier id, uint32_t timeStamp, IPC::DataReference data)
- CreateEncoder(WebKit::RTCEncoderIdentifier id, String formatName, Vector<std::pair<String, String>> parameters);
+ CreateEncoder(WebKit::RTCEncoderIdentifier id, String formatName, Vector<std::pair<String, String>> parameters, bool useLowLatency);
ReleaseEncoder(WebKit::RTCEncoderIdentifier id)
InitializeEncoder(WebKit::RTCEncoderIdentifier id, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate)
EncodeFrame(WebKit::RTCEncoderIdentifier id, WebCore::RemoteVideoSample sample, bool shouldEncodeAsKeyFrame)
Modified: trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm (269292 => 269293)
--- trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm 2020-11-03 12:33:03 UTC (rev 269293)
@@ -106,7 +106,7 @@
m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::FailedDecoding { identifier }, 0);
}
-void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const String& formatName, const Vector<std::pair<String, String>>& parameters)
+void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const String& formatName, const Vector<std::pair<String, String>>& parameters, bool useLowLatency)
{
ASSERT(!m_encoders.contains(identifier));
@@ -113,11 +113,13 @@
std::map<std::string, std::string> rtcParameters;
for (auto& parameter : parameters)
rtcParameters.emplace(parameter.first.utf8().data(), parameter.second.utf8().data());
-
- m_encoders.add(identifier, webrtc::createLocalEncoder(webrtc::SdpVideoFormat { formatName.utf8().data(), rtcParameters }, ^(const uint8_t* buffer, size_t size, const webrtc::WebKitEncodedFrameInfo& info, webrtc::RTPFragmentationHeader* header) {
+
+ auto* encoder = webrtc::createLocalEncoder(webrtc::SdpVideoFormat { formatName.utf8().data(), rtcParameters }, ^(const uint8_t* buffer, size_t size, const webrtc::WebKitEncodedFrameInfo& info, webrtc::RTPFragmentationHeader* header) {
m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::CompletedEncoding { identifier, IPC::DataReference { buffer, size }, info, webrtc::WebKitRTPFragmentationHeader { header } }, 0);
- }));
+ });
+ webrtc::setLocalEncoderLowLatency(encoder, useLowLatency);
+ m_encoders.add(identifier, encoder);
}
void LibWebRTCCodecsProxy::releaseEncoder(RTCEncoderIdentifier identifier)
Modified: trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp (269292 => 269293)
--- trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2020-11-03 11:50:05 UTC (rev 269292)
+++ trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp 2020-11-03 12:33:03 UTC (rev 269293)
@@ -36,9 +36,9 @@
#include <WebCore/LibWebRTCMacros.h>
#include <WebCore/RealtimeVideoUtilities.h>
#include <WebCore/RemoteVideoSample.h>
+#include <WebCore/RuntimeEnabledFeatures.h>
#include <webrtc/sdk/WebKit/WebKitDecoder.h>
#include <webrtc/sdk/WebKit/WebKitEncoder.h>
-#include <webrtc/sdk/WebKit/WebKitUtilities.h>
#include <wtf/MainThread.h>
#include <pal/cf/CoreMediaSoftLink.h>
@@ -259,7 +259,7 @@
return;
}
- webrtc::RemoteVideoDecoder::decodeComplete(decoder->decodedImageCallback, timeStamp, pixelBuffer.get(), remoteSample.time().toDouble());
+ webrtc::videoDecoderTaskComplete(decoder->decodedImageCallback, timeStamp, pixelBuffer.get(), remoteSample.time().toDouble());
}
static inline String formatNameFromCodecType(LibWebRTCCodecs::Type type)
@@ -286,7 +286,7 @@
auto encoderIdentifier = encoder->identifier;
ASSERT(!m_encoders.contains(encoderIdentifier));
- WebProcess::singleton().ensureGPUProcessConnection().connection().send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoderIdentifier, formatNameFromCodecType(type), parameters }, 0);
+ WebProcess::singleton().ensureGPUProcessConnection().connection().send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoderIdentifier, formatNameFromCodecType(type), parameters, RuntimeEnabledFeatures::sharedFeatures().webRTCH264LowLatencyEncoderEnabled() }, 0);
m_encoders.add(encoderIdentifier, WTFMove(encoder));
});
return result;