| Index: webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
|
| diff --git a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
|
| index ecdc716d85297714c37486f40a6810bf38baf817..9c507fc9d1eb46d9bc4c357d89ef4ccedea7473f 100644
|
| --- a/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
|
| +++ b/webrtc/sdk/objc/Framework/Classes/VideoToolbox/objc_video_encoder_factory.mm
|
| @@ -13,6 +13,7 @@
|
| #include <string>
|
|
|
| #import "NSString+StdString.h"
|
| +#import "RTCI420Buffer+Private.h"
|
| #import "RTCVideoCodec+Private.h"
|
| #import "WebRTC/RTCVideoCodec.h"
|
| #import "WebRTC/RTCVideoCodecFactory.h"
|
| @@ -33,6 +34,22 @@
|
| namespace webrtc {
|
|
|
| namespace {
|
| +
|
| +id<RTCVideoFrameBuffer> nativeToRtcFrameBuffer(const rtc::scoped_refptr<VideoFrameBuffer> &buffer) {
|
| + return buffer->type() == VideoFrameBuffer::Type::kNative ?
|
| + static_cast<ObjCFrameBuffer *>(buffer.get())->wrapped_frame_buffer() :
|
| + [[RTCI420Buffer alloc] initWithFrameBuffer:buffer->ToI420()];
|
| +}
|
| +
|
| +RTCVideoFrame *nativeToRtcFrame(const VideoFrame &frame) {
|
| + RTCVideoFrame *rtcFrame =
|
| + [[RTCVideoFrame alloc] initWithBuffer:nativeToRtcFrameBuffer(frame.video_frame_buffer())
|
| + rotation:RTCVideoRotation(frame.rotation())
|
| + timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
|
| + rtcFrame.timeStamp = frame.timestamp();
|
| + return rtcFrame;
|
| +}
|
| +
|
| class ObjCVideoEncoder : public VideoEncoder {
|
| public:
|
| ObjCVideoEncoder(id<RTCVideoEncoder> encoder)
|
| @@ -53,14 +70,13 @@ class ObjCVideoEncoder : public VideoEncoder {
|
| RTCRtpFragmentationHeader *header) {
|
| EncodedImage encodedImage = [frame nativeEncodedImage];
|
|
|
| - // Handle types than can be converted into one of webrtc::CodecSpecificInfo's hard coded
|
| - // cases.
|
| + // Handle types than can be converted into one of CodecSpecificInfo's hard coded cases.
|
| CodecSpecificInfo codecSpecificInfo;
|
| if ([info isKindOfClass:[RTCCodecSpecificInfoH264 class]]) {
|
| codecSpecificInfo = [(RTCCodecSpecificInfoH264 *)info nativeCodecSpecificInfo];
|
| }
|
|
|
| - std::unique_ptr<webrtc::RTPFragmentationHeader> fragmentationHeader =
|
| + std::unique_ptr<RTPFragmentationHeader> fragmentationHeader =
|
| [header createNativeFragmentationHeader];
|
| callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader.release());
|
| }];
|
| @@ -73,17 +89,7 @@ class ObjCVideoEncoder : public VideoEncoder {
|
| int32_t Encode(const VideoFrame &frame,
|
| const CodecSpecificInfo *codec_specific_info,
|
| const std::vector<FrameType> *frame_types) {
|
| - RTC_CHECK(frame.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative);
|
| -
|
| - id<RTCVideoFrameBuffer> frame_buffer =
|
| - static_cast<ObjCFrameBuffer *>(frame.video_frame_buffer().get())->wrapped_frame_buffer();
|
| - RTCVideoFrame *rtcFrame =
|
| - [[RTCVideoFrame alloc] initWithBuffer:frame_buffer
|
| - rotation:RTCVideoRotation(frame.rotation())
|
| - timeStampNs:frame.timestamp_us() * rtc::kNumNanosecsPerMicrosec];
|
| - rtcFrame.timeStamp = frame.timestamp();
|
| -
|
| - // webrtc::CodecSpecificInfo only handles a hard coded list of codecs
|
| + // CodecSpecificInfo only handles a hard coded list of codecs
|
| id<RTCCodecSpecificInfo> rtcCodecSpecificInfo = nil;
|
| if (codec_specific_info) {
|
| if (strcmp(codec_specific_info->codec_name, "H264") == 0) {
|
| @@ -99,8 +105,9 @@ class ObjCVideoEncoder : public VideoEncoder {
|
| [rtcFrameTypes addObject:@(RTCFrameType(frame_types->at(i)))];
|
| }
|
|
|
| - return
|
| - [encoder_ encode:rtcFrame codecSpecificInfo:rtcCodecSpecificInfo frameTypes:rtcFrameTypes];
|
| + return [encoder_ encode:nativeToRtcFrame(frame)
|
| + codecSpecificInfo:rtcCodecSpecificInfo
|
| + frameTypes:rtcFrameTypes];
|
| }
|
|
|
| int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) { return WEBRTC_VIDEO_CODEC_OK; }
|
| @@ -139,8 +146,7 @@ id<RTCVideoEncoderFactory> ObjCVideoEncoderFactory::wrapped_encoder_factory() co
|
| return encoder_factory_;
|
| }
|
|
|
| -webrtc::VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(
|
| - const cricket::VideoCodec &codec) {
|
| +VideoEncoder *ObjCVideoEncoderFactory::CreateVideoEncoder(const cricket::VideoCodec &codec) {
|
| RTCVideoCodecInfo *info = [[RTCVideoCodecInfo alloc] initWithNativeVideoCodec:codec];
|
| id<RTCVideoEncoder> encoder = [encoder_factory_ createEncoder:info];
|
| return new ObjCVideoEncoder(encoder);
|
| @@ -156,7 +162,7 @@ const std::vector<cricket::VideoCodec> &ObjCVideoEncoderFactory::supported_codec
|
| return supported_codecs_;
|
| }
|
|
|
| -void ObjCVideoEncoderFactory::DestroyVideoEncoder(webrtc::VideoEncoder *encoder) {
|
| +void ObjCVideoEncoderFactory::DestroyVideoEncoder(VideoEncoder *encoder) {
|
| delete encoder;
|
| encoder = nullptr;
|
| }
|
|
|