Skip to content

Commit a8c4468

Browse files
cloudwebrtcdavidliu
authored andcommitted
Merge pull request #4 from webrtc-sdk/ios-simulcast
Simulcast support for iOS SDK
1 parent fb9de41 commit a8c4468

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
@@ -676,6 +676,7 @@ if (is_ios || is_mac) {
676676

677677
deps = [
678678
":av1",
679+
":simulcast",
679680
":base_objc",
680681
":native_video",
681682
":videocodec_objc",
@@ -758,6 +759,22 @@ if (is_ios || is_mac) {
758759
}
759760
}
760761

762+
rtc_library("simulcast") {
763+
sources = [
764+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
765+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.mm",
766+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
767+
"objc/api/video_codec/RTCVideoEncoderSimulcast.mm",
768+
]
769+
770+
deps = [
771+
":base_objc",
772+
":wrapped_native_codec_objc",
773+
"../media:rtc_media_base",
774+
"../media:rtc_simulcast_encoder_adapter",
775+
]
776+
}
777+
761778
# Build the PeerConnectionFactory without audio/video support.
762779
# This target depends on the objc_peeerconnectionfactory_base which still
763780
# includes some audio/video related objects such as RTCAudioSource because
@@ -1250,6 +1267,7 @@ if (is_ios || is_mac) {
12501267
"objc/components/video_codec/RTCVideoDecoderH264.h",
12511268
"objc/components/video_codec/RTCVideoEncoderFactoryH264.h",
12521269
"objc/components/video_codec/RTCVideoEncoderH264.h",
1270+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
12531271
"objc/components/video_frame_buffer/RTCCVPixelBuffer.h",
12541272
"objc/helpers/RTCCameraPreviewView.h",
12551273
"objc/helpers/RTCDispatcher.h",
@@ -1297,6 +1315,7 @@ if (is_ios || is_mac) {
12971315
"objc/api/video_codec/RTCVideoEncoderVP8.h",
12981316
"objc/api/video_codec/RTCVideoEncoderVP9.h",
12991317
"objc/api/video_codec/RTCVideoEncoderAV1.h",
1318+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
13001319
"objc/api/video_frame_buffer/RTCNativeI420Buffer.h",
13011320
"objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h",
13021321
]
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)