mirror of
https://github.com/mollyim/webrtc.git
synced 2025-05-15 06:40:43 +01:00

When injecting video codec factories in the Obj-C SDK, use the new peer connection API that uses webrtc::Video{De,En}CoderFactory classes and does not automatically add internal software codecs. Instead the injected factory can support internal VP8 and VP9 codecs through the included Obj-C classes RTCVideo{De,En}coderVP{8,9}. When not explicitly injecting any video codec factory, the old code path is still used and injects only H264 as an external codec and the internal codec factory is used. Bug: webrtc:7925 Change-Id: I657d30dfde71da9c0be341e213ab9f97a04caa58 Reviewed-on: https://webrtc-review.googlesource.com/3620 Commit-Queue: Anders Carlsson <andersc@webrtc.org> Reviewed-by: Magnus Jedvert <magjed@webrtc.org> Cr-Commit-Position: refs/heads/master@{#20175}
69 lines
2 KiB
Text
69 lines
2 KiB
Text
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
#import "RTCI420Buffer+Private.h"
|
|
#import "RTCVideoFrame+Private.h"
|
|
#import "RTCVideoRendererAdapter+Private.h"
|
|
#import "WebRTC/RTCVideoFrame.h"
|
|
#import "WebRTC/RTCVideoFrameBuffer.h"
|
|
#import "objc_frame_buffer.h"
|
|
|
|
#include <memory>
|
|
|
|
namespace webrtc {
|
|
|
|
class VideoRendererAdapter
|
|
: public rtc::VideoSinkInterface<webrtc::VideoFrame> {
|
|
public:
|
|
VideoRendererAdapter(RTCVideoRendererAdapter* adapter) {
|
|
adapter_ = adapter;
|
|
size_ = CGSizeZero;
|
|
}
|
|
|
|
void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
|
|
RTCVideoFrame* videoFrame = [[RTCVideoFrame alloc] initWithNativeVideoFrame:nativeVideoFrame];
|
|
|
|
CGSize current_size = (videoFrame.rotation % 180 == 0)
|
|
? CGSizeMake(videoFrame.width, videoFrame.height)
|
|
: CGSizeMake(videoFrame.height, videoFrame.width);
|
|
|
|
if (!CGSizeEqualToSize(size_, current_size)) {
|
|
size_ = current_size;
|
|
[adapter_.videoRenderer setSize:size_];
|
|
}
|
|
[adapter_.videoRenderer renderFrame:videoFrame];
|
|
}
|
|
|
|
private:
|
|
__weak RTCVideoRendererAdapter *adapter_;
|
|
CGSize size_;
|
|
};
|
|
}
|
|
|
|
@implementation RTCVideoRendererAdapter {
|
|
std::unique_ptr<webrtc::VideoRendererAdapter> _adapter;
|
|
}
|
|
|
|
@synthesize videoRenderer = _videoRenderer;
|
|
|
|
- (instancetype)initWithNativeRenderer:(id<RTCVideoRenderer>)videoRenderer {
|
|
NSParameterAssert(videoRenderer);
|
|
if (self = [super init]) {
|
|
_videoRenderer = videoRenderer;
|
|
_adapter.reset(new webrtc::VideoRendererAdapter(self));
|
|
}
|
|
return self;
|
|
}
|
|
|
|
- (rtc::VideoSinkInterface<webrtc::VideoFrame> *)nativeVideoRenderer {
|
|
return _adapter.get();
|
|
}
|
|
|
|
@end
|