xref: /aosp_15_r20/external/webrtc/sdk/objc/api/RTCVideoRendererAdapter.mm (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker/*
2*d9f75844SAndroid Build Coastguard Worker *  Copyright 2015 The WebRTC project authors. All Rights Reserved.
3*d9f75844SAndroid Build Coastguard Worker *
4*d9f75844SAndroid Build Coastguard Worker *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker */
10*d9f75844SAndroid Build Coastguard Worker
11*d9f75844SAndroid Build Coastguard Worker#import "RTCVideoRendererAdapter+Private.h"
12*d9f75844SAndroid Build Coastguard Worker#import "base/RTCVideoFrame.h"
13*d9f75844SAndroid Build Coastguard Worker
14*d9f75844SAndroid Build Coastguard Worker#include <memory>
15*d9f75844SAndroid Build Coastguard Worker
16*d9f75844SAndroid Build Coastguard Worker#include "sdk/objc/native/api/video_frame.h"
17*d9f75844SAndroid Build Coastguard Worker
18*d9f75844SAndroid Build Coastguard Workernamespace webrtc {
19*d9f75844SAndroid Build Coastguard Worker
20*d9f75844SAndroid Build Coastguard Workerclass VideoRendererAdapter
21*d9f75844SAndroid Build Coastguard Worker    : public rtc::VideoSinkInterface<webrtc::VideoFrame> {
22*d9f75844SAndroid Build Coastguard Worker public:
23*d9f75844SAndroid Build Coastguard Worker  VideoRendererAdapter(RTCVideoRendererAdapter* adapter) {
24*d9f75844SAndroid Build Coastguard Worker    adapter_ = adapter;
25*d9f75844SAndroid Build Coastguard Worker    size_ = CGSizeZero;
26*d9f75844SAndroid Build Coastguard Worker  }
27*d9f75844SAndroid Build Coastguard Worker
28*d9f75844SAndroid Build Coastguard Worker  void OnFrame(const webrtc::VideoFrame& nativeVideoFrame) override {
29*d9f75844SAndroid Build Coastguard Worker    RTC_OBJC_TYPE(RTCVideoFrame)* videoFrame = NativeToObjCVideoFrame(nativeVideoFrame);
30*d9f75844SAndroid Build Coastguard Worker
31*d9f75844SAndroid Build Coastguard Worker    CGSize current_size = (videoFrame.rotation % 180 == 0)
32*d9f75844SAndroid Build Coastguard Worker                              ? CGSizeMake(videoFrame.width, videoFrame.height)
33*d9f75844SAndroid Build Coastguard Worker                              : CGSizeMake(videoFrame.height, videoFrame.width);
34*d9f75844SAndroid Build Coastguard Worker
35*d9f75844SAndroid Build Coastguard Worker    if (!CGSizeEqualToSize(size_, current_size)) {
36*d9f75844SAndroid Build Coastguard Worker      size_ = current_size;
37*d9f75844SAndroid Build Coastguard Worker      [adapter_.videoRenderer setSize:size_];
38*d9f75844SAndroid Build Coastguard Worker    }
39*d9f75844SAndroid Build Coastguard Worker    [adapter_.videoRenderer renderFrame:videoFrame];
40*d9f75844SAndroid Build Coastguard Worker  }
41*d9f75844SAndroid Build Coastguard Worker
42*d9f75844SAndroid Build Coastguard Worker private:
43*d9f75844SAndroid Build Coastguard Worker  __weak RTCVideoRendererAdapter *adapter_;
44*d9f75844SAndroid Build Coastguard Worker  CGSize size_;
45*d9f75844SAndroid Build Coastguard Worker};
46*d9f75844SAndroid Build Coastguard Worker}
47*d9f75844SAndroid Build Coastguard Worker
48*d9f75844SAndroid Build Coastguard Worker@implementation RTCVideoRendererAdapter {
49*d9f75844SAndroid Build Coastguard Worker  std::unique_ptr<webrtc::VideoRendererAdapter> _adapter;
50*d9f75844SAndroid Build Coastguard Worker}
51*d9f75844SAndroid Build Coastguard Worker
52*d9f75844SAndroid Build Coastguard Worker@synthesize videoRenderer = _videoRenderer;
53*d9f75844SAndroid Build Coastguard Worker
54*d9f75844SAndroid Build Coastguard Worker- (instancetype)initWithNativeRenderer:(id<RTC_OBJC_TYPE(RTCVideoRenderer)>)videoRenderer {
55*d9f75844SAndroid Build Coastguard Worker  NSParameterAssert(videoRenderer);
56*d9f75844SAndroid Build Coastguard Worker  if (self = [super init]) {
57*d9f75844SAndroid Build Coastguard Worker    _videoRenderer = videoRenderer;
58*d9f75844SAndroid Build Coastguard Worker    _adapter.reset(new webrtc::VideoRendererAdapter(self));
59*d9f75844SAndroid Build Coastguard Worker  }
60*d9f75844SAndroid Build Coastguard Worker  return self;
61*d9f75844SAndroid Build Coastguard Worker}
62*d9f75844SAndroid Build Coastguard Worker
63*d9f75844SAndroid Build Coastguard Worker- (rtc::VideoSinkInterface<webrtc::VideoFrame> *)nativeVideoRenderer {
64*d9f75844SAndroid Build Coastguard Worker  return _adapter.get();
65*d9f75844SAndroid Build Coastguard Worker}
66*d9f75844SAndroid Build Coastguard Worker
67*d9f75844SAndroid Build Coastguard Worker@end
68