Skip to content

Commit 1df0941

Browse files
committed
Merge pull request #4 from webrtc-sdk/ios-simulcast
Simulcast support for iOS SDK
1 parent 91945a0 commit 1df0941

File tree

5 files changed

+113
-0
lines changed

5 files changed

+113
-0
lines changed

sdk/BUILD.gn

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -734,6 +734,7 @@ if (is_ios || is_mac) {
734734
]
735735

736736
deps = [
737+
":simulcast",
737738
":base_objc",
738739
":native_video",
739740
":videocodec_objc",
@@ -834,6 +835,22 @@ if (is_ios || is_mac) {
834835
]
835836
}
836837

838+
rtc_library("simulcast") {
839+
sources = [
840+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
841+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.mm",
842+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
843+
"objc/api/video_codec/RTCVideoEncoderSimulcast.mm",
844+
]
845+
846+
deps = [
847+
":base_objc",
848+
":wrapped_native_codec_objc",
849+
"../media:rtc_media_base",
850+
"../media:rtc_simulcast_encoder_adapter",
851+
]
852+
}
853+
837854
rtc_library("mediaconstraints_objc") {
838855
configs += [ "..:no_global_constructors" ]
839856
sources = [
@@ -1304,6 +1321,7 @@ if (is_ios || is_mac) {
13041321
"objc/components/video_codec/RTCVideoDecoderH264.h",
13051322
"objc/components/video_codec/RTCVideoEncoderFactoryH264.h",
13061323
"objc/components/video_codec/RTCVideoEncoderH264.h",
1324+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
13071325
"objc/components/video_frame_buffer/RTCCVPixelBuffer.h",
13081326
"objc/helpers/RTCCameraPreviewView.h",
13091327
"objc/helpers/RTCDispatcher.h",
@@ -1351,6 +1369,7 @@ if (is_ios || is_mac) {
13511369
"objc/api/video_codec/RTCVideoEncoderVP8.h",
13521370
"objc/api/video_codec/RTCVideoEncoderVP9.h",
13531371
"objc/api/video_codec/RTCVideoEncoderAV1.h",
1372+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
13541373
"objc/api/video_frame_buffer/RTCNativeI420Buffer.h",
13551374
"objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h",
13561375
]
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
#import "RTCMacros.h"
2+
#import "RTCVideoEncoder.h"
3+
#import "RTCVideoEncoderFactory.h"
4+
#import "RTCVideoCodecInfo.h"
5+
6+
RTC_OBJC_EXPORT
7+
@interface RTC_OBJC_TYPE (RTCVideoEncoderSimulcast) : NSObject
8+
9+
+ (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)simulcastEncoderWithPrimary:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)primary
10+
fallback:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)fallback
11+
videoCodecInfo:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)videoCodecInfo;
12+
13+
@end
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "RTCMacros.h"
4+
#import "RTCVideoEncoderSimulcast.h"
5+
#import "RTCWrappedNativeVideoEncoder.h"
6+
#import "api/peerconnection/RTCVideoCodecInfo+Private.h"
7+
8+
#include "native/api/video_encoder_factory.h"
9+
#include "media/engine/simulcast_encoder_adapter.h"
10+
11+
@implementation RTC_OBJC_TYPE (RTCVideoEncoderSimulcast)
12+
13+
+ (id<RTC_OBJC_TYPE(RTCVideoEncoder)>)simulcastEncoderWithPrimary:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)primary
14+
fallback:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)fallback
15+
videoCodecInfo:(RTC_OBJC_TYPE(RTCVideoCodecInfo) *)videoCodecInfo {
16+
auto nativePrimary = webrtc::ObjCToNativeVideoEncoderFactory(primary);
17+
auto nativeFallback = webrtc::ObjCToNativeVideoEncoderFactory(fallback);
18+
auto nativeFormat = [videoCodecInfo nativeSdpVideoFormat];
19+
return [[RTC_OBJC_TYPE(RTCWrappedNativeVideoEncoder) alloc]
20+
initWithNativeEncoder: std::make_unique<webrtc::SimulcastEncoderAdapter>(
21+
nativePrimary.release(),
22+
nativeFallback.release(),
23+
std::move(nativeFormat))];
24+
}
25+
26+
@end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "RTCMacros.h"
4+
#import "RTCVideoEncoderFactory.h"
5+
6+
NS_ASSUME_NONNULL_BEGIN
7+
8+
RTC_OBJC_EXPORT
9+
@interface RTC_OBJC_TYPE (RTCVideoEncoderFactorySimulcast) : NSObject <RTC_OBJC_TYPE(RTCVideoEncoderFactory)>
10+
11+
- (instancetype)initWithPrimary:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)primary
12+
fallback:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)fallback;
13+
14+
@end
15+
16+
NS_ASSUME_NONNULL_END
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
#import <Foundation/Foundation.h>
2+
3+
#import "RTCMacros.h"
4+
#import "RTCVideoCodecInfo.h"
5+
#import "RTCVideoEncoderFactorySimulcast.h"
6+
#import "api/video_codec/RTCVideoEncoderSimulcast.h"
7+
8+
@interface RTC_OBJC_TYPE (RTCVideoEncoderFactorySimulcast) ()
9+
10+
@property id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)> primary;
11+
@property id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)> fallback;
12+
13+
@end
14+
15+
16+
@implementation RTC_OBJC_TYPE (RTCVideoEncoderFactorySimulcast)
17+
18+
@synthesize primary = _primary;
19+
@synthesize fallback = _fallback;
20+
21+
- (instancetype)initWithPrimary:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)primary
22+
fallback:(id<RTC_OBJC_TYPE(RTCVideoEncoderFactory)>)fallback {
23+
if (self = [super init]) {
24+
_primary = primary;
25+
_fallback = fallback;
26+
}
27+
return self;
28+
}
29+
30+
- (nullable id<RTC_OBJC_TYPE(RTCVideoEncoder)>)createEncoder: (RTC_OBJC_TYPE(RTCVideoCodecInfo) *)info {
31+
return [RTCVideoEncoderSimulcast simulcastEncoderWithPrimary: _primary fallback: _fallback videoCodecInfo: info];
32+
}
33+
34+
- (NSArray<RTC_OBJC_TYPE(RTCVideoCodecInfo) *> *)supportedCodecs {
35+
return [[_primary supportedCodecs] arrayByAddingObjectsFromArray: [_fallback supportedCodecs]];
36+
}
37+
38+
39+
@end

0 commit comments

Comments
 (0)