| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. | 2 * Copyright 2014 The WebRTC Project Authors. All rights reserved. |
| 3 * | 3 * |
| 4 * Use of this source code is governed by a BSD-style license | 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 | 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 | 6 * tree. An additional intellectual property rights grant can be found |
| 7 * in the file PATENTS. All contributing project authors may | 7 * in the file PATENTS. All contributing project authors may |
| 8 * be found in the AUTHORS file in the root of the source tree. | 8 * be found in the AUTHORS file in the root of the source tree. |
| 9 */ | 9 */ |
| 10 | 10 |
| (...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 43 static NSString * const kARDAppClientErrorDomain = @"ARDAppClient"; | 43 static NSString * const kARDAppClientErrorDomain = @"ARDAppClient"; |
| 44 static NSInteger const kARDAppClientErrorUnknown = -1; | 44 static NSInteger const kARDAppClientErrorUnknown = -1; |
| 45 static NSInteger const kARDAppClientErrorRoomFull = -2; | 45 static NSInteger const kARDAppClientErrorRoomFull = -2; |
| 46 static NSInteger const kARDAppClientErrorCreateSDP = -3; | 46 static NSInteger const kARDAppClientErrorCreateSDP = -3; |
| 47 static NSInteger const kARDAppClientErrorSetSDP = -4; | 47 static NSInteger const kARDAppClientErrorSetSDP = -4; |
| 48 static NSInteger const kARDAppClientErrorInvalidClient = -5; | 48 static NSInteger const kARDAppClientErrorInvalidClient = -5; |
| 49 static NSInteger const kARDAppClientErrorInvalidRoom = -6; | 49 static NSInteger const kARDAppClientErrorInvalidRoom = -6; |
| 50 static NSString * const kARDMediaStreamId = @"ARDAMS"; | 50 static NSString * const kARDMediaStreamId = @"ARDAMS"; |
| 51 static NSString * const kARDAudioTrackId = @"ARDAMSa0"; | 51 static NSString * const kARDAudioTrackId = @"ARDAMSa0"; |
| 52 static NSString * const kARDVideoTrackId = @"ARDAMSv0"; | 52 static NSString * const kARDVideoTrackId = @"ARDAMSv0"; |
| 53 static NSString * const kARDVideoTrackKind = @"video"; |
| 53 | 54 |
| 54 // TODO(tkchin): Add these as UI options. | 55 // TODO(tkchin): Add these as UI options. |
| 55 static BOOL const kARDAppClientEnableTracing = NO; | 56 static BOOL const kARDAppClientEnableTracing = NO; |
| 56 static BOOL const kARDAppClientEnableRtcEventLog = YES; | 57 static BOOL const kARDAppClientEnableRtcEventLog = YES; |
| 57 static int64_t const kARDAppClientAecDumpMaxSizeInBytes = 5e6; // 5 MB. | 58 static int64_t const kARDAppClientAecDumpMaxSizeInBytes = 5e6; // 5 MB. |
| 58 static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. | 59 static int64_t const kARDAppClientRtcEventLogMaxSizeInBytes = 5e6; // 5 MB. |
| 60 static int const kKbpsMultiplier = 1000; |
| 59 | 61 |
| 60 // We need a proxy to NSTimer because it causes a strong retain cycle. When | 62 // We need a proxy to NSTimer because it causes a strong retain cycle. When |
| 61 // using the proxy, |invalidate| must be called before it properly deallocs. | 63 // using the proxy, |invalidate| must be called before it properly deallocs. |
| 62 @interface ARDTimerProxy : NSObject | 64 @interface ARDTimerProxy : NSObject |
| 63 | 65 |
| 64 - (instancetype)initWithInterval:(NSTimeInterval)interval | 66 - (instancetype)initWithInterval:(NSTimeInterval)interval |
| 65 repeats:(BOOL)repeats | 67 repeats:(BOOL)repeats |
| 66 timerHandler:(void (^)(void))timerHandler; | 68 timerHandler:(void (^)(void))timerHandler; |
| 67 - (void)invalidate; | 69 - (void)invalidate; |
| 68 | 70 |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 469 [_peerConnection setLocalDescription:sdpPreferringH264 | 471 [_peerConnection setLocalDescription:sdpPreferringH264 |
| 470 completionHandler:^(NSError *error) { | 472 completionHandler:^(NSError *error) { |
| 471 ARDAppClient *strongSelf = weakSelf; | 473 ARDAppClient *strongSelf = weakSelf; |
| 472 [strongSelf peerConnection:strongSelf.peerConnection | 474 [strongSelf peerConnection:strongSelf.peerConnection |
| 473 didSetSessionDescriptionWithError:error]; | 475 didSetSessionDescriptionWithError:error]; |
| 474 }]; | 476 }]; |
| 475 ARDSessionDescriptionMessage *message = | 477 ARDSessionDescriptionMessage *message = |
| 476 [[ARDSessionDescriptionMessage alloc] | 478 [[ARDSessionDescriptionMessage alloc] |
| 477 initWithDescription:sdpPreferringH264]; | 479 initWithDescription:sdpPreferringH264]; |
| 478 [self sendSignalingMessage:message]; | 480 [self sendSignalingMessage:message]; |
| 481 [self setMaxBitrateForPeerConnectionVideoSender]; |
| 479 }); | 482 }); |
| 480 } | 483 } |
| 481 | 484 |
| 482 - (void)peerConnection:(RTCPeerConnection *)peerConnection | 485 - (void)peerConnection:(RTCPeerConnection *)peerConnection |
| 483 didSetSessionDescriptionWithError:(NSError *)error { | 486 didSetSessionDescriptionWithError:(NSError *)error { |
| 484 dispatch_async(dispatch_get_main_queue(), ^{ | 487 dispatch_async(dispatch_get_main_queue(), ^{ |
| 485 if (error) { | 488 if (error) { |
| 486 RTCLogError(@"Failed to set session description. Error: %@", error); | 489 RTCLogError(@"Failed to set session description. Error: %@", error); |
| 487 [self disconnect]; | 490 [self disconnect]; |
| 488 NSDictionary *userInfo = @{ | 491 NSDictionary *userInfo = @{ |
| (...skipping 184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 673 }]; | 676 }]; |
| 674 } else { | 677 } else { |
| 675 [_channel sendMessage:message]; | 678 [_channel sendMessage:message]; |
| 676 } | 679 } |
| 677 } | 680 } |
| 678 | 681 |
| 679 - (RTCRtpSender *)createVideoSender { | 682 - (RTCRtpSender *)createVideoSender { |
| 680 RTCRtpSender *sender = | 683 RTCRtpSender *sender = |
| 681 [_peerConnection senderWithKind:kRTCMediaStreamTrackKindVideo | 684 [_peerConnection senderWithKind:kRTCMediaStreamTrackKindVideo |
| 682 streamId:kARDMediaStreamId]; | 685 streamId:kARDMediaStreamId]; |
| 683 | |
| 684 [self setMaxBitrate:_maxBitrate forVideoSender:sender]; | |
| 685 | |
| 686 RTCVideoTrack *track = [self createLocalVideoTrack]; | 686 RTCVideoTrack *track = [self createLocalVideoTrack]; |
| 687 if (track) { | 687 if (track) { |
| 688 sender.track = track; | 688 sender.track = track; |
| 689 [_delegate appClient:self didReceiveLocalVideoTrack:track]; | 689 [_delegate appClient:self didReceiveLocalVideoTrack:track]; |
| 690 } | 690 } |
| 691 |
| 691 return sender; | 692 return sender; |
| 692 } | 693 } |
| 693 | 694 |
| 694 - (void)setMaxBitrate:(NSNumber *)maxBitrate forVideoSender:(RTCRtpSender *)send
er { | 695 - (void)setMaxBitrateForPeerConnectionVideoSender { |
| 695 for (RTCRtpEncodingParameters *encoding in sender.parameters.encodings) { | 696 for (RTCRtpSender *sender in _peerConnection.senders) { |
| 696 encoding.maxBitrateBps = maxBitrate; | 697 if (sender.track != nil) { |
| 698 if ([sender.track.kind isEqualToString:kARDVideoTrackKind]) { |
| 699 [self setMaxBitrate:_maxBitrate forVideoSender:sender]; |
| 700 } |
| 701 } |
| 697 } | 702 } |
| 698 } | 703 } |
| 699 | 704 |
| 705 - (void)setMaxBitrate:(NSNumber *)maxBitrate forVideoSender:(RTCRtpSender *)send
er { |
| 706 if (maxBitrate.intValue <= 0) { |
| 707 return; |
| 708 } |
| 709 |
| 710 RTCRtpParameters *parametersToModify = sender.parameters; |
| 711 for (RTCRtpEncodingParameters *encoding in parametersToModify.encodings) { |
| 712 encoding.maxBitrateBps = @(maxBitrate.intValue * kKbpsMultiplier); |
| 713 } |
| 714 [sender setParameters:parametersToModify]; |
| 715 } |
| 716 |
| 700 - (RTCRtpSender *)createAudioSender { | 717 - (RTCRtpSender *)createAudioSender { |
| 701 RTCMediaConstraints *constraints = [self defaultMediaAudioConstraints]; | 718 RTCMediaConstraints *constraints = [self defaultMediaAudioConstraints]; |
| 702 RTCAudioSource *source = [_factory audioSourceWithConstraints:constraints]; | 719 RTCAudioSource *source = [_factory audioSourceWithConstraints:constraints]; |
| 703 RTCAudioTrack *track = [_factory audioTrackWithSource:source | 720 RTCAudioTrack *track = [_factory audioTrackWithSource:source |
| 704 trackId:kARDAudioTrackId]; | 721 trackId:kARDAudioTrackId]; |
| 705 RTCRtpSender *sender = | 722 RTCRtpSender *sender = |
| 706 [_peerConnection senderWithKind:kRTCMediaStreamTrackKindAudio | 723 [_peerConnection senderWithKind:kRTCMediaStreamTrackKindAudio |
| 707 streamId:kARDMediaStreamId]; | 724 streamId:kARDMediaStreamId]; |
| 708 sender.track = track; | 725 sender.track = track; |
| 709 return sender; | 726 return sender; |
| (...skipping 144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 854 code:kARDAppClientErrorInvalidRoom | 871 code:kARDAppClientErrorInvalidRoom |
| 855 userInfo:@{ | 872 userInfo:@{ |
| 856 NSLocalizedDescriptionKey: @"Invalid room.", | 873 NSLocalizedDescriptionKey: @"Invalid room.", |
| 857 }]; | 874 }]; |
| 858 break; | 875 break; |
| 859 } | 876 } |
| 860 return error; | 877 return error; |
| 861 } | 878 } |
| 862 | 879 |
| 863 @end | 880 @end |
| OLD | NEW |