Changeset 259568 in webkit
- Timestamp:
- Apr 6, 2020, 2:57:27 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 1 added
- 16 edited
- 1 copied
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/ThirdParty/libwebrtc/ChangeLog
r259466 r259568 1 2020-04-06 youenn fablet <youenn@apple.com> 2 3 Add HEVC support in GPU Process for WebRTC 4 https://bugs.webkit.org/show_bug.cgi?id=209857 5 6 Reviewed by Eric Carlson. 7 8 * Configurations/libwebrtc.iOS.exp: 9 * Configurations/libwebrtc.iOSsim.exp: 10 * Configurations/libwebrtc.mac.exp: 11 * Source/webrtc/sdk/WebKit/WebKitDecoder.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h. 12 * Source/webrtc/sdk/WebKit/WebKitDecoder.mm: Added. 13 (-[WK_RTCLocalVideoH264H265Decoder initH264DecoderWithCallback:]): 14 (-[WK_RTCLocalVideoH264H265Decoder initH265DecoderWithCallback:]): 15 (-[WK_RTCLocalVideoH264H265Decoder decodeData:size:timeStamp:]): 16 (-[WK_RTCLocalVideoH264H265Decoder releaseDecoder]): 17 (webrtc::videoDecoderCallbacks): 18 (webrtc::setVideoDecoderCallbacks): 19 (webrtc::RemoteVideoDecoder::RemoteVideoDecoder): 20 (webrtc::RemoteVideoDecoder::decodeComplete): 21 (webrtc::RemoteVideoDecoder::InitDecode): 22 (webrtc::RemoteVideoDecoder::Decode): 23 (webrtc::RemoteVideoDecoder::RegisterDecodeCompleteCallback): 24 (webrtc::RemoteVideoDecoder::Release): 25 (webrtc::RemoteVideoDecoderFactory::RemoteVideoDecoderFactory): 26 (webrtc::RemoteVideoDecoderFactory::GetSupportedFormats const): 27 (webrtc::RemoteVideoDecoderFactory::CreateVideoDecoder): 28 (webrtc::createWebKitDecoderFactory): 29 (webrtc::createLocalH264Decoder): 30 (webrtc::createLocalH265Decoder): 31 (webrtc::releaseLocalDecoder): 32 (webrtc::decodeFrame): 33 * Source/webrtc/sdk/WebKit/WebKitEncoder.mm: 34 (-[WK_RTCLocalVideoH264H265Encoder initWithCodecInfo:]): 35 (-[WK_RTCLocalVideoH264H265Encoder setCallback:]): 36 (-[WK_RTCLocalVideoH264H265Encoder releaseEncoder]): 37 (-[WK_RTCLocalVideoH264H265Encoder startEncodeWithSettings:numberOfCores:]): 38 (-[WK_RTCLocalVideoH264H265Encoder encode:codecSpecificInfo:frameTypes:]): 39 (-[WK_RTCLocalVideoH264H265Encoder setBitrate:framerate:]): 40 (webrtc::createLocalEncoder): 41 (webrtc::releaseLocalEncoder): 42 (webrtc::initializeLocalEncoder): 43 (webrtc::encodeLocalEncoderFrame): 44 (webrtc::setLocalEncoderRates): 45 * Source/webrtc/sdk/WebKit/WebKitUtilities.h: 46 (): Deleted. 47 * Source/webrtc/sdk/WebKit/WebKitUtilities.mm: 48 (webrtc::videoDecoderCallbacks): Deleted. 49 (webrtc::setVideoDecoderCallbacks): Deleted. 50 (webrtc::RemoteVideoDecoder::RemoteVideoDecoder): Deleted. 51 (webrtc::RemoteVideoDecoder::decodeComplete): Deleted. 52 (webrtc::RemoteVideoDecoder::InitDecode): Deleted. 53 (webrtc::RemoteVideoDecoder::Decode): Deleted. 54 (webrtc::RemoteVideoDecoder::RegisterDecodeCompleteCallback): Deleted. 55 (webrtc::RemoteVideoDecoder::Release): Deleted. 56 (webrtc::RemoteVideoDecoderFactory::RemoteVideoDecoderFactory): Deleted. 57 (webrtc::RemoteVideoDecoderFactory::GetSupportedFormats const): Deleted. 58 (webrtc::RemoteVideoDecoderFactory::CreateVideoDecoder): Deleted. 59 (webrtc::createWebKitDecoderFactory): Deleted. 60 (webrtc::createLocalDecoder): Deleted. 61 (webrtc::releaseLocalDecoder): Deleted. 62 (webrtc::decodeFrame): Deleted. 63 * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h: 64 * Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm: 65 (-[RTCVideoDecoderH265 decode:missingFrames:codecSpecificInfo:renderTimeMs:]): 66 (-[RTCVideoDecoderH265 decodeData:size:timeStamp:]): 67 * libwebrtc.xcodeproj/project.pbxproj: 68 1 69 2020-04-03 David Kilzer <ddkilzer@apple.com> 2 70 -
trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp
r259345 r259568 234 234 __ZNK6webrtc20RtpReceiverInterface14dtls_transportEv 235 235 __ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv 236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE 236 __ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE 237 __ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE 237 238 __ZN6webrtc19releaseLocalDecoderEPv 238 239 __ZN6webrtc11decodeFrameEPvjPKhm -
trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp
r259345 r259568 234 234 __ZNK6webrtc20RtpReceiverInterface14dtls_transportEv 235 235 __ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv 236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE 236 __ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE 237 __ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE 237 238 __ZN6webrtc19releaseLocalDecoderEPv 238 239 __ZN6webrtc11decodeFrameEPvjPKhm -
trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp
r259345 r259568 234 234 __ZNK6webrtc20RtpReceiverInterface14dtls_transportEv 235 235 __ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv 236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE 236 __ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE 237 __ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE 237 238 __ZN6webrtc19releaseLocalDecoderEPv 238 239 __ZN6webrtc11decodeFrameEPvjPKhm -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h
r259567 r259568 1 1 /* 2 * Copyright (C) 20 18Apple Inc. All rights reserved.2 * Copyright (C) 2020 Apple Inc. All rights reserved. 3 3 * 4 4 * Redistribution and use in source and binary forms, with or without … … 26 26 #pragma once 27 27 28 #include "api/video/video_frame_buffer.h" 29 #include "api/scoped_refptr.h" 28 #include "api/video_codecs/video_decoder.h" 30 29 #include "api/video_codecs/video_decoder_factory.h" 31 #include "api/video_codecs/video_encoder_factory.h"32 #include "media/engine/encoder_simulcast_proxy.h"33 30 34 31 typedef struct __CVBuffer* CVPixelBufferRef; … … 36 33 namespace webrtc { 37 34 38 class VideoDecoderFactory; 39 class VideoEncoderFactory; 40 class VideoFrame; 41 42 enum class WebKitCodecSupport { H264VP8AndH265, H264AndVP8 }; 43 44 std::unique_ptr<webrtc::VideoEncoderFactory> createWebKitEncoderFactory(WebKitCodecSupport); 45 std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitCodecSupport); 46 47 void setApplicationStatus(bool isActive); 48 49 void setH264HardwareEncoderAllowed(bool); 50 bool isH264HardwareEncoderAllowed(); 51 52 CVPixelBufferRef pixelBufferFromFrame(const VideoFrame&, const std::function<CVPixelBufferRef(size_t, size_t)>&); 53 rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef); 35 struct SdpVideoFormat; 54 36 55 37 using WebKitVideoDecoder = void*; … … 92 74 using LocalDecoder = void*; 93 75 using LocalDecoderCallback = void (^)(CVPixelBufferRef, uint32_t timeStamp, uint32_t timeStampNs); 94 void* createLocalDecoder(LocalDecoderCallback); 76 void* createLocalH264Decoder(LocalDecoderCallback); 77 void* createLocalH265Decoder(LocalDecoderCallback); 95 78 void releaseLocalDecoder(LocalDecoder); 96 79 int32_t decodeFrame(LocalDecoder, uint32_t timeStamp, const uint8_t*, size_t); -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm
r254050 r259568 35 35 #include "sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h" 36 36 #include "sdk/objc/components/video_codec/RTCVideoEncoderH264.h" 37 #include "sdk/objc/components/video_codec/RTCVideoEncoderH265.h" 37 38 #include "sdk/objc/native/src/objc_frame_buffer.h" 38 39 40 41 @interface WK_RTCLocalVideoH264H265Encoder : NSObject 42 - (instancetype)initWithCodecInfo:(RTCVideoCodecInfo*)codecInfo; 43 - (void)setCallback:(RTCVideoEncoderCallback)callback; 44 - (NSInteger)releaseEncoder; 45 - (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores; 46 - (NSInteger)encode:(RTCVideoFrame *)frame codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info frameTypes:(NSArray<NSNumber *> *)frameTypes; 47 - (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate; 48 @end 49 50 @implementation WK_RTCLocalVideoH264H265Encoder { 51 RTCVideoEncoderH264 *m_h264Encoder; 52 RTCVideoEncoderH265 *m_h265Encoder; 53 } 54 55 - (instancetype)initWithCodecInfo:(RTCVideoCodecInfo*)codecInfo { 56 if (self = [super init]) { 57 if ([codecInfo.name isEqualToString:@"H265"]) 58 m_h265Encoder = [[RTCVideoEncoderH265 alloc] init]; 59 else 60 m_h264Encoder = [[RTCVideoEncoderH264 alloc] init]; 61 } 62 return self; 63 } 64 65 - (void)setCallback:(RTCVideoEncoderCallback)callback { 66 if (m_h264Encoder) 67 return [m_h264Encoder setCallback:callback]; 68 return [m_h265Encoder setCallback:callback]; 69 } 70 71 - (NSInteger)releaseEncoder { 72 if (m_h264Encoder) 73 return [m_h264Encoder releaseEncoder]; 74 return [m_h265Encoder releaseEncoder]; 75 } 76 77 - (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings numberOfCores:(int)numberOfCores { 78 if (m_h264Encoder) 79 return [m_h264Encoder startEncodeWithSettings:settings numberOfCores:numberOfCores]; 80 return [m_h265Encoder startEncodeWithSettings:settings numberOfCores:numberOfCores]; 81 } 82 83 - (NSInteger)encode:(RTCVideoFrame *)frame codecSpecificInfo:(nullable id<RTCCodecSpecificInfo>)info frameTypes:(NSArray<NSNumber *> *)frameTypes { 84 if (m_h264Encoder) 85 return [m_h264Encoder encode:frame codecSpecificInfo:info frameTypes:frameTypes]; 86 return [m_h265Encoder encode:frame codecSpecificInfo:info frameTypes:frameTypes]; 87 } 88 89 - (int)setBitrate:(uint32_t)bitrateKbit framerate:(uint32_t)framerate { 90 if (m_h264Encoder) 91 return [m_h264Encoder setBitrate:bitrateKbit framerate:framerate]; 92 return [m_h265Encoder setBitrate:bitrateKbit framerate:framerate]; 93 } 94 @end 39 95 namespace webrtc { 40 96 … … 151 207 { 152 208 auto *codecInfo = [[RTCVideoCodecInfo alloc] initWithNativeSdpVideoFormat: format]; 153 auto *encoder = [[ RTCVideoEncoderH264alloc] initWithCodecInfo:codecInfo];154 209 auto *encoder = [[WK_RTCLocalVideoH264H265Encoder alloc] initWithCodecInfo:codecInfo]; 210 155 211 [encoder setCallback:^BOOL(RTCEncodedImage *_Nonnull frame, id<RTCCodecSpecificInfo> _Nonnull codecSpecificInfo, RTCRtpFragmentationHeader *_Nonnull header) { 156 212 EncodedImage encodedImage = [frame nativeEncodedImage]; … … 179 235 void releaseLocalEncoder(LocalEncoder localEncoder) 180 236 { 181 auto *encoder = (__bridge_transfer RTCVideoEncoderH264*)(localEncoder);237 auto *encoder = (__bridge_transfer WK_RTCLocalVideoH264H265Encoder *)(localEncoder); 182 238 [encoder releaseEncoder]; 183 239 } … … 193 249 codecSettings.maxFramerate = maxFramerate; 194 250 195 auto *encoder = (__bridge RTCVideoEncoderH264*)(localEncoder);251 auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder); 196 252 [encoder startEncodeWithSettings:[[RTCVideoEncoderSettings alloc] initWithNativeVideoCodec:&codecSettings] numberOfCores:1]; 197 253 } … … 204 260 205 261 auto *videoFrame = [[RTCVideoFrame alloc] initWithBuffer:ToObjCVideoFrameBuffer(pixelBufferToFrame(pixelBuffer)) rotation:RTCVideoRotation(rotation) timeStampNs:timeStamp]; 206 auto *encoder = (__bridge RTCVideoEncoderH264*)(localEncoder);262 auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder); 207 263 [encoder encode:videoFrame codecSpecificInfo:nil frameTypes:rtcFrameTypes]; 208 264 } … … 210 266 void setLocalEncoderRates(LocalEncoder localEncoder, uint32_t bitRate, uint32_t frameRate) 211 267 { 212 auto *encoder = (__bridge RTCVideoEncoderH264*)(localEncoder);268 auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder); 213 269 [encoder setBitrate:bitRate framerate:frameRate]; 214 270 } -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h
r259452 r259568 53 53 rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef); 54 54 55 using WebKitVideoDecoder = void*;56 using VideoDecoderCreateCallback = WebKitVideoDecoder(*)(const SdpVideoFormat& format);57 using VideoDecoderReleaseCallback = int32_t(*)(WebKitVideoDecoder);58 using VideoDecoderDecodeCallback = int32_t(*)(WebKitVideoDecoder, uint32_t timeStamp, const uint8_t*, size_t length);59 using VideoDecoderRegisterDecodeCompleteCallback = int32_t(*)(WebKitVideoDecoder, void* decodedImageCallback);60 61 void setVideoDecoderCallbacks(VideoDecoderCreateCallback, VideoDecoderReleaseCallback, VideoDecoderDecodeCallback, VideoDecoderRegisterDecodeCompleteCallback);62 63 class RemoteVideoDecoderFactory final : public VideoDecoderFactory {64 public:65 explicit RemoteVideoDecoderFactory(std::unique_ptr<VideoDecoderFactory>&&);66 ~RemoteVideoDecoderFactory() = default;67 68 private:69 std::vector<SdpVideoFormat> GetSupportedFormats() const final;70 std::unique_ptr<VideoDecoder> CreateVideoDecoder(const SdpVideoFormat& format) final;71 72 std::unique_ptr<VideoDecoderFactory> m_internalFactory;73 };74 75 class RemoteVideoDecoder final : public webrtc::VideoDecoder {76 public:77 explicit RemoteVideoDecoder(WebKitVideoDecoder);78 ~RemoteVideoDecoder() = default;79 80 static void decodeComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef, uint32_t timeStampRTP);81 82 private:83 int32_t InitDecode(const VideoCodec*, int32_t number_of_cores) final;84 int32_t Decode(const EncodedImage&, bool missing_frames, int64_t render_time_ms) final;85 int32_t RegisterDecodeCompleteCallback(DecodedImageCallback*) final;86 int32_t Release() final;87 const char* ImplementationName() const final { return "RemoteVideoToolBox"; }88 89 WebKitVideoDecoder m_internalDecoder;90 };91 92 using LocalDecoder = void*;93 using LocalDecoderCallback = void (^)(CVPixelBufferRef, uint32_t timeStamp, uint32_t timeStampNs);94 void* createLocalDecoder(LocalDecoderCallback);95 void releaseLocalDecoder(LocalDecoder);96 int32_t decodeFrame(LocalDecoder, uint32_t timeStamp, const uint8_t*, size_t);97 98 55 } -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm
r259452 r259568 187 187 } 188 188 189 struct VideoDecoderCallbacks {190 VideoDecoderCreateCallback createCallback;191 VideoDecoderReleaseCallback releaseCallback;192 VideoDecoderDecodeCallback decodeCallback;193 VideoDecoderRegisterDecodeCompleteCallback registerDecodeCompleteCallback;194 };195 196 static VideoDecoderCallbacks& videoDecoderCallbacks() {197 static VideoDecoderCallbacks callbacks;198 return callbacks;199 189 } 200 201 void setVideoDecoderCallbacks(VideoDecoderCreateCallback createCallback, VideoDecoderReleaseCallback releaseCallback, VideoDecoderDecodeCallback decodeCallback, VideoDecoderRegisterDecodeCompleteCallback registerDecodeCompleteCallback)202 {203 auto& callbacks = videoDecoderCallbacks();204 callbacks.createCallback = createCallback;205 callbacks.releaseCallback = releaseCallback;206 callbacks.decodeCallback = decodeCallback;207 callbacks.registerDecodeCompleteCallback = registerDecodeCompleteCallback;208 }209 210 RemoteVideoDecoder::RemoteVideoDecoder(WebKitVideoDecoder internalDecoder)211 : m_internalDecoder(internalDecoder)212 {213 }214 215 void RemoteVideoDecoder::decodeComplete(void* callback, uint32_t timeStamp, CVPixelBufferRef pixelBuffer, uint32_t timeStampRTP)216 {217 auto videoFrame = VideoFrame::Builder().set_video_frame_buffer(pixelBufferToFrame(pixelBuffer))218 .set_timestamp_rtp(timeStampRTP)219 .set_timestamp_ms(0)220 .set_rotation((VideoRotation)RTCVideoRotation_0)221 .build();222 videoFrame.set_timestamp(timeStamp);223 224 static_cast<DecodedImageCallback*>(callback)->Decoded(videoFrame);225 }226 227 int32_t RemoteVideoDecoder::InitDecode(const VideoCodec* codec_settings, int32_t number_of_cores)228 {229 return WEBRTC_VIDEO_CODEC_OK;230 }231 232 int32_t RemoteVideoDecoder::Decode(const EncodedImage& input_image, bool missing_frames, int64_t render_time_ms)233 {234 return videoDecoderCallbacks().decodeCallback(m_internalDecoder, input_image.Timestamp(), input_image.data(), input_image.size());235 }236 237 int32_t RemoteVideoDecoder::RegisterDecodeCompleteCallback(DecodedImageCallback* callback)238 {239 return videoDecoderCallbacks().registerDecodeCompleteCallback(m_internalDecoder, callback);240 }241 242 int32_t RemoteVideoDecoder::Release()243 {244 return videoDecoderCallbacks().releaseCallback(m_internalDecoder);245 }246 247 RemoteVideoDecoderFactory::RemoteVideoDecoderFactory(std::unique_ptr<VideoDecoderFactory>&& internalFactory)248 : m_internalFactory(std::move(internalFactory))249 {250 }251 252 std::vector<SdpVideoFormat> RemoteVideoDecoderFactory::GetSupportedFormats() const253 {254 std::vector<SdpVideoFormat> supported_formats;255 supported_formats.push_back(SdpVideoFormat { "H264" });256 supported_formats.push_back(SdpVideoFormat { "VP8" });257 return supported_formats;258 }259 260 std::unique_ptr<VideoDecoder> RemoteVideoDecoderFactory::CreateVideoDecoder(const SdpVideoFormat& format)261 {262 if (!videoDecoderCallbacks().createCallback)263 return m_internalFactory->CreateVideoDecoder(format);264 265 auto identifier = videoDecoderCallbacks().createCallback(format);266 if (!identifier)267 return m_internalFactory->CreateVideoDecoder(format);268 269 return std::make_unique<RemoteVideoDecoder>(identifier);270 }271 272 std::unique_ptr<webrtc::VideoDecoderFactory> createWebKitDecoderFactory(WebKitCodecSupport codecSupport)273 {274 auto internalFactory = ObjCToNativeVideoDecoderFactory([[RTCDefaultVideoDecoderFactory alloc] initWithH265: codecSupport == WebKitCodecSupport::H264VP8AndH265]);275 if (videoDecoderCallbacks().createCallback)276 return std::make_unique<RemoteVideoDecoderFactory>(std::move(internalFactory));277 return internalFactory;278 }279 280 void* createLocalDecoder(LocalDecoderCallback callback)281 {282 auto decoder = [[RTCVideoDecoderH264 alloc] init];283 [decoder setCallback:^(RTCVideoFrame *frame) {284 auto *buffer = (RTCCVPixelBuffer *)frame.buffer;285 callback(buffer.pixelBuffer, frame.timeStampNs, frame.timeStamp);286 }];287 return (__bridge_retained void*)decoder;288 }289 290 void releaseLocalDecoder(LocalDecoder localDecoder)291 {292 RTCVideoDecoderH264* decoder = (__bridge_transfer RTCVideoDecoderH264 *)(localDecoder);293 [decoder releaseDecoder];294 }295 296 int32_t decodeFrame(LocalDecoder localDecoder, uint32_t timeStamp, const uint8_t* data, size_t size)297 {298 RTCVideoDecoderH264* decoder = (__bridge RTCVideoDecoderH264 *)(localDecoder);299 return [decoder decodeData: data size: size timeStamp: timeStamp];300 }301 302 } -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h
r259452 r259568 17 17 __attribute__((objc_runtime_name("WK_RTCVideoDecoderH265"))) 18 18 @interface RTCVideoDecoderH265 : NSObject <RTCVideoDecoder> 19 - (NSInteger)decodeData:(const uint8_t *)data 20 size:(size_t)size 21 timeStamp:(uint32_t)timeStamp; 19 22 @end -
trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm
r259452 r259568 90 90 renderTimeMs:(int64_t)renderTimeMs { 91 91 RTC_DCHECK(inputImage.buffer); 92 92 return [self decodeData: (uint8_t *)inputImage.buffer.bytes size: inputImage.buffer.length timeStamp: inputImage.timeStamp]; 93 } 94 95 - (NSInteger)decodeData:(const uint8_t *)data size:(size_t)size timeStamp:(uint32_t)timeStamp { 93 96 if (_error != noErr) { 94 97 RTC_LOG(LS_WARNING) << "Last frame decode failed."; … … 99 102 rtc::ScopedCFTypeRef<CMVideoFormatDescriptionRef> inputFormat = 100 103 rtc::ScopedCF(webrtc::CreateH265VideoFormatDescription( 101 (uint8_t*) inputImage.buffer.bytes, inputImage.buffer.length));104 (uint8_t*)data, size)); 102 105 if (inputFormat) { 103 106 CMVideoDimensions dimensions = … … 124 127 return WEBRTC_VIDEO_CODEC_ERROR; 125 128 } 129 126 130 CMSampleBufferRef sampleBuffer = nullptr; 127 131 if (!webrtc::H265AnnexBBufferToCMSampleBuffer( 128 (uint8_t*) inputImage.buffer.bytes, inputImage.buffer.length,132 (uint8_t*)data, size, 129 133 _videoFormat, &sampleBuffer)) { 130 134 return WEBRTC_VIDEO_CODEC_ERROR; … … 135 139 std::unique_ptr<RTCH265FrameDecodeParams> frameDecodeParams; 136 140 frameDecodeParams.reset( 137 new RTCH265FrameDecodeParams(_callback, inputImage.timeStamp));141 new RTCH265FrameDecodeParams(_callback, timeStamp)); 138 142 OSStatus status = VTDecompressionSessionDecodeFrame( 139 143 _decompressionSession, sampleBuffer, decodeFlags, … … 145 149 [self resetDecompressionSession] == WEBRTC_VIDEO_CODEC_OK) { 146 150 frameDecodeParams.reset( 147 new RTCH265FrameDecodeParams(_callback, inputImage.timeStamp));151 new RTCH265FrameDecodeParams(_callback, timeStamp)); 148 152 status = VTDecompressionSessionDecodeFrame( 149 153 _decompressionSession, sampleBuffer, decodeFlags, -
trunk/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj
r259452 r259568 1982 1982 41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41009206242E3A4500C5EDA2 /* RTCVideoEncoderH265.mm */; }; 1983 1983 41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41009208242E3A4600C5EDA2 /* RTCCodecSpecificInfoH265.mm */; }; 1984 41E84BD524373F7200D34E41 /* WebKitDecoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41E84BCA2434C4A300D34E41 /* WebKitDecoder.mm */; }; 1984 1985 41EA53A51EFC2C14002FF04C /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = 41EA53A41EFC2BFD002FF04C /* hmac.c */; }; 1985 1986 41EA53AB1EFC2C4D002FF04C /* digest.c in Sources */ = {isa = PBXBuildFile; fileRef = 41EA53A71EFC2C4D002FF04C /* digest.c */; }; … … 6136 6137 41E59E9423ACC1230095A94B /* vp8_rtcd_no_acceleration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vp8_rtcd_no_acceleration.h; sourceTree = "<group>"; }; 6137 6138 41E59E9523ACC1230095A94B /* vpx_dsp_rtcd_no_acceleration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vpx_dsp_rtcd_no_acceleration.h; sourceTree = "<group>"; }; 6139 41E84BC92434C4A200D34E41 /* WebKitDecoder.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = WebKitDecoder.h; sourceTree = "<group>"; }; 6140 41E84BCA2434C4A300D34E41 /* WebKitDecoder.mm */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.objcpp; path = WebKitDecoder.mm; sourceTree = "<group>"; }; 6138 6141 41EA53A41EFC2BFD002FF04C /* hmac.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = "<group>"; }; 6139 6142 41EA53A71EFC2C4D002FF04C /* digest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digest.c; sourceTree = "<group>"; }; … … 9172 9175 417953AC2169823D0028266B /* nalu_rewriter.cc */, 9173 9176 411521D521698220000ABAF7 /* nalu_rewriter.h */, 9177 417953B2216982410028266B /* RTCCodecSpecificInfoH264+Private.h */, 9174 9178 416225F1216981F300A91C9B /* RTCCodecSpecificInfoH264.h */, 9175 9179 416225ED216981F200A91C9B /* RTCCodecSpecificInfoH264.mm */, 9176 41 7953B2216982410028266B /* RTCCodecSpecificInfoH264+Private.h */,9180 41009203242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265+Private.h */, 9177 9181 41009202242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265.h */, 9178 9182 41009208242E3A4600C5EDA2 /* RTCCodecSpecificInfoH265.mm */, 9179 41009203242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265+Private.h */,9180 9183 417953B3216982420028266B /* RTCDefaultVideoDecoderFactory.h */, 9181 9184 417953AD2169823E0028266B /* RTCDefaultVideoDecoderFactory.m */, … … 9885 9888 41ECEAFA20646663009D5141 /* VideoProcessingSoftLink.cpp */, 9886 9889 41ECEAFB20646664009D5141 /* VideoProcessingSoftLink.h */, 9890 41E84BC92434C4A200D34E41 /* WebKitDecoder.h */, 9891 41E84BCA2434C4A300D34E41 /* WebKitDecoder.mm */, 9887 9892 4158649623BE05E800A0A61E /* WebKitEncoder.h */, 9888 9893 4158649723BE05E900A0A61E /* WebKitEncoder.mm */, … … 14693 14698 5CDD85E81E43B81000621E92 /* aecm_core.h in Headers */, 14694 14699 5CDD85E91E43B81000621E92 /* aecm_defines.h in Headers */, 14695 410091E7242E2AA300C5EDA2 /* rtp_format_h265.h in Headers */,14696 14700 5C0885271E4A99D200403995 /* aes.h in Headers */, 14697 14701 5C0885241E4A99D200403995 /* aes_gcm_ossl.h in Headers */, … … 15033 15037 5CDD8B971E43C2B500621E92 /* encode.h in Headers */, 15034 15038 5CDD87B61E43BC0500621E92 /* encode_lpc_swb.h in Headers */, 15035 41009209242E3A4600C5EDA2 /* RTCVideoDecoderH265.h in Headers */,15036 15039 5CDD8A961E43C00F00621E92 /* encode_neteq_input.h in Headers */, 15037 15040 418938D8242A69CC007FDC41 /* encode_usage_resource.h in Headers */, … … 15066 15069 41BE71A6215C463700A7B196 /* expr.h in Headers */, 15067 15070 5CDD894B1E43BF3A00621E92 /* extended_jitter_report.h in Headers */, 15068 410091FE242E362200C5EDA2 /* h265_vps_parser.h in Headers */,15069 15071 5CDD894E1E43BF3A00621E92 /* extended_reports.h in Headers */, 15070 15072 4131BF46234B88200028A615 /* external_hmac.h in Headers */, … … 15172 15174 5CD285EB1E6A639F0094FDC8 /* h264_sprop_parameter_sets.h in Headers */, 15173 15175 5CDD83DA1E439A6F00621E92 /* h264_sps_pps_tracker.h in Headers */, 15176 410091FD242E362200C5EDA2 /* h265_common.h in Headers */, 15177 410091F9242E362200C5EDA2 /* h265_sps_parser.h in Headers */, 15178 410091FE242E362200C5EDA2 /* h265_vps_parser.h in Headers */, 15179 410091ED242E317400C5EDA2 /* h265_vps_sps_pps_tracker.h in Headers */, 15174 15180 41FCBB7221B1FF7400A5DF27 /* hdr_metadata.h in Headers */, 15175 15181 4131C087234B898D0028A615 /* helpers.h in Headers */, … … 15505 15511 4131C4B7234C83DD0028A615 /* remote_estimate.h in Headers */, 15506 15512 5CDD8FE21E43CD6600621E92 /* remote_estimator_proxy.h in Headers */, 15507 410091F9242E362200C5EDA2 /* h265_sps_parser.h in Headers */,15508 15513 419C83C51FE247B40040C30F /* remote_ntp_time_estimator.h in Headers */, 15509 15514 4145E4DA1EF8CC9B00FCF6E6 /* render_buffer.h in Headers */, … … 15610 15615 413A24561FE1991A00373E99 /* RTCFileVideoCapturer.h in Headers */, 15611 15616 417953C32169824B0028266B /* RTCH264ProfileLevelId.h in Headers */, 15617 4100920E242E3A4600C5EDA2 /* RTCH265ProfileLevelId.h in Headers */, 15612 15618 417953F9216984BE0028266B /* RTCI420Buffer.h in Headers */, 15613 15619 413A244E1FE1991A00373E99 /* RTCIceCandidate.h in Headers */, … … 15638 15644 4131C4EF234C86110028A615 /* rtcp_statistics.h in Headers */, 15639 15645 419C83031FE20F020040C30F /* rtcp_transceiver.h in Headers */, 15640 410091FD242E362200C5EDA2 /* h265_common.h in Headers */,15641 15646 419C83011FE20F020040C30F /* rtcp_transceiver_config.h in Headers */, 15642 15647 419C83051FE20F020040C30F /* rtcp_transceiver_impl.h in Headers */, … … 15668 15673 417953C52169824B0028266B /* RTCVideoDecoderFactoryH264.h in Headers */, 15669 15674 417953C62169824B0028266B /* RTCVideoDecoderH264.h in Headers */, 15675 41009209242E3A4600C5EDA2 /* RTCVideoDecoderH265.h in Headers */, 15670 15676 413A24651FE1991A00373E99 /* RTCVideoDecoderVP8.h in Headers */, 15671 15677 413F4D7022B0BAEF006A7A6B /* RTCVideoDecoderVP8.h in Headers */, … … 15684 15690 413E678F216987DB00EF37ED /* RTCVideoFrame.h in Headers */, 15685 15691 413E6791216987DB00EF37ED /* RTCVideoFrameBuffer.h in Headers */, 15686 410091ED242E317400C5EDA2 /* h265_vps_sps_pps_tracker.h in Headers */,15687 15692 413A24411FE1991A00373E99 /* RTCVideoFrameBuffer.h in Headers */, 15688 15693 413A246F1FE1991A00373E99 /* RTCVideoRenderer.h in Headers */, … … 15703 15708 5CDD88B11E43BE3C00621E92 /* rtp_format.h in Headers */, 15704 15709 5CDD88A51E43BE3C00621E92 /* rtp_format_h264.h in Headers */, 15710 410091E7242E2AA300C5EDA2 /* rtp_format_h265.h in Headers */, 15705 15711 5CDD88A71E43BE3C00621E92 /* rtp_format_video_generic.h in Headers */, 15706 15712 5CDD88AC1E43BE3C00621E92 /* rtp_format_vp8.h in Headers */, … … 16023 16029 4102F6CF212733B7006AE8D7 /* video_quality_observer.h in Headers */, 16024 16030 419C82C41FE20DCD0040C30F /* video_receive_stream.h in Headers */, 16025 4100920E242E3A4600C5EDA2 /* RTCH265ProfileLevelId.h in Headers */,16026 16031 5CDD85CB1E43B5C000621E92 /* video_receive_stream.h in Headers */, 16027 16032 41893A17242A757A007FDC41 /* video_receiver2.h in Headers */, … … 17421 17426 5CDD86401E43B8B500621E92 /* auto_corr_to_refl_coef.c in Sources */, 17422 17427 5CDD86411E43B8B500621E92 /* auto_correlation.c in Sources */, 17423 41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */,17424 17428 4131C405234C7B7E0028A615 /* auto_correlation.cc in Sources */, 17425 17429 5CDD8A071E43BFB300621E92 /* background_noise.cc in Sources */, … … 17599 17603 5CD285BE1E6A63430094FDC8 /* echo_remover_metrics.cc in Sources */, 17600 17604 5CDD8B961E43C2B500621E92 /* encode.c in Sources */, 17601 41E84BD224373C1400D34E41 /* RTCVideoDecoderH265.mm in Sources */,17602 17605 5CDD87B71E43BC0500621E92 /* encode.c in Sources */, 17603 17606 41433D121F79B33400387B4D /* encode.c in Sources */, … … 17724 17727 5CD285EA1E6A639F0094FDC8 /* h264_sprop_parameter_sets.cc in Sources */, 17725 17728 5CDD83D91E439A6F00621E92 /* h264_sps_pps_tracker.cc in Sources */, 17729 410091FF242E362200C5EDA2 /* h265_common.cc in Sources */, 17730 41E84BCE24373BDE00D34E41 /* h265_pps_parser.cc in Sources */, 17731 41E84BCF24373BE200D34E41 /* h265_sps_parser.cc in Sources */, 17732 41E84BD024373BE600D34E41 /* h265_vps_parser.cc in Sources */, 17733 41E84BD124373C0700D34E41 /* h265_vps_sps_pps_tracker.cc in Sources */, 17726 17734 41FCBB7121B1FF7400A5DF27 /* hdr_metadata.cc in Sources */, 17727 17735 4131C068234B898D0028A615 /* helpers.cc in Sources */, … … 17762 17770 5CDD8BBF1E43C2B500621E92 /* interpolate.c in Sources */, 17763 17771 5CDD8BBD1E43C2B500621E92 /* interpolate_samples.c in Sources */, 17764 41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */,17765 17772 415F1FB221272FBA00064CBF /* interpolated_gain_curve.cc in Sources */, 17766 17773 419C829A1FE20CA10040C30F /* interval_budget.cc in Sources */, … … 17792 17799 41294092212E128D00AD95E7 /* libvpx_vp8_encoder.cc in Sources */, 17793 17800 416D3BE6212731C200775F09 /* limiter.cc in Sources */, 17794 41E84BCF24373BE200D34E41 /* h265_sps_parser.cc in Sources */,17795 17801 4131C4C5234C84520028A615 /* link_capacity_estimator.cc in Sources */, 17796 17802 4131BF4A234B88200028A615 /* local_audio_source.cc in Sources */, … … 17808 17814 5CDD8BC11E43C2B500621E92 /* lpc_encode.c in Sources */, 17809 17815 5CDD87C71E43BC0500621E92 /* lpc_gain_swb_tables.c in Sources */, 17810 410091E6242E2AA300C5EDA2 /* rtp_format_h265.cc in Sources */,17811 17816 41433CEE1F79B33400387B4D /* lpc_masking_model.c in Sources */, 17812 17817 5CDD87C91E43BC0500621E92 /* lpc_shape_swb12_tables.c in Sources */, … … 17837 17842 4131C315234B8DC20028A615 /* media_stream_interface.cc in Sources */, 17838 17843 4131BF25234B88200028A615 /* media_stream_observer.cc in Sources */, 17839 41E84BD024373BE600D34E41 /* h265_vps_parser.cc in Sources */,17840 17844 418939F7242A74F8007FDC41 /* media_transport_config.cc in Sources */, 17841 17845 418939F6242A74F8007FDC41 /* media_transport_interface.cc in Sources */, … … 17906 17910 4131C1B5234B8A4A0028A615 /* p2p_constants.cc in Sources */, 17907 17911 4131C1D4234B8A4B0028A615 /* p2p_transport_channel.cc in Sources */, 17908 41E84BD124373C0700D34E41 /* h265_vps_sps_pps_tracker.cc in Sources */,17909 17912 41F2639A21267F5E00274F59 /* pa_ringbuffer.c in Sources */, 17910 17913 5CDD8FA21E43CCBE00621E92 /* paced_sender.cc in Sources */, … … 18083 18086 419C841D1FE24AEF0040C30F /* rtc_stream_config.cc in Sources */, 18084 18087 417953CC216982DB0028266B /* RTCCodecSpecificInfoH264.mm in Sources */, 18088 41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */, 18085 18089 413E678B216987B900EF37ED /* RTCCVPixelBuffer.mm in Sources */, 18086 18090 417953B5216982420028266B /* RTCDefaultVideoDecoderFactory.m in Sources */, … … 18089 18093 417953FA216984BE0028266B /* RTCEncodedImage.m in Sources */, 18090 18094 4144B3D621698A1A004363AC /* RTCH264ProfileLevelId.mm in Sources */, 18095 4100920A242E3A4600C5EDA2 /* RTCH265ProfileLevelId.mm in Sources */, 18091 18096 4144B3D32169896D004363AC /* RTCNativeI420Buffer.mm in Sources */, 18092 18097 4144B3D121698967004363AC /* RTCNativeMutableI420Buffer.mm in Sources */, … … 18108 18113 413E67982169883900EF37ED /* RTCVideoCodecInfo.m in Sources */, 18109 18114 417953B8216982420028266B /* RTCVideoDecoderFactoryH264.m in Sources */, 18110 41E84BCE24373BDE00D34E41 /* h265_pps_parser.cc in Sources */,18111 18115 417953C72169824B0028266B /* RTCVideoDecoderH264.mm in Sources */, 18116 41E84BD224373C1400D34E41 /* RTCVideoDecoderH265.mm in Sources */, 18112 18117 413E67682169854B00EF37ED /* RTCVideoDecoderVP8.mm in Sources */, 18113 18118 417953B9216982420028266B /* RTCVideoEncoderFactoryH264.m in Sources */, 18114 18119 417953CA2169824B0028266B /* RTCVideoEncoderH264.mm in Sources */, 18120 41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */, 18115 18121 413E67A32169889500EF37ED /* RTCVideoEncoderQpThresholds.m in Sources */, 18116 18122 4144B3F7216B09CB004363AC /* RTCVideoEncoderSettings+Private.mm in Sources */, … … 18130 18136 5CDD88B01E43BE3C00621E92 /* rtp_format.cc in Sources */, 18131 18137 5CDD88A41E43BE3C00621E92 /* rtp_format_h264.cc in Sources */, 18138 410091E6242E2AA300C5EDA2 /* rtp_format_h265.cc in Sources */, 18132 18139 5CDD88A61E43BE3C00621E92 /* rtp_format_video_generic.cc in Sources */, 18133 18140 5CDD88AB1E43BE3C00621E92 /* rtp_format_vp8.cc in Sources */, … … 18312 18319 5CDD8A5A1E43BFB300621E92 /* time_stretch.cc in Sources */, 18313 18320 5CDD88DA1E43BE3D00621E92 /* time_util.cc in Sources */, 18314 4100920A242E3A4600C5EDA2 /* RTCH265ProfileLevelId.mm in Sources */,18315 18321 4131C14A234B89E20028A615 /* time_utils.cc in Sources */, 18316 18322 419241E321275A3000634FCF /* timestamp.cc in Sources */, … … 18431 18437 5C4B4C831E431F9C002651C8 /* wav_header.cc in Sources */, 18432 18438 4131C0F9234B89E20028A615 /* weak_ptr.cc in Sources */, 18439 41E84BD524373F7200D34E41 /* WebKitDecoder.mm in Sources */, 18433 18440 4158649923BE05E900A0A61E /* WebKitEncoder.mm in Sources */, 18434 18441 41ECEABE20640498009D5141 /* WebKitUtilities.mm in Sources */, … … 18437 18444 4131C27A234B8CC40028A615 /* webrtc_media_engine.cc in Sources */, 18438 18445 4131C278234B8CC40028A615 /* webrtc_media_engine_defaults.cc in Sources */, 18439 410091FF242E362200C5EDA2 /* h265_common.cc in Sources */,18440 18446 4131BF50234B88200028A615 /* webrtc_sdp.cc in Sources */, 18441 18447 4131BEF4234B88200028A615 /* webrtc_session_description_factory.cc in Sources */, -
trunk/Source/WebKit/ChangeLog
r259560 r259568 1 2020-04-06 youenn fablet <youenn@apple.com> 2 3 Add HEVC support in GPU Process for WebRTC 4 https://bugs.webkit.org/show_bug.cgi?id=209857 5 6 Reviewed by Eric Carlson. 7 8 * GPUProcess/webrtc/LibWebRTCCodecsProxy.h: 9 * GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in: 10 * GPUProcess/webrtc/LibWebRTCCodecsProxy.mm: 11 (WebKit::LibWebRTCCodecsProxy::createH264Decoder): 12 (WebKit::LibWebRTCCodecsProxy::createH265Decoder): 13 (WebKit::LibWebRTCCodecsProxy::createEncoder): 14 (WebKit::LibWebRTCCodecsProxy::createDecoder): Deleted. 15 * WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp: 16 (WebKit::createVideoDecoder): 17 (WebKit::createVideoEncoder): 18 (WebKit::LibWebRTCCodecs::createDecoder): 19 (WebKit::formatNameFromCodecType): 20 (WebKit::LibWebRTCCodecs::createEncoder): 21 * WebProcess/GPU/webrtc/LibWebRTCCodecs.h: 22 1 23 2020-04-05 Don Olmstead <don.olmstead@sony.com> 2 24 -
trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h
r254050 r259568 63 63 // IPC::MessageReceiver 64 64 void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final; 65 void createDecoder(RTCDecoderIdentifier); 65 void createH264Decoder(RTCDecoderIdentifier); 66 void createH265Decoder(RTCDecoderIdentifier); 66 67 void releaseDecoder(RTCDecoderIdentifier); 67 68 void decodeFrame(RTCDecoderIdentifier, uint32_t timeStamp, const IPC::DataReference&); 68 69 69 void createEncoder(RTCEncoderIdentifier, const Vector<std::pair<String, String>>&);70 void createEncoder(RTCEncoderIdentifier, const String&, const Vector<std::pair<String, String>>&); 70 71 void releaseEncoder(RTCEncoderIdentifier); 71 72 void initializeEncoder(RTCEncoderIdentifier, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate); -
trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in
r254050 r259568 25 25 26 26 messages -> LibWebRTCCodecsProxy NotRefCounted { 27 CreateDecoder(WebKit::RTCDecoderIdentifier id) 27 CreateH264Decoder(WebKit::RTCDecoderIdentifier id) 28 CreateH265Decoder(WebKit::RTCDecoderIdentifier id) 28 29 ReleaseDecoder(WebKit::RTCDecoderIdentifier id) 29 30 DecodeFrame(WebKit::RTCDecoderIdentifier id, uint32_t timeStamp, IPC::DataReference data) 30 31 31 CreateEncoder(WebKit::RTCEncoderIdentifier id, Vector<std::pair<String, String>> parameters);32 CreateEncoder(WebKit::RTCEncoderIdentifier id, String formatName, Vector<std::pair<String, String>> parameters); 32 33 ReleaseEncoder(WebKit::RTCEncoderIdentifier id) 33 34 InitializeEncoder(WebKit::RTCEncoderIdentifier id, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate) -
trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.mm
r254050 r259568 35 35 #include <WebCore/LibWebRTCMacros.h> 36 36 #include <WebCore/RemoteVideoSample.h> 37 #include <webrtc/sdk/WebKit/WebKitDecoder.h> 37 38 #include <webrtc/sdk/WebKit/WebKitEncoder.h> 38 #include <webrtc/sdk/WebKit/WebKitUtilities.h>39 39 #include <wtf/MediaTime.h> 40 40 … … 54 54 } 55 55 56 void LibWebRTCCodecsProxy::create Decoder(RTCDecoderIdentifier identifier)56 void LibWebRTCCodecsProxy::createH264Decoder(RTCDecoderIdentifier identifier) 57 57 { 58 58 ASSERT(!m_decoders.contains(identifier)); 59 m_decoders.add(identifier, webrtc::createLocalDecoder(^(CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp) { 59 m_decoders.add(identifier, webrtc::createLocalH264Decoder(^(CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp) { 60 if (auto sample = WebCore::RemoteVideoSample::create(pixelBuffer, MediaTime(timeStampNs, 1))) 61 m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, *sample }, 0); 62 })); 63 } 64 65 void LibWebRTCCodecsProxy::createH265Decoder(RTCDecoderIdentifier identifier) 66 { 67 ASSERT(!m_decoders.contains(identifier)); 68 m_decoders.add(identifier, webrtc::createLocalH265Decoder(^(CVPixelBufferRef pixelBuffer, uint32_t timeStampNs, uint32_t timeStamp) { 60 69 if (auto sample = WebCore::RemoteVideoSample::create(pixelBuffer, MediaTime(timeStampNs, 1))) 61 70 m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, *sample }, 0); … … 81 90 } 82 91 83 void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const Vector<std::pair<String, String>>& parameters)92 void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const String& formatName, const Vector<std::pair<String, String>>& parameters) 84 93 { 85 94 ASSERT(!m_encoders.contains(identifier)); … … 89 98 rtcParameters.emplace(parameter.first.utf8().data(), parameter.second.utf8().data()); 90 99 91 m_encoders.add(identifier, webrtc::createLocalEncoder(webrtc::SdpVideoFormat { "H264", rtcParameters }, ^(const uint8_t* buffer, size_t size, const webrtc::WebKitEncodedFrameInfo& info, webrtc::RTPFragmentationHeader* header) {100 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) { 92 101 93 102 m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::CompletedEncoding { identifier, IPC::DataReference { buffer, size }, info, webrtc::WebKitRTPFragmentationHeader { header } }, 0); -
trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp
r254454 r259568 36 36 #include <WebCore/RealtimeVideoUtilities.h> 37 37 #include <WebCore/RemoteVideoSample.h> 38 #include < pal/cf/CoreMediaSoftLink.h>38 #include <webrtc/sdk/WebKit/WebKitDecoder.h> 39 39 #include <webrtc/sdk/WebKit/WebKitEncoder.h> 40 40 #include <webrtc/sdk/WebKit/WebKitUtilities.h> 41 41 #include <wtf/MainThread.h> 42 42 43 #include <pal/cf/CoreMediaSoftLink.h> 44 43 45 namespace WebKit { 44 46 using namespace WebCore; … … 46 48 static webrtc::WebKitVideoDecoder createVideoDecoder(const webrtc::SdpVideoFormat& format) 47 49 { 48 if (format.name != "H264") 49 return nullptr; 50 51 return WebProcess::singleton().libWebRTCCodecs().createDecoder(); 50 if (format.name == "H264") 51 return WebProcess::singleton().libWebRTCCodecs().createDecoder(LibWebRTCCodecs::Type::H264); 52 53 if (format.name == "H265") 54 return WebProcess::singleton().libWebRTCCodecs().createDecoder(LibWebRTCCodecs::Type::H265); 55 56 return nullptr; 52 57 } 53 58 … … 70 75 static webrtc::WebKitVideoEncoder createVideoEncoder(const webrtc::SdpVideoFormat& format) 71 76 { 72 if (format.name != "H264") 73 return nullptr; 74 75 return WebProcess::singleton().libWebRTCCodecs().createEncoder(format.parameters); 77 if (format.name == "H264") 78 return WebProcess::singleton().libWebRTCCodecs().createEncoder(LibWebRTCCodecs::Type::H264, format.parameters); 79 80 if (format.name == "H265") 81 return WebProcess::singleton().libWebRTCCodecs().createEncoder(LibWebRTCCodecs::Type::H265, format.parameters); 82 83 return nullptr; 76 84 } 77 85 … … 149 157 } 150 158 151 LibWebRTCCodecs::Decoder* LibWebRTCCodecs::createDecoder( )159 LibWebRTCCodecs::Decoder* LibWebRTCCodecs::createDecoder(Type type) 152 160 { 153 161 auto decoder = makeUnique<Decoder>(); … … 155 163 decoder->identifier = RTCDecoderIdentifier::generateThreadSafe(); 156 164 157 callOnMainRunLoop([this, decoder = WTFMove(decoder) ]() mutable {165 callOnMainRunLoop([this, decoder = WTFMove(decoder), type]() mutable { 158 166 decoder->connection = &WebProcess::singleton().ensureGPUProcessConnection().connection(); 159 167 160 168 auto decoderIdentifier = decoder->identifier; 161 decoder->connection->send(Messages::LibWebRTCCodecsProxy::CreateDecoder { decoderIdentifier }, 0); 169 switch (type) { 170 case Type::H264: 171 decoder->connection->send(Messages::LibWebRTCCodecsProxy::CreateH264Decoder { decoderIdentifier }, 0); 172 break; 173 case Type::H265: 174 decoder->connection->send(Messages::LibWebRTCCodecsProxy::CreateH265Decoder { decoderIdentifier }, 0); 175 break; 176 } 162 177 163 178 ASSERT(!m_decoders.contains(decoderIdentifier)); … … 239 254 } 240 255 241 LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoder(const std::map<std::string, std::string>& formatParameters) 256 static inline String formatNameFromCodecType(LibWebRTCCodecs::Type type) 257 { 258 switch (type) { 259 case LibWebRTCCodecs::Type::H264: 260 return "H264"_s; 261 case LibWebRTCCodecs::Type::H265: 262 return "H265"_s; 263 } 264 } 265 266 LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoder(Type type, const std::map<std::string, std::string>& formatParameters) 242 267 { 243 268 auto encoder = makeUnique<Encoder>(); … … 249 274 parameters.append(std::make_pair(String::fromUTF8(keyValue.first.data(), keyValue.first.length()), String::fromUTF8(keyValue.second.data(), keyValue.second.length()))); 250 275 251 callOnMainRunLoop([this, encoder = WTFMove(encoder), parameters = WTFMove(parameters)]() mutable {276 callOnMainRunLoop([this, encoder = WTFMove(encoder), type, parameters = WTFMove(parameters)]() mutable { 252 277 auto encoderIdentifier = encoder->identifier; 253 278 ASSERT(!m_encoders.contains(encoderIdentifier)); 254 279 255 WebProcess::singleton().ensureGPUProcessConnection().connection().send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoderIdentifier, parameters }, 0);280 WebProcess::singleton().ensureGPUProcessConnection().connection().send(Messages::LibWebRTCCodecsProxy::CreateEncoder { encoderIdentifier, formatNameFromCodecType(type), parameters }, 0); 256 281 m_encoders.add(encoderIdentifier, WTFMove(encoder)); 257 282 }); -
trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h
r254050 r259568 73 73 }; 74 74 75 Decoder* createDecoder(); 75 enum class Type { H264, H265 }; 76 Decoder* createDecoder(Type); 76 77 int32_t releaseDecoder(Decoder&); 77 78 int32_t decodeFrame(Decoder&, uint32_t timeStamp, const uint8_t*, size_t); … … 87 88 }; 88 89 89 Encoder* createEncoder( const std::map<std::string, std::string>&);90 Encoder* createEncoder(Type, const std::map<std::string, std::string>&); 90 91 int32_t releaseEncoder(Encoder&); 91 92 int32_t initializeEncoder(Encoder&, uint16_t width, uint16_t height, unsigned startBitrate, unsigned maxBitrate, unsigned minBitrate, uint32_t maxFramerate);
Note:
See TracChangeset
for help on using the changeset viewer.