Skip to content

Commit

Permalink
feat: Implement passing iOS-specific codec factories into mediasoup d…
Browse files Browse the repository at this point in the history
…evice
  • Loading branch information
fedulvtubudul committed Nov 3, 2021
1 parent a47d7c8 commit 5810826
Show file tree
Hide file tree
Showing 4 changed files with 51 additions and 26 deletions.
7 changes: 2 additions & 5 deletions vl-mediasoup-client-ios/include/MediasoupDevice.h
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@
#ifndef MediasoupDevice_h
#define MediasoupDevice_h

@class RTCPeerConnectionFactoryOptions;
@class SendTransport;
@class RecvTransport;
@protocol SendTransportListener;
Expand Down Expand Up @@ -68,11 +67,10 @@
@param iceCandidates ICE candidates of the server side transport
@param dtlsParameters DTLS parameters of the server side transport
@param sctpParameters SCTP parameters of the server side transport
@param options PeerConnection options
@param appData Custom application data
@return SendTransport
*/
-(SendTransport *)createSendTransport:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData;
-(SendTransport *)createSendTransport:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters appData:(NSString *)appData;
/*!
@brief Creates a new WebRTC transport to <b>receive</b> media
@discussion The transport must be previously created in the mediasoup router
Expand All @@ -93,11 +91,10 @@
@param iceCandidates ICE candidates of the server side transport
@param dtlsParameters DTLS parameters of the server side transport
@param sctpParameters SCTP parameters of the server side transport
@param options PeerConnection options
@param appData Custom application data
@return RecvTransport
*/
-(RecvTransport *)createRecvTransport:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData;
-(RecvTransport *)createRecvTransport:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters appData:(NSString *)appData;
@end

