Index: webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm |
diff --git a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm |
index d4fa416d0569affe7f2cdbf9bfbe5ab69b3354d8..9b898fa4237ac00b4caa05c3340e7d4c43f005a4 100644 |
--- a/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm |
+++ b/webrtc/sdk/objc/Framework/Classes/PeerConnection/objc_video_encoder_factory.mm |
@@ -25,6 +25,7 @@ |
#include "webrtc/rtc_base/logging.h" |
#include "webrtc/rtc_base/timeutils.h" |
#include "webrtc/sdk/objc/Framework/Classes/Common/helpers.h" |
+#include "webrtc/sdk/objc/Framework/Classes/Video/RTCI420Buffer+Private.h" |
#include "webrtc/sdk/objc/Framework/Classes/Video/objc_frame_buffer.h" |
namespace webrtc { |
@@ -44,9 +45,9 @@ class ObjCVideoEncoder : public VideoEncoder { |
} |
int32_t RegisterEncodeCompleteCallback(EncodedImageCallback *callback) { |
- [encoder_ setCallback:^(RTCEncodedImage *frame, |
- id<RTCCodecSpecificInfo> info, |
- RTCRtpFragmentationHeader *header) { |
+ [encoder_ setCallback:^BOOL(RTCEncodedImage *_Nonnull frame, |
+ id<RTCCodecSpecificInfo> _Nonnull info, |
+ RTCRtpFragmentationHeader *_Nonnull header) { |
EncodedImage encodedImage = [frame toCpp]; |
// Handle types than can be converted into one of webrtc::CodecSpecificInfo's hard coded |
@@ -57,7 +58,10 @@ class ObjCVideoEncoder : public VideoEncoder { |
} |
RTPFragmentationHeader *fragmentationHeader = [header toCpp]; |
- callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader); |
+ |
+ EncodedImageCallback::Result res = |
+ callback->OnEncodedImage(encodedImage, &codecSpecificInfo, fragmentationHeader); |
+ return res.error == EncodedImageCallback::Result::OK; |
}]; |
return WEBRTC_VIDEO_CODEC_OK; |
@@ -68,10 +72,15 @@ 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; |
+ if (frame.video_frame_buffer()->type() == VideoFrameBuffer::Type::kNative) { |
+ frame_buffer = |
+ static_cast<ObjCFrameBuffer *>(frame.video_frame_buffer().get())->wrapped_frame_buffer(); |
+ } else { |
+ frame_buffer = |
+ [[RTCI420Buffer alloc] initWithFrameBuffer:frame.video_frame_buffer()->ToI420()]; |
+ } |
- 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()) |
@@ -101,11 +110,7 @@ class ObjCVideoEncoder : public VideoEncoder { |
int32_t SetChannelParameters(uint32_t packet_loss, int64_t rtt) { return WEBRTC_VIDEO_CODEC_OK; } |
int32_t SetRates(uint32_t bitrate, uint32_t framerate) { |
- if ([encoder_ setBitrate:bitrate framerate:framerate]) { |
- return WEBRTC_VIDEO_CODEC_OK; |
- } else { |
- return WEBRTC_VIDEO_CODEC_ERROR; |
- } |
+ return [encoder_ setBitrate:bitrate framerate:framerate]; |
} |
bool SupportsNativeHandle() const { return true; } |