1/* 2 * Copyright 2016 The WebRTC project authors. All Rights Reserved. 3 * 4 * Use of this source code is governed by a BSD-style license 5 * that can be found in the LICENSE file in the root of the source 6 * tree. An additional intellectual property rights grant can be found 7 * in the file PATENTS. All contributing project authors may 8 * be found in the AUTHORS file in the root of the source tree. 9 */ 10 11#import "RTCRtpCodecParameters+Private.h" 12 13#import "RTCMediaStreamTrack.h" 14#import "helpers/NSString+StdString.h" 15 16#include "media/base/media_constants.h" 17#include "rtc_base/checks.h" 18 19const NSString * const kRTCRtxCodecName = @(cricket::kRtxCodecName); 20const NSString * const kRTCRedCodecName = @(cricket::kRedCodecName); 21const NSString * const kRTCUlpfecCodecName = @(cricket::kUlpfecCodecName); 22const NSString * const kRTCFlexfecCodecName = @(cricket::kFlexfecCodecName); 23const NSString * const kRTCOpusCodecName = @(cricket::kOpusCodecName); 24const NSString * const kRTCIsacCodecName = @(cricket::kIsacCodecName); 25const NSString * const kRTCL16CodecName = @(cricket::kL16CodecName); 26const NSString * const kRTCG722CodecName = @(cricket::kG722CodecName); 27const NSString * const kRTCIlbcCodecName = @(cricket::kIlbcCodecName); 28const NSString * const kRTCPcmuCodecName = @(cricket::kPcmuCodecName); 29const NSString * const kRTCPcmaCodecName = @(cricket::kPcmaCodecName); 30const NSString * const kRTCDtmfCodecName = @(cricket::kDtmfCodecName); 31const NSString * const kRTCComfortNoiseCodecName = 32 @(cricket::kComfortNoiseCodecName); 33const NSString * const kRTCVp8CodecName = @(cricket::kVp8CodecName); 34const NSString * const kRTCVp9CodecName = @(cricket::kVp9CodecName); 35const NSString * const kRTCH264CodecName = @(cricket::kH264CodecName); 36 37@implementation RTC_OBJC_TYPE (RTCRtpCodecParameters) 38 39@synthesize payloadType = _payloadType; 40@synthesize name = _name; 41@synthesize kind = _kind; 42@synthesize clockRate = _clockRate; 43@synthesize numChannels = _numChannels; 44@synthesize parameters = _parameters; 45 46- (instancetype)init { 47 webrtc::RtpCodecParameters nativeParameters; 48 return [self initWithNativeParameters:nativeParameters]; 49} 50 51- (instancetype)initWithNativeParameters: 52 (const webrtc::RtpCodecParameters &)nativeParameters { 53 if (self = [super init]) { 54 _payloadType = nativeParameters.payload_type; 55 _name = [NSString stringForStdString:nativeParameters.name]; 56 switch (nativeParameters.kind) { 57 case cricket::MEDIA_TYPE_AUDIO: 58 _kind = kRTCMediaStreamTrackKindAudio; 59 break; 60 case cricket::MEDIA_TYPE_VIDEO: 61 _kind = kRTCMediaStreamTrackKindVideo; 62 break; 63 case cricket::MEDIA_TYPE_DATA: 64 RTC_DCHECK_NOTREACHED(); 65 break; 66 case cricket::MEDIA_TYPE_UNSUPPORTED: 67 RTC_DCHECK_NOTREACHED(); 68 break; 69 } 70 if (nativeParameters.clock_rate) { 71 _clockRate = [NSNumber numberWithInt:*nativeParameters.clock_rate]; 72 } 73 if (nativeParameters.num_channels) { 74 _numChannels = [NSNumber numberWithInt:*nativeParameters.num_channels]; 75 } 76 NSMutableDictionary *parameters = [NSMutableDictionary dictionary]; 77 for (const auto ¶meter : nativeParameters.parameters) { 78 [parameters setObject:[NSString stringForStdString:parameter.second] 79 forKey:[NSString stringForStdString:parameter.first]]; 80 } 81 _parameters = parameters; 82 } 83 return self; 84} 85 86- (webrtc::RtpCodecParameters)nativeParameters { 87 webrtc::RtpCodecParameters parameters; 88 parameters.payload_type = _payloadType; 89 parameters.name = [NSString stdStringForString:_name]; 90 // NSString pointer comparison is safe here since "kind" is readonly and only 91 // populated above. 92 if (_kind == kRTCMediaStreamTrackKindAudio) { 93 parameters.kind = cricket::MEDIA_TYPE_AUDIO; 94 } else if (_kind == kRTCMediaStreamTrackKindVideo) { 95 parameters.kind = cricket::MEDIA_TYPE_VIDEO; 96 } else { 97 RTC_DCHECK_NOTREACHED(); 98 } 99 if (_clockRate != nil) { 100 parameters.clock_rate = absl::optional<int>(_clockRate.intValue); 101 } 102 if (_numChannels != nil) { 103 parameters.num_channels = absl::optional<int>(_numChannels.intValue); 104 } 105 for (NSString *paramKey in _parameters.allKeys) { 106 std::string key = [NSString stdStringForString:paramKey]; 107 std::string value = [NSString stdStringForString:_parameters[paramKey]]; 108 parameters.parameters[key] = value; 109 } 110 return parameters; 111} 112 113@end 114