#endif /* Device_h */
6 changes: 3 additions & 3 deletions vl-mediasoup-client-ios/include/wrapper/DeviceWrapper.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,13 +18,13 @@
@interface DeviceWrapper : NSObject {}
+(NSValue *)nativeNewDevice;
+(void)nativeFreeDevice:(NSValue *)nativeDevice;
+(void)nativeLoad:(NSValue *)nativeDevice routerRtpCapabilities:(NSString *)routerRtpCapabilities;
+(void)nativeLoad:(NSValue *)nativeDevice routerRtpCapabilities:(NSString *)routerRtpCapabilities nativePCOptions:(NSValue *)nativePCOptions;
+(bool)nativeIsLoaded:(NSValue *)nativeDevice;
+(NSString *)nativeGetRtpCapabilities:(NSValue *)nativeDevice;
+(NSString *)nativeGetSctpCapabilities:(NSValue *)nativeDevice;
+(bool)nativeCanProduce:(NSValue *)nativeDevice kind:(NSString *)kind;
+(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData;
+(NSValue *)nativeCreateRecvTransport:(NSValue *)nativeDevice listener:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters: (NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData;
+(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters nativePCOptions:(NSValue *)nativePCOptions appData:(NSString *)appData;
+(NSValue *)nativeCreateRecvTransport:(NSValue *)nativeDevice listener:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters: (NSString *)sctpParameters nativePCOptions:(NSValue *)nativePCOptions appData:(NSString *)appData;
@end

#endif /* DeviceWrapper_h */
25 changes: 15 additions & 10 deletions vl-mediasoup-client-ios/src/C++Wrapper/DeviceWrapper.mm
Original file line number Diff line number Diff line change
Expand Up @@ -32,12 +32,17 @@ +(void)nativeFreeDevice:(NSValue *)nativeDevice {
delete reinterpret_cast<mediasoupclient::Device *>([nativeDevice pointerValue]);
}

+(void)nativeLoad:(NSValue *)nativeDevice routerRtpCapabilities:(NSString *)routerRtpCapabilities {
+(void)nativeLoad:(NSValue *)nativeDevice routerRtpCapabilities:(NSString *)routerRtpCapabilities
nativePCOptions:(NSValue *)nativePCOptions {

MSC_TRACE();

try {
nlohmann::json routerRtpCapabilitiesJson = nlohmann::json::parse(std::string([routerRtpCapabilities UTF8String]));
reinterpret_cast<mediasoupclient::Device *>([nativeDevice pointerValue])->Load(routerRtpCapabilitiesJson);

const auto pcOptions = reinterpret_cast<mediasoupclient::PeerConnection::Options *>([nativePCOptions pointerValue]);
const auto device = reinterpret_cast<mediasoupclient::Device *>([nativeDevice pointerValue]);
device->Load(routerRtpCapabilitiesJson, pcOptions);
} catch (const std::exception &e) {
MSC_ERROR("%s", e.what());
NSString *message = [NSString stringWithUTF8String:e.what()];
Expand Down Expand Up @@ -106,7 +111,7 @@ +(bool)nativeCanProduce:(NSValue *)nativeDevice kind:(NSString *)kind {
}
}

+(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData {
+(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters nativePCOptions:(NSValue *)nativePCOptions appData:(NSString *)appData {
MSC_TRACE();

try {
Expand All @@ -120,9 +125,9 @@ +(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendT
if (sctpParameters != nullptr) {
sctpParametersJson = nlohmann::json::parse(std::string([sctpParameters UTF8String]));
}
mediasoupclient::PeerConnection::Options* pcOptions = reinterpret_cast<mediasoupclient::PeerConnection::Options *>(options);

const auto pcOptions = reinterpret_cast<mediasoupclient::PeerConnection::Options *>([nativePCOptions pointerValue]);

nlohmann::json appDataJson = nlohmann::json::object();
if (appData != nullptr) {
appDataJson = nlohmann::json::parse(std::string([appData UTF8String]));
Expand All @@ -142,7 +147,7 @@ +(NSValue *)nativeCreateSendTransport:(NSValue *)nativeDevice listener:(id<SendT
return nullptr;
}

+(NSValue *)nativeCreateRecvTransport:(NSValue *)nativeDevice listener:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData {
+(NSValue *)nativeCreateRecvTransport:(NSValue *)nativeDevice listener:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters nativePCOptions:(NSValue *)nativePCOptions appData:(NSString *)appData {
MSC_TRACE();

try {
Expand All @@ -156,9 +161,9 @@ +(NSValue *)nativeCreateRecvTransport:(NSValue *)nativeDevice listener:(id<RecvT
if (sctpParameters != nullptr) {
sctpParametersJson = nlohmann::json::parse(std::string([sctpParameters UTF8String]));
}
mediasoupclient::PeerConnection::Options* pcOptions = reinterpret_cast<mediasoupclient::PeerConnection::Options *>(options);

const auto pcOptions = reinterpret_cast<mediasoupclient::PeerConnection::Options *>([nativePCOptions pointerValue]);

nlohmann::json appDataJson = nlohmann::json::object();
if (appData != nullptr) {
appDataJson = nlohmann::json::parse(std::string([appData UTF8String]));
Expand Down
39 changes: 31 additions & 8 deletions vl-mediasoup-client-ios/src/MediasoupDevice.mm
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,17 @@

#import "MediasoupDevice.h"
#import "DeviceWrapper.h"
#import <libmediasoupclient/include/PeerConnection.hpp>
#import "peerconnection/RTCPeerConnectionFactory+Private.h"
#import "peerconnection/RTCPeerConnectionFactoryBuilder+DefaultComponents.h"

using namespace mediasoupclient;

@interface MediasoupDevice()
@property(nonatomic, retain) NSValue *nativeDevice;
@property(nonatomic, retain) RTCPeerConnectionFactoryBuilder *pcFactoryBuilder;
@property(nonatomic, retain) RTCPeerConnectionFactory *pcFactory;
@property(nonatomic, retain) NSValue *nativePCOptions;
@end

@implementation MediasoupDevice : NSObject
Expand All @@ -19,6 +27,13 @@ -(instancetype)init {
self = [super init];
if (self) {
self.nativeDevice = [DeviceWrapper nativeNewDevice];

self.pcFactoryBuilder = [RTCPeerConnectionFactoryBuilder defaultBuilder];
self.pcFactory = [self.pcFactoryBuilder createPeerConnectionFactory];
auto pcOptions = new mediasoupclient::PeerConnection::Options();
pcOptions->factory = self.pcFactory.nativeFactory;

self.nativePCOptions = [NSValue valueWithPointer:pcOptions];
}

return self;
Expand All @@ -29,12 +44,20 @@ -(void)dealloc {
[DeviceWrapper nativeFreeDevice: self.nativeDevice];
}
self.nativeDevice = nil;

self.pcFactoryBuilder = nil;

if (self.nativePCOptions != nil && self.nativePCOptions.pointerValue != nullptr) {
delete reinterpret_cast<mediasoupclient::PeerConnection::Options *>(self.nativePCOptions.pointerValue);
}
self.nativePCOptions = nil;

[super dealloc];
}

-(void)load:(NSString *)routerRtpCapabilities {
[self checkDeviceExists];
[DeviceWrapper nativeLoad:self.nativeDevice routerRtpCapabilities:routerRtpCapabilities];
[DeviceWrapper nativeLoad:self.nativeDevice routerRtpCapabilities:routerRtpCapabilities nativePCOptions:self.nativePCOptions];
}

-(bool)isLoaded {
Expand Down Expand Up @@ -62,25 +85,25 @@ -(bool)canProduce:(NSString *)kind {
}

-(SendTransport *)createSendTransport:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters {
return [self createSendTransport:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:nil options:nil appData:nil];
return [self createSendTransport:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:nil appData:nil];
}

-(SendTransport *)createSendTransport:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData {
-(SendTransport *)createSendTransport:(id<SendTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters appData:(NSString *)appData {
[self checkDeviceExists];
NSValue *transport = [DeviceWrapper nativeCreateSendTransport:self.nativeDevice listener:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:sctpParameters options:options appData:appData];

NSValue *transport = [DeviceWrapper nativeCreateSendTransport:self.nativeDevice listener:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:sctpParameters nativePCOptions:self.nativePCOptions appData:appData];

return [[[SendTransport alloc] initWithNativeTransport:transport] autorelease];
}

-(RecvTransport *)createRecvTransport:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters {
return [self createRecvTransport:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:nil options:nil appData:nil];
return [self createRecvTransport:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:nil appData:nil];
}

-(RecvTransport *)createRecvTransport:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters options:(RTCPeerConnectionFactoryOptions *)options appData:(NSString *)appData {
-(RecvTransport *)createRecvTransport:(id<RecvTransportListener>)listener id:(NSString *)id iceParameters:(NSString *)iceParameters iceCandidates:(NSString *)iceCandidates dtlsParameters:(NSString *)dtlsParameters sctpParameters:(NSString *)sctpParameters appData:(NSString *)appData {
[self checkDeviceExists];

NSValue *transport = [DeviceWrapper nativeCreateRecvTransport:self.nativeDevice listener:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:sctpParameters options:options appData:appData];
NSValue *transport = [DeviceWrapper nativeCreateRecvTransport:self.nativeDevice listener:listener id:id iceParameters:iceParameters iceCandidates:iceCandidates dtlsParameters:dtlsParameters sctpParameters:sctpParameters nativePCOptions:self.nativePCOptions appData:appData];

return [[[RecvTransport alloc] initWithNativeTransport:transport] autorelease];
}
Expand Down

0 comments on commit 5810826

Please sign in to comment.