| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. | 2 * Copyright 2017 The WebRTC project authors. All Rights Reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 4 * Use of this source code is governed by a BSD-style license |
| 5 * that can be found in the LICENSE file in the root of the source | 5 * that can be found in the LICENSE file in the root of the source |
| 6 * tree. An additional intellectual property rights grant can be found | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 18 matching lines...) Expand all Loading... |
| 29 | 29 |
| 30 bool IsHighProfileEnabled() { | 30 bool IsHighProfileEnabled() { |
| 31 return webrtc::field_trial::IsEnabled(kHighProfileExperiment); | 31 return webrtc::field_trial::IsEnabled(kHighProfileExperiment); |
| 32 } | 32 } |
| 33 | 33 |
| 34 // H264 specific settings. | 34 // H264 specific settings. |
| 35 @implementation RTCCodecSpecificInfoH264 | 35 @implementation RTCCodecSpecificInfoH264 |
| 36 | 36 |
| 37 @synthesize packetizationMode = _packetizationMode; | 37 @synthesize packetizationMode = _packetizationMode; |
| 38 | 38 |
| 39 - (webrtc::CodecSpecificInfo)toCpp { | 39 - (webrtc::CodecSpecificInfo)nativeCodecSpecificInfo { |
| 40 webrtc::CodecSpecificInfo codecSpecificInfo; | 40 webrtc::CodecSpecificInfo codecSpecificInfo; |
| 41 codecSpecificInfo.codecType = webrtc::kVideoCodecH264; | 41 codecSpecificInfo.codecType = webrtc::kVideoCodecH264; |
| 42 codecSpecificInfo.codec_name = "H264"; | 42 codecSpecificInfo.codec_name = "H264"; |
| 43 codecSpecificInfo.codecSpecific.H264.packetization_mode = | 43 codecSpecificInfo.codecSpecific.H264.packetization_mode = |
| 44 (webrtc::H264PacketizationMode)_packetizationMode; | 44 (webrtc::H264PacketizationMode)_packetizationMode; |
| 45 | 45 |
| 46 return codecSpecificInfo; | 46 return codecSpecificInfo; |
| 47 } | 47 } |
| 48 | 48 |
| 49 @end | 49 @end |
| 50 | 50 |
| 51 namespace { | 51 namespace { |
| 52 | 52 |
| 53 class H264VideoToolboxEncodeCompleteCallback : public webrtc::EncodedImageCallba
ck { | 53 class H264VideoToolboxEncodeCompleteCallback : public webrtc::EncodedImageCallba
ck { |
| 54 public: | 54 public: |
| 55 Result OnEncodedImage(const webrtc::EncodedImage &encoded_image, | 55 Result OnEncodedImage(const webrtc::EncodedImage &encoded_image, |
| 56 const webrtc::CodecSpecificInfo *codec_specific_info, | 56 const webrtc::CodecSpecificInfo *codec_specific_info, |
| 57 const webrtc::RTPFragmentationHeader *fragmentation) { | 57 const webrtc::RTPFragmentationHeader *fragmentation) { |
| 58 RTCEncodedImage *image = [[RTCEncodedImage alloc] initWithNativeEncodedImage
:encoded_image]; | 58 RTCEncodedImage *image = [[RTCEncodedImage alloc] initWithNativeEncodedImage
:encoded_image]; |
| 59 | 59 |
| 60 RTCCodecSpecificInfoH264 *info = [[RTCCodecSpecificInfoH264 alloc] init]; | 60 RTCCodecSpecificInfoH264 *info = [[RTCCodecSpecificInfoH264 alloc] init]; |
| 61 info.packetizationMode = | 61 info.packetizationMode = |
| 62 (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packet
ization_mode; | 62 (RTCH264PacketizationMode)codec_specific_info->codecSpecific.H264.packet
ization_mode; |
| 63 | 63 |
| 64 RTCRtpFragmentationHeader *header = | 64 RTCRtpFragmentationHeader *header = |
| 65 [[RTCRtpFragmentationHeader alloc] initWithFragmentationHeader:fragmenta
tion]; | 65 [[RTCRtpFragmentationHeader alloc] initWithNativeFragmentationHeader:fra
gmentation]; |
| 66 | 66 |
| 67 callback(image, info, header); | 67 callback(image, info, header); |
| 68 return Result(Result::OK, 0); | 68 return Result(Result::OK, 0); |
| 69 } | 69 } |
| 70 | 70 |
| 71 RTCVideoEncoderCallback callback; | 71 RTCVideoEncoderCallback callback; |
| 72 }; | 72 }; |
| 73 | 73 |
| 74 class H264VideoToolboxDecodeCompleteCallback : public webrtc::DecodedImageCallba
ck { | 74 class H264VideoToolboxDecodeCompleteCallback : public webrtc::DecodedImageCallba
ck { |
| 75 public: | 75 public: |
| (...skipping 22 matching lines...) Expand all Loading... |
| 98 } // namespace | 98 } // namespace |
| 99 | 99 |
| 100 // Encoder. | 100 // Encoder. |
| 101 @implementation RTCVideoEncoderH264 { | 101 @implementation RTCVideoEncoderH264 { |
| 102 webrtc::H264VideoToolboxEncoder *_videoToolboxEncoder; | 102 webrtc::H264VideoToolboxEncoder *_videoToolboxEncoder; |
| 103 H264VideoToolboxEncodeCompleteCallback *_toolboxCallback; | 103 H264VideoToolboxEncodeCompleteCallback *_toolboxCallback; |
| 104 } | 104 } |
| 105 | 105 |
| 106 - (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo { | 106 - (instancetype)initWithCodecInfo:(RTCVideoCodecInfo *)codecInfo { |
| 107 if (self = [super init]) { | 107 if (self = [super init]) { |
| 108 cricket::VideoCodec codec = [codecInfo toCpp]; | 108 cricket::VideoCodec codec = [codecInfo nativeVideoCodec]; |
| 109 _videoToolboxEncoder = new webrtc::H264VideoToolboxEncoder(codec); | 109 _videoToolboxEncoder = new webrtc::H264VideoToolboxEncoder(codec); |
| 110 } | 110 } |
| 111 return self; | 111 return self; |
| 112 } | 112 } |
| 113 | 113 |
| 114 - (void)setCallback:(RTCVideoEncoderCallback)callback { | 114 - (void)setCallback:(RTCVideoEncoderCallback)callback { |
| 115 if (!_toolboxCallback) _toolboxCallback = new H264VideoToolboxEncodeCompleteCa
llback(); | 115 if (!_toolboxCallback) _toolboxCallback = new H264VideoToolboxEncodeCompleteCa
llback(); |
| 116 _toolboxCallback->callback = callback; | 116 _toolboxCallback->callback = callback; |
| 117 _videoToolboxEncoder->RegisterEncodeCompleteCallback(_toolboxCallback); | 117 _videoToolboxEncoder->RegisterEncodeCompleteCallback(_toolboxCallback); |
| 118 } | 118 } |
| 119 | 119 |
| 120 - (void)destroy { | 120 - (void)destroy { |
| 121 delete _videoToolboxEncoder; | 121 delete _videoToolboxEncoder; |
| 122 _videoToolboxEncoder = nullptr; | 122 _videoToolboxEncoder = nullptr; |
| 123 delete _toolboxCallback; | 123 delete _toolboxCallback; |
| 124 _toolboxCallback = nullptr; | 124 _toolboxCallback = nullptr; |
| 125 } | 125 } |
| 126 | 126 |
| 127 -(void)dealloc { | 127 -(void)dealloc { |
| 128 // Make sure C++ objects have been properly cleaned up before this | 128 // Make sure C++ objects have been properly cleaned up before this |
| 129 // is dealloc'd. | 129 // is dealloc'd. |
| 130 RTC_DCHECK(!_videoToolboxEncoder); | 130 RTC_DCHECK(!_videoToolboxEncoder); |
| 131 RTC_DCHECK(!_toolboxCallback); | 131 RTC_DCHECK(!_toolboxCallback); |
| 132 } | 132 } |
| 133 | 133 |
| 134 - (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings | 134 - (NSInteger)startEncodeWithSettings:(RTCVideoEncoderSettings *)settings |
| 135 numberOfCores:(int)numberOfCores { | 135 numberOfCores:(int)numberOfCores { |
| 136 std::unique_ptr<webrtc::VideoCodec> codecSettings = [settings toCpp]; | 136 std::unique_ptr<webrtc::VideoCodec> codecSettings = [settings createNativeVide
oEncoderSettings]; |
| 137 return _videoToolboxEncoder->InitEncode( | 137 return _videoToolboxEncoder->InitEncode( |
| 138 codecSettings.release(), numberOfCores, kDefaultPayloadSize); | 138 codecSettings.release(), numberOfCores, kDefaultPayloadSize); |
| 139 } | 139 } |
| 140 | 140 |
| 141 - (NSInteger)releaseEncoder { | 141 - (NSInteger)releaseEncoder { |
| 142 return _videoToolboxEncoder->Release(); | 142 return _videoToolboxEncoder->Release(); |
| 143 } | 143 } |
| 144 | 144 |
| 145 - (NSInteger)encode:(RTCVideoFrame *)frame | 145 - (NSInteger)encode:(RTCVideoFrame *)frame |
| 146 codecSpecificInfo:(id<RTCCodecSpecificInfo>)info | 146 codecSpecificInfo:(id<RTCCodecSpecificInfo>)info |
| 147 frameTypes:(NSArray<NSNumber *> *)frameTypes { | 147 frameTypes:(NSArray<NSNumber *> *)frameTypes { |
| 148 rtc::scoped_refptr<webrtc::VideoFrameBuffer> frameBuffer = | 148 rtc::scoped_refptr<webrtc::VideoFrameBuffer> frameBuffer = |
| 149 new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(frame.buffer); | 149 new rtc::RefCountedObject<webrtc::ObjCFrameBuffer>(frame.buffer); |
| 150 webrtc::VideoFrame videoFrame(frameBuffer, | 150 webrtc::VideoFrame videoFrame(frameBuffer, |
| 151 (webrtc::VideoRotation)frame.rotation, | 151 (webrtc::VideoRotation)frame.rotation, |
| 152 frame.timeStampNs / rtc::kNumNanosecsPerMicrosec
); | 152 frame.timeStampNs / rtc::kNumNanosecsPerMicrosec
); |
| 153 videoFrame.set_timestamp(frame.timeStamp); | 153 videoFrame.set_timestamp(frame.timeStamp); |
| 154 | 154 |
| 155 // Handle types than can be converted into one of webrtc::CodecSpecificInfo's
hard coded cases. | 155 // Handle types than can be converted into one of webrtc::CodecSpecificInfo's
hard coded cases. |
| 156 webrtc::CodecSpecificInfo codecSpecificInfo; | 156 webrtc::CodecSpecificInfo codecSpecificInfo; |
| 157 if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { | 157 if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { |
| 158 codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info toCpp]; | 158 codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInf
o]; |
| 159 } | 159 } |
| 160 | 160 |
| 161 std::vector<webrtc::FrameType> nativeFrameTypes; | 161 std::vector<webrtc::FrameType> nativeFrameTypes; |
| 162 for (NSNumber *frameType in frameTypes) { | 162 for (NSNumber *frameType in frameTypes) { |
| 163 RTCFrameType rtcFrameType = (RTCFrameType)frameType.unsignedIntegerValue; | 163 RTCFrameType rtcFrameType = (RTCFrameType)frameType.unsignedIntegerValue; |
| 164 nativeFrameTypes.push_back((webrtc::FrameType)rtcFrameType); | 164 nativeFrameTypes.push_back((webrtc::FrameType)rtcFrameType); |
| 165 } | 165 } |
| 166 | 166 |
| 167 return _videoToolboxEncoder->Encode(videoFrame, &codecSpecificInfo, &nativeFra
meTypes); | 167 return _videoToolboxEncoder->Encode(videoFrame, &codecSpecificInfo, &nativeFra
meTypes); |
| 168 } | 168 } |
| (...skipping 13 matching lines...) Expand all Loading... |
| 182 - (instancetype)init { | 182 - (instancetype)init { |
| 183 if (self = [super init]) { | 183 if (self = [super init]) { |
| 184 cricket::VideoCodec codec(cricket::kH264CodecName); | 184 cricket::VideoCodec codec(cricket::kH264CodecName); |
| 185 _videoToolboxDecoder = new webrtc::H264VideoToolboxDecoder(); | 185 _videoToolboxDecoder = new webrtc::H264VideoToolboxDecoder(); |
| 186 } | 186 } |
| 187 return self; | 187 return self; |
| 188 } | 188 } |
| 189 | 189 |
| 190 - (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings | 190 - (NSInteger)startDecodeWithSettings:(RTCVideoEncoderSettings *)settings |
| 191 numberOfCores:(int)numberOfCores { | 191 numberOfCores:(int)numberOfCores { |
| 192 std::unique_ptr<webrtc::VideoCodec> codecSettings = [settings toCpp]; | 192 std::unique_ptr<webrtc::VideoCodec> codecSettings = [settings createNativeVide
oEncoderSettings]; |
| 193 return _videoToolboxDecoder->InitDecode(codecSettings.release(), numberOfCores
); | 193 return _videoToolboxDecoder->InitDecode(codecSettings.release(), numberOfCores
); |
| 194 } | 194 } |
| 195 | 195 |
| 196 - (void)setCallback:(RTCVideoDecoderCallback)callback { | 196 - (void)setCallback:(RTCVideoDecoderCallback)callback { |
| 197 if (!_toolboxCallback) _toolboxCallback = new H264VideoToolboxDecodeCompleteCa
llback(); | 197 if (!_toolboxCallback) _toolboxCallback = new H264VideoToolboxDecodeCompleteCa
llback(); |
| 198 _toolboxCallback->callback = callback; | 198 _toolboxCallback->callback = callback; |
| 199 _videoToolboxDecoder->RegisterDecodeCompleteCallback(_toolboxCallback); | 199 _videoToolboxDecoder->RegisterDecodeCompleteCallback(_toolboxCallback); |
| 200 } | 200 } |
| 201 | 201 |
| 202 - (NSInteger)releaseDecoder { | 202 - (NSInteger)releaseDecoder { |
| (...skipping 12 matching lines...) Expand all Loading... |
| 215 // is dealloc'd. | 215 // is dealloc'd. |
| 216 RTC_DCHECK(!_videoToolboxDecoder); | 216 RTC_DCHECK(!_videoToolboxDecoder); |
| 217 RTC_DCHECK(!_toolboxCallback); | 217 RTC_DCHECK(!_toolboxCallback); |
| 218 } | 218 } |
| 219 | 219 |
| 220 - (NSInteger)decode:(RTCEncodedImage *)encodedImage | 220 - (NSInteger)decode:(RTCEncodedImage *)encodedImage |
| 221 missingFrames:(BOOL)missingFrames | 221 missingFrames:(BOOL)missingFrames |
| 222 fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader | 222 fragmentationHeader:(RTCRtpFragmentationHeader *)fragmentationHeader |
| 223 codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info | 223 codecSpecificInfo:(__nullable id<RTCCodecSpecificInfo>)info |
| 224 renderTimeMs:(int64_t)renderTimeMs { | 224 renderTimeMs:(int64_t)renderTimeMs { |
| 225 webrtc::EncodedImage image = [encodedImage toCpp]; | 225 webrtc::EncodedImage image = [encodedImage nativeEncodedImage]; |
| 226 | 226 |
| 227 // Handle types than can be converted into one of webrtc::CodecSpecificInfo's
hard coded cases. | 227 // Handle types than can be converted into one of webrtc::CodecSpecificInfo's
hard coded cases. |
| 228 webrtc::CodecSpecificInfo codecSpecificInfo; | 228 webrtc::CodecSpecificInfo codecSpecificInfo; |
| 229 if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { | 229 if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) { |
| 230 codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info toCpp]; | 230 codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInf
o]; |
| 231 } | 231 } |
| 232 | 232 |
| 233 std::unique_ptr<webrtc::RTPFragmentationHeader> header = [fragmentationHeader
toCpp]; | 233 std::unique_ptr<webrtc::RTPFragmentationHeader> header = |
| 234 [fragmentationHeader createNativeFragmentationHeader]; |
| 234 | 235 |
| 235 return _videoToolboxDecoder->Decode( | 236 return _videoToolboxDecoder->Decode( |
| 236 image, missingFrames, header.release(), &codecSpecificInfo, renderTimeMs); | 237 image, missingFrames, header.release(), &codecSpecificInfo, renderTimeMs); |
| 237 } | 238 } |
| 238 | 239 |
| 239 @end | 240 @end |
| 240 | 241 |
| 241 // Encoder factory. | 242 // Encoder factory. |
| 242 @implementation RTCVideoEncoderFactoryH264 | 243 @implementation RTCVideoEncoderFactoryH264 |
| 243 | 244 |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 284 - (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info { | 285 - (id<RTCVideoDecoder>)createDecoder:(RTCVideoCodecInfo *)info { |
| 285 return [[RTCVideoDecoderH264 alloc] init]; | 286 return [[RTCVideoDecoderH264 alloc] init]; |
| 286 } | 287 } |
| 287 | 288 |
| 288 - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs { | 289 - (NSArray<RTCVideoCodecInfo *> *)supportedCodecs { |
| 289 NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; | 290 NSString *codecName = [NSString stringWithUTF8String:cricket::kH264CodecName]; |
| 290 return @[ [[RTCVideoCodecInfo alloc] initWithPayload:0 name:codecName paramete
rs:@{}] ]; | 291 return @[ [[RTCVideoCodecInfo alloc] initWithPayload:0 name:codecName paramete
rs:@{}] ]; |
| 291 } | 292 } |
| 292 | 293 |
| 293 @end | 294 @end |
| OLD | NEW |