Skip to content

Commit c6f16ff

Browse files
kanatdavidzhao
authored andcommitted
Simulcast support for iOS SDK (#12)
Original credit: https://github.com/shiguredo-webrtc-build/webrtc-build/blob/master/patches/ios_simulcast.patch Co-authored-by: David Zhao <[email protected]> (cherry picked from commit dd9ed63)
1 parent 8505a98 commit c6f16ff

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
@@ -722,6 +722,7 @@ if (is_ios || is_mac) {
722722
]
723723

724724
deps = [
725+
":simulcast",
725726
":base_objc",
726727
":native_video",
727728
":videocodec_objc",
@@ -806,6 +807,22 @@ if (is_ios || is_mac) {
806807
]
807808
}
808809

810+
rtc_library("simulcast") {
811+
sources = [
812+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
813+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.mm",
814+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
815+
"objc/api/video_codec/RTCVideoEncoderSimulcast.mm",
816+
]
817+
818+
deps = [
819+
":base_objc",
820+
":wrapped_native_codec_objc",
821+
"../media:rtc_media_base",
822+
"../media:rtc_simulcast_encoder_adapter",
823+
]
824+
}
825+
809826
rtc_library("libaom_av1_encoder") {
810827
visibility = [ "*" ]
811828
allow_poison = [ "software_video_codecs" ]
@@ -1293,6 +1310,7 @@ if (is_ios || is_mac) {
12931310
"objc/components/video_codec/RTCVideoDecoderH264.h",
12941311
"objc/components/video_codec/RTCVideoEncoderFactoryH264.h",
12951312
"objc/components/video_codec/RTCVideoEncoderH264.h",
1313+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
12961314
"objc/components/video_frame_buffer/RTCCVPixelBuffer.h",
12971315
"objc/helpers/RTCCameraPreviewView.h",
12981316
"objc/helpers/RTCDispatcher.h",
@@ -1343,6 +1361,7 @@ if (is_ios || is_mac) {
13431361
"objc/api/video_codec/RTCVideoEncoderVP8.h",
13441362
"objc/api/video_codec/RTCVideoEncoderVP9.h",
13451363
"objc/api/video_codec/RTCVideoEncoderAV1.h",
1364+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
13461365
"objc/api/video_frame_buffer/RTCNativeI420Buffer.h",
13471366
"objc/api/video_frame_buffer/RTCNativeMutableI420Buffer.h",
13481367
]
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)