Changeset 259568 in webkit


Ignore:
Timestamp:
Apr 6, 2020, 2:57:27 AM (5 years ago)
Author:
youenn@apple.com
Message:

Add HEVC support in GPU Process for WebRTC
https://bugs.webkit.org/show_bug.cgi?id=209857

Reviewed by Eric Carlson.

Source/ThirdParty/libwebrtc:

  • Configurations/libwebrtc.iOS.exp:
  • Configurations/libwebrtc.iOSsim.exp:
  • Configurations/libwebrtc.mac.exp:
  • Source/webrtc/sdk/WebKit/WebKitDecoder.h: Copied from Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h.
  • Source/webrtc/sdk/WebKit/WebKitDecoder.mm: Added.

(-[WK_RTCLocalVideoH264H265Decoder initH264DecoderWithCallback:]):
(-[WK_RTCLocalVideoH264H265Decoder initH265DecoderWithCallback:]):
(-[WK_RTCLocalVideoH264H265Decoder decodeData:size:timeStamp:]):
(-[WK_RTCLocalVideoH264H265Decoder releaseDecoder]):
(webrtc::videoDecoderCallbacks):
(webrtc::setVideoDecoderCallbacks):
(webrtc::RemoteVideoDecoder::RemoteVideoDecoder):
(webrtc::RemoteVideoDecoder::decodeComplete):
(webrtc::RemoteVideoDecoder::InitDecode):
(webrtc::RemoteVideoDecoder::Decode):
(webrtc::RemoteVideoDecoder::RegisterDecodeCompleteCallback):
(webrtc::RemoteVideoDecoder::Release):
(webrtc::RemoteVideoDecoderFactory::RemoteVideoDecoderFactory):
(webrtc::RemoteVideoDecoderFactory::GetSupportedFormats const):
(webrtc::RemoteVideoDecoderFactory::CreateVideoDecoder):
(webrtc::createWebKitDecoderFactory):
(webrtc::createLocalH264Decoder):
(webrtc::createLocalH265Decoder):
(webrtc::releaseLocalDecoder):
(webrtc::decodeFrame):

  • Source/webrtc/sdk/WebKit/WebKitEncoder.mm:

(-[WK_RTCLocalVideoH264H265Encoder initWithCodecInfo:]):
(-[WK_RTCLocalVideoH264H265Encoder setCallback:]):
(-[WK_RTCLocalVideoH264H265Encoder releaseEncoder]):
(-[WK_RTCLocalVideoH264H265Encoder startEncodeWithSettings:numberOfCores:]):
(-[WK_RTCLocalVideoH264H265Encoder encode:codecSpecificInfo:frameTypes:]):
(-[WK_RTCLocalVideoH264H265Encoder setBitrate:framerate:]):
(webrtc::createLocalEncoder):
(webrtc::releaseLocalEncoder):
(webrtc::initializeLocalEncoder):
(webrtc::encodeLocalEncoderFrame):
(webrtc::setLocalEncoderRates):

  • Source/webrtc/sdk/WebKit/WebKitUtilities.h:

(): Deleted.

  • Source/webrtc/sdk/WebKit/WebKitUtilities.mm:

(webrtc::videoDecoderCallbacks): Deleted.
(webrtc::setVideoDecoderCallbacks): Deleted.
(webrtc::RemoteVideoDecoder::RemoteVideoDecoder): Deleted.
(webrtc::RemoteVideoDecoder::decodeComplete): Deleted.
(webrtc::RemoteVideoDecoder::InitDecode): Deleted.
(webrtc::RemoteVideoDecoder::Decode): Deleted.
(webrtc::RemoteVideoDecoder::RegisterDecodeCompleteCallback): Deleted.
(webrtc::RemoteVideoDecoder::Release): Deleted.
(webrtc::RemoteVideoDecoderFactory::RemoteVideoDecoderFactory): Deleted.
(webrtc::RemoteVideoDecoderFactory::GetSupportedFormats const): Deleted.
(webrtc::RemoteVideoDecoderFactory::CreateVideoDecoder): Deleted.
(webrtc::createWebKitDecoderFactory): Deleted.
(webrtc::createLocalDecoder): Deleted.
(webrtc::releaseLocalDecoder): Deleted.
(webrtc::decodeFrame): Deleted.

  • Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.h:
  • Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm:

(-[RTCVideoDecoderH265 decode:missingFrames:codecSpecificInfo:renderTimeMs:]):
(-[RTCVideoDecoderH265 decodeData:size:timeStamp:]):

  • libwebrtc.xcodeproj/project.pbxproj:

Source/WebKit:

  • GPUProcess/webrtc/LibWebRTCCodecsProxy.h:
  • GPUProcess/webrtc/LibWebRTCCodecsProxy.messages.in:
  • GPUProcess/webrtc/LibWebRTCCodecsProxy.mm:

