Skip to content

Commit f928ded

Browse files
committed
Merge pull request #4 from webrtc-sdk/ios-simulcast
Simulcast support for iOS SDK
1 parent 46c451d commit f928ded

File tree

6 files changed

+115
-40
lines changed

6 files changed

+115
-40
lines changed

sdk/BUILD.gn

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

743743
deps = [
744+
":simulcast",
744745
":base_objc",
745746
":native_video",
746747
":videocodec_objc",
@@ -842,6 +843,22 @@ if (is_ios || is_mac) {
842843
]
843844
}
844845

846+
rtc_library("simulcast") {
847+
sources = [
848+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.h",
849+
"objc/components/video_codec/RTCVideoEncoderFactorySimulcast.mm",
850+
"objc/api/video_codec/RTCVideoEncoderSimulcast.h",
851+
"objc/api/video_codec/RTCVideoEncoderSimulcast.mm",
852+
]
853+
854+
deps = [
855+
":base_objc",
856+
":wrapped_native_codec_objc",
857+
"../media:rtc_media_base",
858+
"../media:rtc_simulcast_encoder_adapter",
859+
]
860+
}
861+
845862
rtc_library("mediaconstraints_objc") {
846863
configs += [ "..:no_global_constructors" ]
847864
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

sdk/objc/native/src/audio/audio_device_ios.mm

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -61,16 +61,6 @@
6161
const UInt16 kFixedPlayoutDelayEstimate = 30;
6262
const UInt16 kFixedRecordDelayEstimate = 30;
6363

64-
enum AudioDeviceMessageType : uint32_t {
65-
kMessageTypeInterruptionBegin,
66-
kMessageTypeInterruptionEnd,
67-
kMessageTypeValidRouteChange,
68-
kMessageTypeCanPlayOrRecordChange,
69-
kMessageTypePlayoutGlitchDetected,
70-
kMessageOutputVolumeChange,
71-
kMessageTypeAudioWillRecord,
72-
};
73-
7464
using ios::CheckAndLogError;
7565

7666
#if !defined(NDEBUG)
@@ -372,7 +362,7 @@ static void LogDeviceInfo() {
372362

373363
void AudioDeviceIOS::OnAudioWillRecord() {
374364
RTC_DCHECK(thread_);
375-
thread_->Post(RTC_FROM_HERE, this, kMessageTypeAudioWillRecord);
365+
thread_->PostTask(SafeTask(safety_, [this] { HandleAudioWillRecord(); }));
376366
}
377367

378368
OSStatus AudioDeviceIOS::OnDeliverRecordedData(AudioUnitRenderActionFlags* flags,
@@ -482,34 +472,6 @@ static void LogDeviceInfo() {
482472
return noErr;
483473
}
484474

485-
void AudioDeviceIOS::OnMessage(rtc::Message* msg) {
486-
switch (msg->message_id) {
487-
case kMessageTypeInterruptionBegin:
488-
HandleInterruptionBegin();
489-
break;
490-
case kMessageTypeInterruptionEnd:
491-
HandleInterruptionEnd();
492-
break;
493-
case kMessageTypeValidRouteChange:
494-
HandleValidRouteChange();
495-
break;
496-
case kMessageTypeCanPlayOrRecordChange: {
497-
rtc::TypedMessageData<bool>* data = static_cast<rtc::TypedMessageData<bool>*>(msg->pdata);
498-
HandleCanPlayOrRecordChange(data->data());
499-
delete data;
500-
break;
501-
}
502-
case kMessageTypePlayoutGlitchDetected:
503-
HandlePlayoutGlitchDetected();
504-
break;
505-
case kMessageOutputVolumeChange:
506-
HandleOutputVolumeChange();
507-
break;
508-
case kMessageTypeAudioWillRecord:
509-
HandleAudioWillRecord();
510-
}
511-
}
512-
513475
void AudioDeviceIOS::HandleInterruptionBegin() {
514476
RTC_DCHECK_RUN_ON(thread_);
515477
RTCLog(@"Interruption begin. IsInterrupted changed from %d to 1.", is_interrupted_);
@@ -677,7 +639,7 @@ static void LogDeviceInfo() {
677639
}
678640

679641
void AudioDeviceIOS::HandleAudioWillRecord() {
680-
RTC_DCHECK_RUN_ON(&thread_checker_);
642+
RTC_DCHECK_RUN_ON(&io_thread_checker_);
681643

682644
LOGI() << "HandleAudioWillRecord";
683645

0 commit comments

Comments
 (0)