haikuwebkit/LayoutTests/webrtc/h265.html

102 lines
3.8 KiB
HTML
Raw Permalink Normal View History

Add initial support for WebRTC HEVC https://bugs.webkit.org/show_bug.cgi?id=204283 Reviewed by Eric Carlson. Source/ThirdParty/libwebrtc: Add H265 packetization/depacketization and ObjC H265 encoder/decoder. Support is switchable using a boolean given to the decoder/encoder factories. * Source/webrtc/api/video/video_codec_type.h: * Source/webrtc/api/video_codecs/video_codec.cc: * Source/webrtc/api/video_codecs/video_codec.h: (webrtc::VideoCodecH265::operator!= const): * Source/webrtc/api/video_codecs/video_encoder.cc: * Source/webrtc/api/video_codecs/video_encoder.h: * Source/webrtc/api/video_codecs/video_encoder_config.cc: * Source/webrtc/api/video_codecs/video_encoder_config.h: * Source/webrtc/build_overrides/build.gni: * Source/webrtc/call/rtp_payload_params.cc: * Source/webrtc/common_video/BUILD.gn: * Source/webrtc/common_video/h265/h265_common.cc: Added. * Source/webrtc/common_video/h265/h265_common.h: Added. * Source/webrtc/common_video/h265/h265_pps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_pps_parser.h: Added. * Source/webrtc/common_video/h265/h265_sps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_sps_parser.h: Added. * Source/webrtc/common_video/h265/h265_vps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_vps_parser.h: Added. * Source/webrtc/media/base/media_constants.cc: * Source/webrtc/media/base/media_constants.h: * Source/webrtc/modules/rtp_rtcp/BUILD.gn: * Source/webrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc: * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.h: Added. (webrtc::H265SpsParser::width): (webrtc::H265SpsParser::height): * Source/webrtc/modules/rtp_rtcp/source/rtp_format.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.h: Added. (webrtc::RtpPacketizerH265::Packet::Packet): (webrtc::RtpPacketizerH265::PacketUnit::PacketUnit): (webrtc::VideoRtpDepacketizerH265::~VideoRtpDepacketizerH265): * Source/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_video_header.h: * Source/webrtc/modules/video_coding/BUILD.gn: * Source/webrtc/modules/video_coding/codecs/h265/include/h265_globals.h: Added. * Source/webrtc/modules/video_coding/encoded_frame.cc: * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.cc: Added. * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.h: Added. * Source/webrtc/modules/video_coding/include/video_codec_interface.h: * Source/webrtc/modules/video_coding/jitter_buffer_common.h: * Source/webrtc/modules/video_coding/packet.cc: * Source/webrtc/modules/video_coding/packet_buffer.cc: * Source/webrtc/modules/video_coding/session_info.cc: * Source/webrtc/modules/video_coding/session_info.h: * Source/webrtc/rtc_base/experiments/min_video_bitrate_experiment.cc: * Source/webrtc/sdk/WebKit/WebKitUtilities.h: * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: (webrtc::createWebKitEncoderFactory): (webrtc::createWebKitDecoderFactory): * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265+Private.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.h: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.mm: Added. (-[RTCCodecSpecificInfoH265 nativeCodecSpecificInfo]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m: (-[RTCDefaultVideoDecoderFactory initWithH265:]): (-[RTCDefaultVideoDecoderFactory supportedCodecs]): (-[RTCDefaultVideoDecoderFactory createDecoder:]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m: (-[RTCDefaultVideoEncoderFactory initWithH265:]): (+[RTCDefaultVideoEncoderFactory supportedCodecs]): (-[RTCDefaultVideoEncoderFactory createEncoder:]): (-[RTCDefaultVideoEncoderFactory supportedCodecs]): * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.mm: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm: Added. (RTCH265FrameDecodeParams::RTCH265FrameDecodeParams): (h265DecompressionOutputCallback): (-[RTCVideoDecoderH265 init]): (-[RTCVideoDecoderH265 dealloc]): (-[RTCVideoDecoderH265 startDecodeWithNumberOfCores:]): (-[RTCVideoDecoderH265 decode:missingFrames:codecSpecificInfo:renderTimeMs:]): (-[RTCVideoDecoderH265 setCallback:]): (-[RTCVideoDecoderH265 releaseDecoder]): (-[RTCVideoDecoderH265 resetDecompressionSession]): (-[RTCVideoDecoderH265 configureDecompressionSession]): (-[RTCVideoDecoderH265 destroyDecompressionSession]): (-[RTCVideoDecoderH265 setVideoFormat:]): (-[RTCVideoDecoderH265 implementationName]): * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.mm: Added. (-[RTCVideoEncoderH265 initWithCodecInfo:]): (-[RTCVideoEncoderH265 dealloc]): (-[RTCVideoEncoderH265 startEncodeWithSettings:numberOfCores:]): (-[RTCVideoEncoderH265 encode:codecSpecificInfo:frameTypes:]): (-[RTCVideoEncoderH265 setCallback:]): (-[RTCVideoEncoderH265 setBitrate:framerate:]): (-[RTCVideoEncoderH265 releaseEncoder]): (-[RTCVideoEncoderH265 resetCompressionSession]): (-[RTCVideoEncoderH265 configureCompressionSession]): (-[RTCVideoEncoderH265 destroyCompressionSession]): (-[RTCVideoEncoderH265 implementationName]): (-[RTCVideoEncoderH265 setBitrateBps:]): (-[RTCVideoEncoderH265 setEncoderBitrateBps:]): (-[RTCVideoEncoderH265 frameWasEncoded:flags:sampleBuffer:width:height:renderTimeMs:timestamp:rotation:]): (-[RTCVideoEncoderH265 scalingSettings]): * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.cc: * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.h: * Source/webrtc/sdk/objc/native/src/objc_video_decoder_factory.mm: (webrtc::ObjCVideoDecoderFactory::CreateVideoDecoder): * Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm: (webrtc::ObjCVideoEncoderFactory::CreateVideoEncoder): * Source/webrtc/video/rtp_video_stream_receiver.cc: * Source/webrtc/video/rtp_video_stream_receiver.h: * Source/webrtc/video/send_statistics_proxy.cc: * Source/webrtc/video/video_receive_stream.cc: * Source/webrtc/video/video_stream_encoder.cc: * libwebrtc.xcodeproj/project.pbxproj: Source/WebCore: Add a runtime flag for H265 in lieu of VP8 and pipe it to libwebrtc factories. Test: webrtc/h265.html * page/Page.cpp: (WebCore::m_deviceOrientationUpdateProvider): * page/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::webRTCH265CodecEnabled const): (WebCore::RuntimeEnabledFeatures::setWebRTCH265CodecEnabled): * platform/mediastream/libwebrtc/LibWebRTCProvider.h: * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp: (WebCore::LibWebRTCProviderCocoa::createDecoderFactory): (WebCore::LibWebRTCProviderCocoa::createEncoderFactory): * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Source/WebKit: Remove VP8 runtime flag and add a H365 runtime flag instead. * Shared/WebPreferences.yaml: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): LayoutTests: * TestExpectations: * webrtc/h265-expected.txt: Added. * webrtc/h265.html: Added. Canonical link: https://commits.webkit.org/222873@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259452 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-04-03 10:46:02 +00:00
<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>Testing muting video</title>
<script src="../resources/testharness.js"></script>
<script src="../resources/testharnessreport.js"></script>
</head>
<body>
<div>Video should be running, go to black and running.</div>
<div>Following, should be a snapshot of the video, a black frame and a snapshot of the video.</div>
<video id="video" autoplay playsInline width="320" height="240"></video>
<canvas id="canvas1" width="320" height="240"></canvas>
<canvas id="canvas2" width="320" height="240"></canvas>
<canvas id="canvas3" width="320" height="240"></canvas>
<script src ="routines.js"></script>
<script>
var hasH265 = false;
test(() => {
if (window.internals)
Add VP9 WebRTC codec runtime flag https://bugs.webkit.org/show_bug.cgi?id=213724 Reviewed by Eric Carlson. Source/ThirdParty/libwebrtc: Update WebKit binding code to switch on/off VP9 encoder/decoder. We still use vp9_noop for now, so encoder/decoder is not functional. * Configurations/libwebrtc.iOS.exp: * Configurations/libwebrtc.iOSsim.exp: * Configurations/libwebrtc.mac.exp: * Configurations/libwebrtc.xcconfig: * Configurations/libwebrtcpcrtc.xcconfig: * Source/webrtc/modules/video_coding/codecs/vp9/vp9_noop.cc: * Source/webrtc/sdk/WebKit/WebKitDecoder.mm: (webrtc::createWebKitDecoderFactory): * Source/webrtc/sdk/WebKit/WebKitEncoder.mm: (webrtc::createWebKitEncoderFactory): (webrtc::setH264HardwareEncoderAllowed): (webrtc::isH264HardwareEncoderAllowed): * Source/webrtc/sdk/WebKit/WebKitUtilities.h: * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: * Source/webrtc/sdk/objc/api/video_codec/RTCVideoDecoderVP9.h: * Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m: (-[RTCDefaultVideoDecoderFactory initWithH265:vp9:]): (-[RTCDefaultVideoDecoderFactory supportedCodecs]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m: (-[RTCDefaultVideoEncoderFactory initWithH265:vp9:]): (-[RTCDefaultVideoEncoderFactory supportedCodecs]): * libwebrtc.xcodeproj/project.pbxproj: Source/WebCore: Add binding code to switch on/off VP9 in WebRTC factories based on runtime flag. Test: webrtc/vp9.html * page/Page.cpp: (WebCore::m_shouldRelaxThirdPartyCookieBlocking): * page/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::webRTCVP9CodecEnabled const): (WebCore::RuntimeEnabledFeatures::setWebRTCVP9CodecEnabled): * platform/mediastream/libwebrtc/LibWebRTCProvider.h: * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp: (WebCore::LibWebRTCProviderCocoa::createDecoderFactory): (WebCore::LibWebRTCProviderCocoa::createEncoderFactory): * testing/Internals.cpp: (WebCore::Internals::setWebRTCH265Support): (WebCore::Internals::setWebRTCVP9Support): * testing/Internals.h: * testing/Internals.idl: Source/WebKit: * Shared/WebPreferences.yaml: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): LayoutTests: * webrtc/h265.html: * webrtc/vp9-expected.txt: Added. * webrtc/vp9.html: Added. Canonical link: https://commits.webkit.org/226582@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263734 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-30 07:19:59 +00:00
window.internals.setWebRTCH265Support(false);
Add initial support for WebRTC HEVC https://bugs.webkit.org/show_bug.cgi?id=204283 Reviewed by Eric Carlson. Source/ThirdParty/libwebrtc: Add H265 packetization/depacketization and ObjC H265 encoder/decoder. Support is switchable using a boolean given to the decoder/encoder factories. * Source/webrtc/api/video/video_codec_type.h: * Source/webrtc/api/video_codecs/video_codec.cc: * Source/webrtc/api/video_codecs/video_codec.h: (webrtc::VideoCodecH265::operator!= const): * Source/webrtc/api/video_codecs/video_encoder.cc: * Source/webrtc/api/video_codecs/video_encoder.h: * Source/webrtc/api/video_codecs/video_encoder_config.cc: * Source/webrtc/api/video_codecs/video_encoder_config.h: * Source/webrtc/build_overrides/build.gni: * Source/webrtc/call/rtp_payload_params.cc: * Source/webrtc/common_video/BUILD.gn: * Source/webrtc/common_video/h265/h265_common.cc: Added. * Source/webrtc/common_video/h265/h265_common.h: Added. * Source/webrtc/common_video/h265/h265_pps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_pps_parser.h: Added. * Source/webrtc/common_video/h265/h265_sps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_sps_parser.h: Added. * Source/webrtc/common_video/h265/h265_vps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_vps_parser.h: Added. * Source/webrtc/media/base/media_constants.cc: * Source/webrtc/media/base/media_constants.h: * Source/webrtc/modules/rtp_rtcp/BUILD.gn: * Source/webrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc: * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.h: Added. (webrtc::H265SpsParser::width): (webrtc::H265SpsParser::height): * Source/webrtc/modules/rtp_rtcp/source/rtp_format.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.h: Added. (webrtc::RtpPacketizerH265::Packet::Packet): (webrtc::RtpPacketizerH265::PacketUnit::PacketUnit): (webrtc::VideoRtpDepacketizerH265::~VideoRtpDepacketizerH265): * Source/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_video_header.h: * Source/webrtc/modules/video_coding/BUILD.gn: * Source/webrtc/modules/video_coding/codecs/h265/include/h265_globals.h: Added. * Source/webrtc/modules/video_coding/encoded_frame.cc: * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.cc: Added. * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.h: Added. * Source/webrtc/modules/video_coding/include/video_codec_interface.h: * Source/webrtc/modules/video_coding/jitter_buffer_common.h: * Source/webrtc/modules/video_coding/packet.cc: * Source/webrtc/modules/video_coding/packet_buffer.cc: * Source/webrtc/modules/video_coding/session_info.cc: * Source/webrtc/modules/video_coding/session_info.h: * Source/webrtc/rtc_base/experiments/min_video_bitrate_experiment.cc: * Source/webrtc/sdk/WebKit/WebKitUtilities.h: * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: (webrtc::createWebKitEncoderFactory): (webrtc::createWebKitDecoderFactory): * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265+Private.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.h: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.mm: Added. (-[RTCCodecSpecificInfoH265 nativeCodecSpecificInfo]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m: (-[RTCDefaultVideoDecoderFactory initWithH265:]): (-[RTCDefaultVideoDecoderFactory supportedCodecs]): (-[RTCDefaultVideoDecoderFactory createDecoder:]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m: (-[RTCDefaultVideoEncoderFactory initWithH265:]): (+[RTCDefaultVideoEncoderFactory supportedCodecs]): (-[RTCDefaultVideoEncoderFactory createEncoder:]): (-[RTCDefaultVideoEncoderFactory supportedCodecs]): * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.mm: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm: Added. (RTCH265FrameDecodeParams::RTCH265FrameDecodeParams): (h265DecompressionOutputCallback): (-[RTCVideoDecoderH265 init]): (-[RTCVideoDecoderH265 dealloc]): (-[RTCVideoDecoderH265 startDecodeWithNumberOfCores:]): (-[RTCVideoDecoderH265 decode:missingFrames:codecSpecificInfo:renderTimeMs:]): (-[RTCVideoDecoderH265 setCallback:]): (-[RTCVideoDecoderH265 releaseDecoder]): (-[RTCVideoDecoderH265 resetDecompressionSession]): (-[RTCVideoDecoderH265 configureDecompressionSession]): (-[RTCVideoDecoderH265 destroyDecompressionSession]): (-[RTCVideoDecoderH265 setVideoFormat:]): (-[RTCVideoDecoderH265 implementationName]): * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.mm: Added. (-[RTCVideoEncoderH265 initWithCodecInfo:]): (-[RTCVideoEncoderH265 dealloc]): (-[RTCVideoEncoderH265 startEncodeWithSettings:numberOfCores:]): (-[RTCVideoEncoderH265 encode:codecSpecificInfo:frameTypes:]): (-[RTCVideoEncoderH265 setCallback:]): (-[RTCVideoEncoderH265 setBitrate:framerate:]): (-[RTCVideoEncoderH265 releaseEncoder]): (-[RTCVideoEncoderH265 resetCompressionSession]): (-[RTCVideoEncoderH265 configureCompressionSession]): (-[RTCVideoEncoderH265 destroyCompressionSession]): (-[RTCVideoEncoderH265 implementationName]): (-[RTCVideoEncoderH265 setBitrateBps:]): (-[RTCVideoEncoderH265 setEncoderBitrateBps:]): (-[RTCVideoEncoderH265 frameWasEncoded:flags:sampleBuffer:width:height:renderTimeMs:timestamp:rotation:]): (-[RTCVideoEncoderH265 scalingSettings]): * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.cc: * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.h: * Source/webrtc/sdk/objc/native/src/objc_video_decoder_factory.mm: (webrtc::ObjCVideoDecoderFactory::CreateVideoDecoder): * Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm: (webrtc::ObjCVideoEncoderFactory::CreateVideoEncoder): * Source/webrtc/video/rtp_video_stream_receiver.cc: * Source/webrtc/video/rtp_video_stream_receiver.h: * Source/webrtc/video/send_statistics_proxy.cc: * Source/webrtc/video/video_receive_stream.cc: * Source/webrtc/video/video_stream_encoder.cc: * libwebrtc.xcodeproj/project.pbxproj: Source/WebCore: Add a runtime flag for H265 in lieu of VP8 and pipe it to libwebrtc factories. Test: webrtc/h265.html * page/Page.cpp: (WebCore::m_deviceOrientationUpdateProvider): * page/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::webRTCH265CodecEnabled const): (WebCore::RuntimeEnabledFeatures::setWebRTCH265CodecEnabled): * platform/mediastream/libwebrtc/LibWebRTCProvider.h: * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp: (WebCore::LibWebRTCProviderCocoa::createDecoderFactory): (WebCore::LibWebRTCProviderCocoa::createEncoderFactory): * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Source/WebKit: Remove VP8 runtime flag and add a H365 runtime flag instead. * Shared/WebPreferences.yaml: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): LayoutTests: * TestExpectations: * webrtc/h265-expected.txt: Added. * webrtc/h265.html: Added. Canonical link: https://commits.webkit.org/222873@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259452 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-04-03 10:46:02 +00:00
Add VP9 WebRTC codec runtime flag https://bugs.webkit.org/show_bug.cgi?id=213724 Reviewed by Eric Carlson. Source/ThirdParty/libwebrtc: Update WebKit binding code to switch on/off VP9 encoder/decoder. We still use vp9_noop for now, so encoder/decoder is not functional. * Configurations/libwebrtc.iOS.exp: * Configurations/libwebrtc.iOSsim.exp: * Configurations/libwebrtc.mac.exp: * Configurations/libwebrtc.xcconfig: * Configurations/libwebrtcpcrtc.xcconfig: * Source/webrtc/modules/video_coding/codecs/vp9/vp9_noop.cc: * Source/webrtc/sdk/WebKit/WebKitDecoder.mm: (webrtc::createWebKitDecoderFactory): * Source/webrtc/sdk/WebKit/WebKitEncoder.mm: (webrtc::createWebKitEncoderFactory): (webrtc::setH264HardwareEncoderAllowed): (webrtc::isH264HardwareEncoderAllowed): * Source/webrtc/sdk/WebKit/WebKitUtilities.h: * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: * Source/webrtc/sdk/objc/api/video_codec/RTCVideoDecoderVP9.h: * Source/webrtc/sdk/objc/api/video_codec/RTCVideoEncoderVP9.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m: (-[RTCDefaultVideoDecoderFactory initWithH265:vp9:]): (-[RTCDefaultVideoDecoderFactory supportedCodecs]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m: (-[RTCDefaultVideoEncoderFactory initWithH265:vp9:]): (-[RTCDefaultVideoEncoderFactory supportedCodecs]): * libwebrtc.xcodeproj/project.pbxproj: Source/WebCore: Add binding code to switch on/off VP9 in WebRTC factories based on runtime flag. Test: webrtc/vp9.html * page/Page.cpp: (WebCore::m_shouldRelaxThirdPartyCookieBlocking): * page/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::webRTCVP9CodecEnabled const): (WebCore::RuntimeEnabledFeatures::setWebRTCVP9CodecEnabled): * platform/mediastream/libwebrtc/LibWebRTCProvider.h: * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp: (WebCore::LibWebRTCProviderCocoa::createDecoderFactory): (WebCore::LibWebRTCProviderCocoa::createEncoderFactory): * testing/Internals.cpp: (WebCore::Internals::setWebRTCH265Support): (WebCore::Internals::setWebRTCVP9Support): * testing/Internals.h: * testing/Internals.idl: Source/WebKit: * Shared/WebPreferences.yaml: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): LayoutTests: * webrtc/h265.html: * webrtc/vp9-expected.txt: Added. * webrtc/vp9.html: Added. Canonical link: https://commits.webkit.org/226582@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@263734 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-06-30 07:19:59 +00:00
let codecs = RTCRtpSender.getCapabilities("video").codecs;
hasH265 = codecs.some((codec) => { return codec.mimeType == "video/H265"; });
assert_false(hasH265);
if (window.internals)
window.internals.setWebRTCH265Support(true);
codecs = RTCRtpSender.getCapabilities("video").codecs;
Add initial support for WebRTC HEVC https://bugs.webkit.org/show_bug.cgi?id=204283 Reviewed by Eric Carlson. Source/ThirdParty/libwebrtc: Add H265 packetization/depacketization and ObjC H265 encoder/decoder. Support is switchable using a boolean given to the decoder/encoder factories. * Source/webrtc/api/video/video_codec_type.h: * Source/webrtc/api/video_codecs/video_codec.cc: * Source/webrtc/api/video_codecs/video_codec.h: (webrtc::VideoCodecH265::operator!= const): * Source/webrtc/api/video_codecs/video_encoder.cc: * Source/webrtc/api/video_codecs/video_encoder.h: * Source/webrtc/api/video_codecs/video_encoder_config.cc: * Source/webrtc/api/video_codecs/video_encoder_config.h: * Source/webrtc/build_overrides/build.gni: * Source/webrtc/call/rtp_payload_params.cc: * Source/webrtc/common_video/BUILD.gn: * Source/webrtc/common_video/h265/h265_common.cc: Added. * Source/webrtc/common_video/h265/h265_common.h: Added. * Source/webrtc/common_video/h265/h265_pps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_pps_parser.h: Added. * Source/webrtc/common_video/h265/h265_sps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_sps_parser.h: Added. * Source/webrtc/common_video/h265/h265_vps_parser.cc: Added. * Source/webrtc/common_video/h265/h265_vps_parser.h: Added. * Source/webrtc/media/base/media_constants.cc: * Source/webrtc/media/base/media_constants.h: * Source/webrtc/modules/rtp_rtcp/BUILD.gn: * Source/webrtc/modules/rtp_rtcp/source/create_video_rtp_depacketizer.cc: * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/h265_sps_parser.h: Added. (webrtc::H265SpsParser::width): (webrtc::H265SpsParser::height): * Source/webrtc/modules/rtp_rtcp/source/rtp_format.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.cc: Added. * Source/webrtc/modules/rtp_rtcp/source/rtp_format_h265.h: Added. (webrtc::RtpPacketizerH265::Packet::Packet): (webrtc::RtpPacketizerH265::PacketUnit::PacketUnit): (webrtc::VideoRtpDepacketizerH265::~VideoRtpDepacketizerH265): * Source/webrtc/modules/rtp_rtcp/source/rtp_sender_video.cc: * Source/webrtc/modules/rtp_rtcp/source/rtp_video_header.h: * Source/webrtc/modules/video_coding/BUILD.gn: * Source/webrtc/modules/video_coding/codecs/h265/include/h265_globals.h: Added. * Source/webrtc/modules/video_coding/encoded_frame.cc: * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.cc: Added. * Source/webrtc/modules/video_coding/h265_vps_sps_pps_tracker.h: Added. * Source/webrtc/modules/video_coding/include/video_codec_interface.h: * Source/webrtc/modules/video_coding/jitter_buffer_common.h: * Source/webrtc/modules/video_coding/packet.cc: * Source/webrtc/modules/video_coding/packet_buffer.cc: * Source/webrtc/modules/video_coding/session_info.cc: * Source/webrtc/modules/video_coding/session_info.h: * Source/webrtc/rtc_base/experiments/min_video_bitrate_experiment.cc: * Source/webrtc/sdk/WebKit/WebKitUtilities.h: * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: (webrtc::createWebKitEncoderFactory): (webrtc::createWebKitDecoderFactory): * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265+Private.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.h: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCCodecSpecificInfoH265.mm: Added. (-[RTCCodecSpecificInfoH265 nativeCodecSpecificInfo]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.m: (-[RTCDefaultVideoDecoderFactory initWithH265:]): (-[RTCDefaultVideoDecoderFactory supportedCodecs]): (-[RTCDefaultVideoDecoderFactory createDecoder:]): * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.h: * Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoEncoderFactory.m: (-[RTCDefaultVideoEncoderFactory initWithH265:]): (+[RTCDefaultVideoEncoderFactory supportedCodecs]): (-[RTCDefaultVideoEncoderFactory createEncoder:]): (-[RTCDefaultVideoEncoderFactory supportedCodecs]): * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCH265ProfileLevelId.mm: Added. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm: Added. (RTCH265FrameDecodeParams::RTCH265FrameDecodeParams): (h265DecompressionOutputCallback): (-[RTCVideoDecoderH265 init]): (-[RTCVideoDecoderH265 dealloc]): (-[RTCVideoDecoderH265 startDecodeWithNumberOfCores:]): (-[RTCVideoDecoderH265 decode:missingFrames:codecSpecificInfo:renderTimeMs:]): (-[RTCVideoDecoderH265 setCallback:]): (-[RTCVideoDecoderH265 releaseDecoder]): (-[RTCVideoDecoderH265 resetDecompressionSession]): (-[RTCVideoDecoderH265 configureDecompressionSession]): (-[RTCVideoDecoderH265 destroyDecompressionSession]): (-[RTCVideoDecoderH265 setVideoFormat:]): (-[RTCVideoDecoderH265 implementationName]): * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCDefaultVideoDecoderFactory.h. * Source/webrtc/sdk/objc/components/video_codec/RTCVideoEncoderH265.mm: Added. (-[RTCVideoEncoderH265 initWithCodecInfo:]): (-[RTCVideoEncoderH265 dealloc]): (-[RTCVideoEncoderH265 startEncodeWithSettings:numberOfCores:]): (-[RTCVideoEncoderH265 encode:codecSpecificInfo:frameTypes:]): (-[RTCVideoEncoderH265 setCallback:]): (-[RTCVideoEncoderH265 setBitrate:framerate:]): (-[RTCVideoEncoderH265 releaseEncoder]): (-[RTCVideoEncoderH265 resetCompressionSession]): (-[RTCVideoEncoderH265 configureCompressionSession]): (-[RTCVideoEncoderH265 destroyCompressionSession]): (-[RTCVideoEncoderH265 implementationName]): (-[RTCVideoEncoderH265 setBitrateBps:]): (-[RTCVideoEncoderH265 setEncoderBitrateBps:]): (-[RTCVideoEncoderH265 frameWasEncoded:flags:sampleBuffer:width:height:renderTimeMs:timestamp:rotation:]): (-[RTCVideoEncoderH265 scalingSettings]): * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.cc: * Source/webrtc/sdk/objc/components/video_codec/nalu_rewriter.h: * Source/webrtc/sdk/objc/native/src/objc_video_decoder_factory.mm: (webrtc::ObjCVideoDecoderFactory::CreateVideoDecoder): * Source/webrtc/sdk/objc/native/src/objc_video_encoder_factory.mm: (webrtc::ObjCVideoEncoderFactory::CreateVideoEncoder): * Source/webrtc/video/rtp_video_stream_receiver.cc: * Source/webrtc/video/rtp_video_stream_receiver.h: * Source/webrtc/video/send_statistics_proxy.cc: * Source/webrtc/video/video_receive_stream.cc: * Source/webrtc/video/video_stream_encoder.cc: * libwebrtc.xcodeproj/project.pbxproj: Source/WebCore: Add a runtime flag for H265 in lieu of VP8 and pipe it to libwebrtc factories. Test: webrtc/h265.html * page/Page.cpp: (WebCore::m_deviceOrientationUpdateProvider): * page/RuntimeEnabledFeatures.h: (WebCore::RuntimeEnabledFeatures::webRTCH265CodecEnabled const): (WebCore::RuntimeEnabledFeatures::setWebRTCH265CodecEnabled): * platform/mediastream/libwebrtc/LibWebRTCProvider.h: * platform/mediastream/libwebrtc/LibWebRTCProviderCocoa.cpp: (WebCore::LibWebRTCProviderCocoa::createDecoderFactory): (WebCore::LibWebRTCProviderCocoa::createEncoderFactory): * testing/Internals.cpp: (WebCore::Internals::resetToConsistentState): Source/WebKit: Remove VP8 runtime flag and add a H365 runtime flag instead. * Shared/WebPreferences.yaml: * WebProcess/WebPage/WebPage.cpp: (WebKit::WebPage::updatePreferences): LayoutTests: * TestExpectations: * webrtc/h265-expected.txt: Added. * webrtc/h265.html: Added. Canonical link: https://commits.webkit.org/222873@main git-svn-id: https://svn.webkit.org/repository/webkit/trunk@259452 268f45cc-cd09-0410-ab3c-d52691b4dbfc
2020-04-03 10:46:02 +00:00
hasH265 = codecs.some((codec) => { return codec.mimeType == "video/H265"; });
assert_true(hasH265);
}, "H265 in getCapabilities");
if (hasH265) {
promise_test(async (test) => {
const pc = new RTCPeerConnection();
pc.addTransceiver("video");
const description = await pc.createOffer();
pc.close();
assert_true(description.sdp.indexOf("H265") !== -1, "H265 codec is in the SDP");
}, "Verify H265 activation")
var track;
var remoteTrack;
var receivingConnection;
promise_test((test) => {
return navigator.mediaDevices.getUserMedia({video: {width: 320, height: 240, facingMode: "environment"}}).then((localStream) => {
return new Promise((resolve, reject) => {
track = localStream.getVideoTracks()[0];
createConnections((firstConnection) => {
firstConnection.addTrack(track, localStream);
}, (secondConnection) => {
receivingConnection = secondConnection;
secondConnection.ontrack = (trackEvent) => {
remoteTrack = trackEvent.track;
resolve(trackEvent.streams[0]);
};
}, { observeOffer : (offer) => {
offer.sdp = setCodec(offer.sdp, "H265");
return offer;
}
});
setTimeout(() => reject("Test timed out"), 5000);
});
}).then((remoteStream) => {
video.srcObject = remoteStream;
return video.play();
});
}, "Setting video exchange");
promise_test(() => {
if (receivingConnection.connectionState === "connected")
return Promise.resolve();
return new Promise((resolve, reject) => {
receivingConnection.onconnectionstatechange = () => {
if (receivingConnection.connectionState === "connected")
resolve();
};
setTimeout(() => reject("Test timed out"), 5000);
});
}, "Ensuring connection state is connected");
promise_test((test) => {
return checkVideoBlack(false, canvas1, video);
}, "Track is enabled, video should not be black");
promise_test((test) => {
track.enabled = false;
return checkVideoBlack(true, canvas2, video);
}, "Track is disabled, video should be black");
promise_test((test) => {
track.enabled = true;
return checkVideoBlack(false, canvas2, video);
}, "Track is enabled, video should not be black 2");
}
</script>
</body>
</html>