(WebKit::LibWebRTCCodecsProxy::createH264Decoder):
(WebKit::LibWebRTCCodecsProxy::createH265Decoder):
(WebKit::LibWebRTCCodecsProxy::createEncoder):
(WebKit::LibWebRTCCodecsProxy::createDecoder): Deleted.

  • WebProcess/GPU/webrtc/LibWebRTCCodecs.cpp:

(WebKit::createVideoDecoder):
(WebKit::createVideoEncoder):
(WebKit::LibWebRTCCodecs::createDecoder):
(WebKit::formatNameFromCodecType):
(WebKit::LibWebRTCCodecs::createEncoder):

  • WebProcess/GPU/webrtc/LibWebRTCCodecs.h:
Location:
trunk/Source
Files:
1 added
16 edited
1 copied

Legend:

Unmodified
Added
Removed
  • trunk/Source/ThirdParty/libwebrtc/ChangeLog

    r259466 r259568  
     12020-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
    1692020-04-03  David Kilzer  <ddkilzer@apple.com>
    270
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOS.exp

    r259345 r259568  
    234234__ZNK6webrtc20RtpReceiverInterface14dtls_transportEv
    235235__ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv
    236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE
     236__ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE
     237__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
    237238__ZN6webrtc19releaseLocalDecoderEPv
    238239__ZN6webrtc11decodeFrameEPvjPKhm
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.iOSsim.exp

    r259345 r259568  
    234234__ZNK6webrtc20RtpReceiverInterface14dtls_transportEv
    235235__ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv
    236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE
     236__ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE
     237__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
    237238__ZN6webrtc19releaseLocalDecoderEPv
    238239__ZN6webrtc11decodeFrameEPvjPKhm
  • trunk/Source/ThirdParty/libwebrtc/Configurations/libwebrtc.mac.exp

    r259345 r259568  
    234234__ZNK6webrtc20RtpReceiverInterface14dtls_transportEv
    235235__ZNK6webrtc23RtpTransceiverInterface17codec_preferencesEv
    236 __ZN6webrtc18createLocalDecoderEU13block_pointerFvP10__CVBufferjjE
     236__ZN6webrtc22createLocalH264DecoderEU13block_pointerFvP10__CVBufferjjE
     237__ZN6webrtc22createLocalH265DecoderEU13block_pointerFvP10__CVBufferjjE
    237238__ZN6webrtc19releaseLocalDecoderEPv
    238239__ZN6webrtc11decodeFrameEPvjPKhm
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitDecoder.h

    r259567 r259568  
    11/*
    2  * Copyright (C) 2018 Apple Inc. All rights reserved.
     2 * Copyright (C) 2020 Apple Inc. All rights reserved.
    33 *
    44 * Redistribution and use in source and binary forms, with or without
     
    2626#pragma once
    2727
    28 #include "api/video/video_frame_buffer.h"
    29 #include "api/scoped_refptr.h"
     28#include "api/video_codecs/video_decoder.h"
    3029#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"
    3330
    3431typedef struct __CVBuffer* CVPixelBufferRef;
     
    3633namespace webrtc {
    3734
    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);
     35struct SdpVideoFormat;
    5436
    5537using WebKitVideoDecoder = void*;
     
    9274using LocalDecoder = void*;
    9375using LocalDecoderCallback = void (^)(CVPixelBufferRef, uint32_t timeStamp, uint32_t timeStampNs);
    94 void* createLocalDecoder(LocalDecoderCallback);
     76void* createLocalH264Decoder(LocalDecoderCallback);
     77void* createLocalH265Decoder(LocalDecoderCallback);
    9578void releaseLocalDecoder(LocalDecoder);
    9679int32_t decodeFrame(LocalDecoder, uint32_t timeStamp, const uint8_t*, size_t);
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitEncoder.mm

    r254050 r259568  
    3535#include "sdk/objc/api/peerconnection/RTCVideoEncoderSettings+Private.h"
    3636#include "sdk/objc/components/video_codec/RTCVideoEncoderH264.h"
     37#include "sdk/objc/components/video_codec/RTCVideoEncoderH265.h"
    3738#include "sdk/objc/native/src/objc_frame_buffer.h"
    3839
     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
    3995namespace webrtc {
    4096
     
    151207{
    152208    auto *codecInfo = [[RTCVideoCodecInfo alloc] initWithNativeSdpVideoFormat: format];
    153     auto *encoder = [[RTCVideoEncoderH264 alloc] initWithCodecInfo:codecInfo];
    154    
     209    auto *encoder = [[WK_RTCLocalVideoH264H265Encoder alloc] initWithCodecInfo:codecInfo];
     210
    155211    [encoder setCallback:^BOOL(RTCEncodedImage *_Nonnull frame, id<RTCCodecSpecificInfo> _Nonnull codecSpecificInfo,  RTCRtpFragmentationHeader *_Nonnull header) {
    156212        EncodedImage encodedImage = [frame nativeEncodedImage];
     
    179235void releaseLocalEncoder(LocalEncoder localEncoder)
    180236{
    181     auto *encoder = (__bridge_transfer RTCVideoEncoderH264 *)(localEncoder);
     237    auto *encoder = (__bridge_transfer WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
    182238    [encoder releaseEncoder];
    183239}
     
    193249    codecSettings.maxFramerate = maxFramerate;
    194250
    195     auto *encoder = (__bridge RTCVideoEncoderH264 *)(localEncoder);
     251    auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
    196252    [encoder startEncodeWithSettings:[[RTCVideoEncoderSettings alloc] initWithNativeVideoCodec:&codecSettings] numberOfCores:1];
    197253}
     
    204260
    205261    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);
    207263    [encoder encode:videoFrame codecSpecificInfo:nil frameTypes:rtcFrameTypes];
    208264}
     
    210266void setLocalEncoderRates(LocalEncoder localEncoder, uint32_t bitRate, uint32_t frameRate)
    211267{
    212     auto *encoder = (__bridge RTCVideoEncoderH264 *)(localEncoder);
     268    auto *encoder = (__bridge WK_RTCLocalVideoH264H265Encoder *)(localEncoder);
    213269    [encoder setBitrate:bitRate framerate:frameRate];
    214270}
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.h

    r259452 r259568  
    5353rtc::scoped_refptr<webrtc::VideoFrameBuffer> pixelBufferToFrame(CVPixelBufferRef);
    5454
    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 
    9855}
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/WebKit/WebKitUtilities.mm

    r259452 r259568  
    187187}
    188188
    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;
    199189}
    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() const
    253 {
    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  
    1717__attribute__((objc_runtime_name("WK_RTCVideoDecoderH265")))
    1818@interface RTCVideoDecoderH265 : NSObject <RTCVideoDecoder>
     19- (NSInteger)decodeData:(const uint8_t *)data
     20    size:(size_t)size
     21    timeStamp:(uint32_t)timeStamp;
    1922@end
  • trunk/Source/ThirdParty/libwebrtc/Source/webrtc/sdk/objc/components/video_codec/RTCVideoDecoderH265.mm

    r259452 r259568  
    9090           renderTimeMs:(int64_t)renderTimeMs {
    9191  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 {
    9396  if (_error != noErr) {
    9497    RTC_LOG(LS_WARNING) << "Last frame decode failed.";
     
    99102  rtc::ScopedCFTypeRef<CMVideoFormatDescriptionRef> inputFormat =
    100103      rtc::ScopedCF(webrtc::CreateH265VideoFormatDescription(
    101           (uint8_t*)inputImage.buffer.bytes, inputImage.buffer.length));
     104          (uint8_t*)data, size));
    102105  if (inputFormat) {
    103106    CMVideoDimensions dimensions =
     
    124127    return WEBRTC_VIDEO_CODEC_ERROR;
    125128  }
     129
    126130  CMSampleBufferRef sampleBuffer = nullptr;
    127131  if (!webrtc::H265AnnexBBufferToCMSampleBuffer(
    128           (uint8_t*)inputImage.buffer.bytes, inputImage.buffer.length,
     132          (uint8_t*)data, size,
    129133          _videoFormat, &sampleBuffer)) {
    130134    return WEBRTC_VIDEO_CODEC_ERROR;
     
    135139  std::unique_ptr<RTCH265FrameDecodeParams> frameDecodeParams;
    136140  frameDecodeParams.reset(
    137       new RTCH265FrameDecodeParams(_callback, inputImage.timeStamp));
     141      new RTCH265FrameDecodeParams(_callback, timeStamp));
    138142  OSStatus status = VTDecompressionSessionDecodeFrame(
    139143      _decompressionSession, sampleBuffer, decodeFlags,
     
    145149      [self resetDecompressionSession] == WEBRTC_VIDEO_CODEC_OK) {
    146150    frameDecodeParams.reset(
    147         new RTCH265FrameDecodeParams(_callback, inputImage.timeStamp));
     151        new RTCH265FrameDecodeParams(_callback, timeStamp));
    148152    status = VTDecompressionSessionDecodeFrame(
    149153        _decompressionSession, sampleBuffer, decodeFlags,
  • trunk/Source/ThirdParty/libwebrtc/libwebrtc.xcodeproj/project.pbxproj

    r259452 r259568  
    19821982                41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41009206242E3A4500C5EDA2 /* RTCVideoEncoderH265.mm */; };
    19831983                41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41009208242E3A4600C5EDA2 /* RTCCodecSpecificInfoH265.mm */; };
     1984                41E84BD524373F7200D34E41 /* WebKitDecoder.mm in Sources */ = {isa = PBXBuildFile; fileRef = 41E84BCA2434C4A300D34E41 /* WebKitDecoder.mm */; };
    19841985                41EA53A51EFC2C14002FF04C /* hmac.c in Sources */ = {isa = PBXBuildFile; fileRef = 41EA53A41EFC2BFD002FF04C /* hmac.c */; };
    19851986                41EA53AB1EFC2C4D002FF04C /* digest.c in Sources */ = {isa = PBXBuildFile; fileRef = 41EA53A71EFC2C4D002FF04C /* digest.c */; };
     
    61366137                41E59E9423ACC1230095A94B /* vp8_rtcd_no_acceleration.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = vp8_rtcd_no_acceleration.h; sourceTree = "<group>"; };
    61376138                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>"; };
    61386141                41EA53A41EFC2BFD002FF04C /* hmac.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; path = hmac.c; sourceTree = "<group>"; };
    61396142                41EA53A71EFC2C4D002FF04C /* digest.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = digest.c; sourceTree = "<group>"; };
     
    91729175                                417953AC2169823D0028266B /* nalu_rewriter.cc */,
    91739176                                411521D521698220000ABAF7 /* nalu_rewriter.h */,
     9177                                417953B2216982410028266B /* RTCCodecSpecificInfoH264+Private.h */,
    91749178                                416225F1216981F300A91C9B /* RTCCodecSpecificInfoH264.h */,
    91759179                                416225ED216981F200A91C9B /* RTCCodecSpecificInfoH264.mm */,
    9176                                 417953B2216982410028266B /* RTCCodecSpecificInfoH264+Private.h */,
     9180                                41009203242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265+Private.h */,
    91779181                                41009202242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265.h */,
    91789182                                41009208242E3A4600C5EDA2 /* RTCCodecSpecificInfoH265.mm */,
    9179                                 41009203242E3A4400C5EDA2 /* RTCCodecSpecificInfoH265+Private.h */,
    91809183                                417953B3216982420028266B /* RTCDefaultVideoDecoderFactory.h */,
    91819184                                417953AD2169823E0028266B /* RTCDefaultVideoDecoderFactory.m */,
     
    98859888                                41ECEAFA20646663009D5141 /* VideoProcessingSoftLink.cpp */,
    98869889                                41ECEAFB20646664009D5141 /* VideoProcessingSoftLink.h */,
     9890                                41E84BC92434C4A200D34E41 /* WebKitDecoder.h */,
     9891                                41E84BCA2434C4A300D34E41 /* WebKitDecoder.mm */,
    98879892                                4158649623BE05E800A0A61E /* WebKitEncoder.h */,
    98889893                                4158649723BE05E900A0A61E /* WebKitEncoder.mm */,
     
    1469314698                                5CDD85E81E43B81000621E92 /* aecm_core.h in Headers */,
    1469414699                                5CDD85E91E43B81000621E92 /* aecm_defines.h in Headers */,
    14695                                 410091E7242E2AA300C5EDA2 /* rtp_format_h265.h in Headers */,
    1469614700                                5C0885271E4A99D200403995 /* aes.h in Headers */,
    1469714701                                5C0885241E4A99D200403995 /* aes_gcm_ossl.h in Headers */,
     
    1503315037                                5CDD8B971E43C2B500621E92 /* encode.h in Headers */,
    1503415038                                5CDD87B61E43BC0500621E92 /* encode_lpc_swb.h in Headers */,
    15035                                 41009209242E3A4600C5EDA2 /* RTCVideoDecoderH265.h in Headers */,
    1503615039                                5CDD8A961E43C00F00621E92 /* encode_neteq_input.h in Headers */,
    1503715040                                418938D8242A69CC007FDC41 /* encode_usage_resource.h in Headers */,
     
    1506615069                                41BE71A6215C463700A7B196 /* expr.h in Headers */,
    1506715070                                5CDD894B1E43BF3A00621E92 /* extended_jitter_report.h in Headers */,
    15068                                 410091FE242E362200C5EDA2 /* h265_vps_parser.h in Headers */,
    1506915071                                5CDD894E1E43BF3A00621E92 /* extended_reports.h in Headers */,
    1507015072                                4131BF46234B88200028A615 /* external_hmac.h in Headers */,
     
    1517215174                                5CD285EB1E6A639F0094FDC8 /* h264_sprop_parameter_sets.h in Headers */,
    1517315175                                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 */,
    1517415180                                41FCBB7221B1FF7400A5DF27 /* hdr_metadata.h in Headers */,
    1517515181                                4131C087234B898D0028A615 /* helpers.h in Headers */,
     
    1550515511                                4131C4B7234C83DD0028A615 /* remote_estimate.h in Headers */,
    1550615512                                5CDD8FE21E43CD6600621E92 /* remote_estimator_proxy.h in Headers */,
    15507                                 410091F9242E362200C5EDA2 /* h265_sps_parser.h in Headers */,
    1550815513                                419C83C51FE247B40040C30F /* remote_ntp_time_estimator.h in Headers */,
    1550915514                                4145E4DA1EF8CC9B00FCF6E6 /* render_buffer.h in Headers */,
     
    1561015615                                413A24561FE1991A00373E99 /* RTCFileVideoCapturer.h in Headers */,
    1561115616                                417953C32169824B0028266B /* RTCH264ProfileLevelId.h in Headers */,
     15617                                4100920E242E3A4600C5EDA2 /* RTCH265ProfileLevelId.h in Headers */,
    1561215618                                417953F9216984BE0028266B /* RTCI420Buffer.h in Headers */,
    1561315619                                413A244E1FE1991A00373E99 /* RTCIceCandidate.h in Headers */,
     
    1563815644                                4131C4EF234C86110028A615 /* rtcp_statistics.h in Headers */,
    1563915645                                419C83031FE20F020040C30F /* rtcp_transceiver.h in Headers */,
    15640                                 410091FD242E362200C5EDA2 /* h265_common.h in Headers */,
    1564115646                                419C83011FE20F020040C30F /* rtcp_transceiver_config.h in Headers */,
    1564215647                                419C83051FE20F020040C30F /* rtcp_transceiver_impl.h in Headers */,
     
    1566815673                                417953C52169824B0028266B /* RTCVideoDecoderFactoryH264.h in Headers */,
    1566915674                                417953C62169824B0028266B /* RTCVideoDecoderH264.h in Headers */,
     15675                                41009209242E3A4600C5EDA2 /* RTCVideoDecoderH265.h in Headers */,
    1567015676                                413A24651FE1991A00373E99 /* RTCVideoDecoderVP8.h in Headers */,
    1567115677                                413F4D7022B0BAEF006A7A6B /* RTCVideoDecoderVP8.h in Headers */,
     
    1568415690                                413E678F216987DB00EF37ED /* RTCVideoFrame.h in Headers */,
    1568515691                                413E6791216987DB00EF37ED /* RTCVideoFrameBuffer.h in Headers */,
    15686                                 410091ED242E317400C5EDA2 /* h265_vps_sps_pps_tracker.h in Headers */,
    1568715692                                413A24411FE1991A00373E99 /* RTCVideoFrameBuffer.h in Headers */,
    1568815693                                413A246F1FE1991A00373E99 /* RTCVideoRenderer.h in Headers */,
     
    1570315708                                5CDD88B11E43BE3C00621E92 /* rtp_format.h in Headers */,
    1570415709                                5CDD88A51E43BE3C00621E92 /* rtp_format_h264.h in Headers */,
     15710                                410091E7242E2AA300C5EDA2 /* rtp_format_h265.h in Headers */,
    1570515711                                5CDD88A71E43BE3C00621E92 /* rtp_format_video_generic.h in Headers */,
    1570615712                                5CDD88AC1E43BE3C00621E92 /* rtp_format_vp8.h in Headers */,
     
    1602316029                                4102F6CF212733B7006AE8D7 /* video_quality_observer.h in Headers */,
    1602416030                                419C82C41FE20DCD0040C30F /* video_receive_stream.h in Headers */,
    16025                                 4100920E242E3A4600C5EDA2 /* RTCH265ProfileLevelId.h in Headers */,
    1602616031                                5CDD85CB1E43B5C000621E92 /* video_receive_stream.h in Headers */,
    1602716032                                41893A17242A757A007FDC41 /* video_receiver2.h in Headers */,
     
    1742117426                                5CDD86401E43B8B500621E92 /* auto_corr_to_refl_coef.c in Sources */,
    1742217427                                5CDD86411E43B8B500621E92 /* auto_correlation.c in Sources */,
    17423                                 41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */,
    1742417428                                4131C405234C7B7E0028A615 /* auto_correlation.cc in Sources */,
    1742517429                                5CDD8A071E43BFB300621E92 /* background_noise.cc in Sources */,
     
    1759917603                                5CD285BE1E6A63430094FDC8 /* echo_remover_metrics.cc in Sources */,
    1760017604                                5CDD8B961E43C2B500621E92 /* encode.c in Sources */,
    17601                                 41E84BD224373C1400D34E41 /* RTCVideoDecoderH265.mm in Sources */,
    1760217605                                5CDD87B71E43BC0500621E92 /* encode.c in Sources */,
    1760317606                                41433D121F79B33400387B4D /* encode.c in Sources */,
     
    1772417727                                5CD285EA1E6A639F0094FDC8 /* h264_sprop_parameter_sets.cc in Sources */,
    1772517728                                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 */,
    1772617734                                41FCBB7121B1FF7400A5DF27 /* hdr_metadata.cc in Sources */,
    1772717735                                4131C068234B898D0028A615 /* helpers.cc in Sources */,
     
    1776217770                                5CDD8BBF1E43C2B500621E92 /* interpolate.c in Sources */,
    1776317771                                5CDD8BBD1E43C2B500621E92 /* interpolate_samples.c in Sources */,
    17764                                 41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */,
    1776517772                                415F1FB221272FBA00064CBF /* interpolated_gain_curve.cc in Sources */,
    1776617773                                419C829A1FE20CA10040C30F /* interval_budget.cc in Sources */,
     
    1779217799                                41294092212E128D00AD95E7 /* libvpx_vp8_encoder.cc in Sources */,
    1779317800                                416D3BE6212731C200775F09 /* limiter.cc in Sources */,
    17794                                 41E84BCF24373BE200D34E41 /* h265_sps_parser.cc in Sources */,
    1779517801                                4131C4C5234C84520028A615 /* link_capacity_estimator.cc in Sources */,
    1779617802                                4131BF4A234B88200028A615 /* local_audio_source.cc in Sources */,
     
    1780817814                                5CDD8BC11E43C2B500621E92 /* lpc_encode.c in Sources */,
    1780917815                                5CDD87C71E43BC0500621E92 /* lpc_gain_swb_tables.c in Sources */,
    17810                                 410091E6242E2AA300C5EDA2 /* rtp_format_h265.cc in Sources */,
    1781117816                                41433CEE1F79B33400387B4D /* lpc_masking_model.c in Sources */,
    1781217817                                5CDD87C91E43BC0500621E92 /* lpc_shape_swb12_tables.c in Sources */,
     
    1783717842                                4131C315234B8DC20028A615 /* media_stream_interface.cc in Sources */,
    1783817843                                4131BF25234B88200028A615 /* media_stream_observer.cc in Sources */,
    17839                                 41E84BD024373BE600D34E41 /* h265_vps_parser.cc in Sources */,
    1784017844                                418939F7242A74F8007FDC41 /* media_transport_config.cc in Sources */,
    1784117845                                418939F6242A74F8007FDC41 /* media_transport_interface.cc in Sources */,
     
    1790617910                                4131C1B5234B8A4A0028A615 /* p2p_constants.cc in Sources */,
    1790717911                                4131C1D4234B8A4B0028A615 /* p2p_transport_channel.cc in Sources */,
    17908                                 41E84BD124373C0700D34E41 /* h265_vps_sps_pps_tracker.cc in Sources */,
    1790917912                                41F2639A21267F5E00274F59 /* pa_ringbuffer.c in Sources */,
    1791017913                                5CDD8FA21E43CCBE00621E92 /* paced_sender.cc in Sources */,
     
    1808318086                                419C841D1FE24AEF0040C30F /* rtc_stream_config.cc in Sources */,
    1808418087                                417953CC216982DB0028266B /* RTCCodecSpecificInfoH264.mm in Sources */,
     18088                                41E84BD424373C2900D34E41 /* RTCCodecSpecificInfoH265.mm in Sources */,
    1808518089                                413E678B216987B900EF37ED /* RTCCVPixelBuffer.mm in Sources */,
    1808618090                                417953B5216982420028266B /* RTCDefaultVideoDecoderFactory.m in Sources */,
     
    1808918093                                417953FA216984BE0028266B /* RTCEncodedImage.m in Sources */,
    1809018094                                4144B3D621698A1A004363AC /* RTCH264ProfileLevelId.mm in Sources */,
     18095                                4100920A242E3A4600C5EDA2 /* RTCH265ProfileLevelId.mm in Sources */,
    1809118096                                4144B3D32169896D004363AC /* RTCNativeI420Buffer.mm in Sources */,
    1809218097                                4144B3D121698967004363AC /* RTCNativeMutableI420Buffer.mm in Sources */,
     
    1810818113                                413E67982169883900EF37ED /* RTCVideoCodecInfo.m in Sources */,
    1810918114                                417953B8216982420028266B /* RTCVideoDecoderFactoryH264.m in Sources */,
    18110                                 41E84BCE24373BDE00D34E41 /* h265_pps_parser.cc in Sources */,
    1811118115                                417953C72169824B0028266B /* RTCVideoDecoderH264.mm in Sources */,
     18116                                41E84BD224373C1400D34E41 /* RTCVideoDecoderH265.mm in Sources */,
    1811218117                                413E67682169854B00EF37ED /* RTCVideoDecoderVP8.mm in Sources */,
    1811318118                                417953B9216982420028266B /* RTCVideoEncoderFactoryH264.m in Sources */,
    1811418119                                417953CA2169824B0028266B /* RTCVideoEncoderH264.mm in Sources */,
     18120                                41E84BD324373C1A00D34E41 /* RTCVideoEncoderH265.mm in Sources */,
    1811518121                                413E67A32169889500EF37ED /* RTCVideoEncoderQpThresholds.m in Sources */,
    1811618122                                4144B3F7216B09CB004363AC /* RTCVideoEncoderSettings+Private.mm in Sources */,
     
    1813018136                                5CDD88B01E43BE3C00621E92 /* rtp_format.cc in Sources */,
    1813118137                                5CDD88A41E43BE3C00621E92 /* rtp_format_h264.cc in Sources */,
     18138                                410091E6242E2AA300C5EDA2 /* rtp_format_h265.cc in Sources */,
    1813218139                                5CDD88A61E43BE3C00621E92 /* rtp_format_video_generic.cc in Sources */,
    1813318140                                5CDD88AB1E43BE3C00621E92 /* rtp_format_vp8.cc in Sources */,
     
    1831218319                                5CDD8A5A1E43BFB300621E92 /* time_stretch.cc in Sources */,
    1831318320                                5CDD88DA1E43BE3D00621E92 /* time_util.cc in Sources */,
    18314                                 4100920A242E3A4600C5EDA2 /* RTCH265ProfileLevelId.mm in Sources */,
    1831518321                                4131C14A234B89E20028A615 /* time_utils.cc in Sources */,
    1831618322                                419241E321275A3000634FCF /* timestamp.cc in Sources */,
     
    1843118437                                5C4B4C831E431F9C002651C8 /* wav_header.cc in Sources */,
    1843218438                                4131C0F9234B89E20028A615 /* weak_ptr.cc in Sources */,
     18439                                41E84BD524373F7200D34E41 /* WebKitDecoder.mm in Sources */,
    1843318440                                4158649923BE05E900A0A61E /* WebKitEncoder.mm in Sources */,
    1843418441                                41ECEABE20640498009D5141 /* WebKitUtilities.mm in Sources */,
     
    1843718444                                4131C27A234B8CC40028A615 /* webrtc_media_engine.cc in Sources */,
    1843818445                                4131C278234B8CC40028A615 /* webrtc_media_engine_defaults.cc in Sources */,
    18439                                 410091FF242E362200C5EDA2 /* h265_common.cc in Sources */,
    1844018446                                4131BF50234B88200028A615 /* webrtc_sdp.cc in Sources */,
    1844118447                                4131BEF4234B88200028A615 /* webrtc_session_description_factory.cc in Sources */,
  • trunk/Source/WebKit/ChangeLog

    r259560 r259568  
     12020-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
    1232020-04-05  Don Olmstead  <don.olmstead@sony.com>
    224
  • trunk/Source/WebKit/GPUProcess/webrtc/LibWebRTCCodecsProxy.h

    r254050 r259568  
    6363    // IPC::MessageReceiver
    6464    void didReceiveMessage(IPC::Connection&, IPC::Decoder&) final;
    65     void createDecoder(RTCDecoderIdentifier);
     65    void createH264Decoder(RTCDecoderIdentifier);
     66    void createH265Decoder(RTCDecoderIdentifier);
    6667    void releaseDecoder(RTCDecoderIdentifier);
    6768    void decodeFrame(RTCDecoderIdentifier, uint32_t timeStamp, const IPC::DataReference&);
    6869
    69     void createEncoder(RTCEncoderIdentifier, const Vector<std::pair<String, String>>&);
     70    void createEncoder(RTCEncoderIdentifier, const String&, const Vector<std::pair<String, String>>&);
    7071    void releaseEncoder(RTCEncoderIdentifier);
    7172    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  
    2525
    2626messages -> LibWebRTCCodecsProxy NotRefCounted {
    27     CreateDecoder(WebKit::RTCDecoderIdentifier id)
     27    CreateH264Decoder(WebKit::RTCDecoderIdentifier id)
     28    CreateH265Decoder(WebKit::RTCDecoderIdentifier id)
    2829    ReleaseDecoder(WebKit::RTCDecoderIdentifier id)
    2930    DecodeFrame(WebKit::RTCDecoderIdentifier id, uint32_t timeStamp, IPC::DataReference data)
    3031
    31     CreateEncoder(WebKit::RTCEncoderIdentifier id, Vector<std::pair<String, String>> parameters);
     32    CreateEncoder(WebKit::RTCEncoderIdentifier id, String formatName, Vector<std::pair<String, String>> parameters);
    3233    ReleaseEncoder(WebKit::RTCEncoderIdentifier id)
    3334    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  
    3535#include <WebCore/LibWebRTCMacros.h>
    3636#include <WebCore/RemoteVideoSample.h>
     37#include <webrtc/sdk/WebKit/WebKitDecoder.h>
    3738#include <webrtc/sdk/WebKit/WebKitEncoder.h>
    38 #include <webrtc/sdk/WebKit/WebKitUtilities.h>
    3939#include <wtf/MediaTime.h>
    4040
     
    5454}
    5555
    56 void LibWebRTCCodecsProxy::createDecoder(RTCDecoderIdentifier identifier)
     56void LibWebRTCCodecsProxy::createH264Decoder(RTCDecoderIdentifier identifier)
    5757{
    5858    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
     65void 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) {
    6069        if (auto sample = WebCore::RemoteVideoSample::create(pixelBuffer, MediaTime(timeStampNs, 1)))
    6170            m_gpuConnectionToWebProcess.connection().send(Messages::LibWebRTCCodecs::CompletedDecoding { identifier, timeStamp, *sample }, 0);
     
    8190}
    8291
    83 void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const Vector<std::pair<String, String>>& parameters)
     92void LibWebRTCCodecsProxy::createEncoder(RTCEncoderIdentifier identifier, const String& formatName, const Vector<std::pair<String, String>>& parameters)
    8493{
    8594    ASSERT(!m_encoders.contains(identifier));
     
    8998        rtcParameters.emplace(parameter.first.utf8().data(), parameter.second.utf8().data());
    9099   
    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) {
    92101       
    93102        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  
    3636#include <WebCore/RealtimeVideoUtilities.h>
    3737#include <WebCore/RemoteVideoSample.h>
    38 #include <pal/cf/CoreMediaSoftLink.h>
     38#include <webrtc/sdk/WebKit/WebKitDecoder.h>
    3939#include <webrtc/sdk/WebKit/WebKitEncoder.h>
    4040#include <webrtc/sdk/WebKit/WebKitUtilities.h>
    4141#include <wtf/MainThread.h>
    4242
     43#include <pal/cf/CoreMediaSoftLink.h>
     44
    4345namespace WebKit {
    4446using namespace WebCore;
     
    4648static webrtc::WebKitVideoDecoder createVideoDecoder(const webrtc::SdpVideoFormat& format)
    4749{
    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;
    5257}
    5358
     
    7075static webrtc::WebKitVideoEncoder createVideoEncoder(const webrtc::SdpVideoFormat& format)
    7176{
    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;
    7684}
    7785
     
    149157}
    150158
    151 LibWebRTCCodecs::Decoder* LibWebRTCCodecs::createDecoder()
     159LibWebRTCCodecs::Decoder* LibWebRTCCodecs::createDecoder(Type type)
    152160{
    153161    auto decoder = makeUnique<Decoder>();
     
    155163    decoder->identifier = RTCDecoderIdentifier::generateThreadSafe();
    156164
    157     callOnMainRunLoop([this, decoder = WTFMove(decoder)]() mutable {
     165    callOnMainRunLoop([this, decoder = WTFMove(decoder), type]() mutable {
    158166        decoder->connection = &WebProcess::singleton().ensureGPUProcessConnection().connection();
    159167
    160168        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        }
    162177
    163178        ASSERT(!m_decoders.contains(decoderIdentifier));
     
    239254}
    240255
    241 LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoder(const std::map<std::string, std::string>& formatParameters)
     256static 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
     266LibWebRTCCodecs::Encoder* LibWebRTCCodecs::createEncoder(Type type, const std::map<std::string, std::string>& formatParameters)
    242267{
    243268    auto encoder = makeUnique<Encoder>();
     
    249274        parameters.append(std::make_pair(String::fromUTF8(keyValue.first.data(), keyValue.first.length()), String::fromUTF8(keyValue.second.data(), keyValue.second.length())));
    250275
    251     callOnMainRunLoop([this, encoder = WTFMove(encoder), parameters = WTFMove(parameters)]() mutable {
     276    callOnMainRunLoop([this, encoder = WTFMove(encoder), type, parameters = WTFMove(parameters)]() mutable {
    252277        auto encoderIdentifier = encoder->identifier;
    253278        ASSERT(!m_encoders.contains(encoderIdentifier));
    254279
    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);
    256281        m_encoders.add(encoderIdentifier, WTFMove(encoder));
    257282    });
  • trunk/Source/WebKit/WebProcess/GPU/webrtc/LibWebRTCCodecs.h

    r254050 r259568  
    7373    };
    7474
    75     Decoder* createDecoder();
     75    enum class Type { H264, H265 };
     76    Decoder* createDecoder(Type);
    7677    int32_t releaseDecoder(Decoder&);
    7778    int32_t decodeFrame(Decoder&, uint32_t timeStamp, const uint8_t*, size_t);
     
    8788    };
    8889
    89     Encoder* createEncoder(const std::map<std::string, std::string>&);
     90    Encoder* createEncoder(Type, const std::map<std::string, std::string>&);
    9091    int32_t releaseEncoder(Encoder&);
    9192    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.