diff options
Diffstat (limited to 'app')
22 files changed, 130 insertions, 237 deletions
diff --git a/app/webrtc/objc/RTCEAGLVideoView+Internal.h b/app/webrtc/objc/RTCEAGLVideoView+Internal.h deleted file mode 100644 index 10df2e3..0000000 --- a/app/webrtc/objc/RTCEAGLVideoView+Internal.h +++ /dev/null @@ -1,36 +0,0 @@ -/* - * libjingle - * Copyright 2014, Google Inc. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * 1. Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * 3. The name of the author may not be used to endorse or promote products - * derived from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED - * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO - * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; - * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, - * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR - * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF - * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#import <Foundation/Foundation.h> - -#import "RTCEAGLVideoView.h" -#import "RTCVideoRenderer.h" - -// TODO(tkchin): Move declaration to implementation file. Exposed here in order -// to support deprecated methods in RTCVideoRenderer. -@interface RTCEAGLVideoView (Internal) <RTCVideoRendererDelegate> -@end diff --git a/app/webrtc/objc/RTCEAGLVideoView.m b/app/webrtc/objc/RTCEAGLVideoView.m index faacef6..c55c87e 100644 --- a/app/webrtc/objc/RTCEAGLVideoView.m +++ b/app/webrtc/objc/RTCEAGLVideoView.m @@ -29,13 +29,12 @@ #error "This file requires ARC support." #endif -#import "RTCEAGLVideoView+Internal.h" +#import "RTCEAGLVideoView.h" #import <GLKit/GLKit.h> +#import "RTCI420Frame.h" #import "RTCOpenGLVideoRenderer.h" -#import "RTCVideoRenderer.h" -#import "RTCVideoTrack.h" // RTCDisplayLinkTimer wraps a CADisplayLink and is set to fire every two screen // refreshes, which should be 30fps. We wrap the display link in order to avoid @@ -105,7 +104,6 @@ RTCDisplayLinkTimer* _timer; GLKView* _glkView; RTCOpenGLVideoRenderer* _glRenderer; - RTCVideoRenderer* _videoRenderer; } - (instancetype)initWithFrame:(CGRect)frame { @@ -152,7 +150,6 @@ // GLKViewDelegate method implemented below. [strongSelf.glkView setNeedsDisplay]; }]; - _videoRenderer = [[RTCVideoRenderer alloc] initWithDelegate:self]; [self setupGL]; } return self; @@ -168,18 +165,6 @@ [_timer invalidate]; } -- (void)setVideoTrack:(RTCVideoTrack*)videoTrack { - if (_videoTrack == videoTrack) { - return; - } - [_videoTrack removeRenderer:_videoRenderer]; - self.i420Frame = nil; - _videoTrack = videoTrack; - [_videoTrack addRenderer:_videoRenderer]; - // TODO(tkchin): potentially handle changes in track state - e.g. render - // black if track fails. -} - #pragma mark - UIView - (void)layoutSubviews { @@ -197,14 +182,31 @@ [_glRenderer drawFrame:self.i420Frame]; } +#pragma mark - RTCVideoRenderer + +// These methods may be called on non-main thread. +- (void)setSize:(CGSize)size { + __weak RTCEAGLVideoView* weakSelf = self; + dispatch_async(dispatch_get_main_queue(), ^{ + RTCEAGLVideoView* strongSelf = weakSelf; + [strongSelf.delegate videoView:strongSelf didChangeVideoSize:size]; + }); +} + +- (void)renderFrame:(RTCI420Frame*)frame { + self.i420Frame = frame; +} + #pragma mark - Private - (void)setupGL { + self.i420Frame = nil; [_glRenderer setupGL]; _timer.isPaused = NO; } - (void)teardownGL { + self.i420Frame = nil; _timer.isPaused = YES; [_glkView deleteDrawable]; [_glRenderer teardownGL]; @@ -219,25 +221,3 @@ } @end - -@implementation RTCEAGLVideoView (Internal) - -#pragma mark - RTCVideoRendererDelegate - -// These methods are called when the video track has frame information to -// provide. This occurs on non-main thread. -- (void)renderer:(RTCVideoRenderer*)renderer - didSetSize:(CGSize)size { - __weak RTCEAGLVideoView* weakSelf = self; - dispatch_async(dispatch_get_main_queue(), ^{ - RTCEAGLVideoView* strongSelf = weakSelf; - [strongSelf.delegate videoView:strongSelf didChangeVideoSize:size]; - }); -} - -- (void)renderer:(RTCVideoRenderer*)renderer - didReceiveFrame:(RTCI420Frame*)frame { - self.i420Frame = frame; -} - -@end diff --git a/app/webrtc/objc/RTCI420Frame.mm b/app/webrtc/objc/RTCI420Frame.mm index 0b50691..9c394e5 100644 --- a/app/webrtc/objc/RTCI420Frame.mm +++ b/app/webrtc/objc/RTCI420Frame.mm @@ -78,6 +78,10 @@ return _videoFrame->GetVPitch(); } +- (BOOL)makeExclusive { + return _videoFrame->MakeExclusive(); +} + @end @implementation RTCI420Frame (Internal) diff --git a/app/webrtc/objc/RTCMediaStream.mm b/app/webrtc/objc/RTCMediaStream.mm index 27d20b8..a72508a 100644 --- a/app/webrtc/objc/RTCMediaStream.mm +++ b/app/webrtc/objc/RTCMediaStream.mm @@ -71,7 +71,7 @@ } - (BOOL)addVideoTrack:(RTCVideoTrack*)track { - if (self.mediaStream->AddTrack(track.videoTrack)) { + if (self.mediaStream->AddTrack(track.nativeVideoTrack)) { [_videoTracks addObject:track]; return YES; } @@ -93,7 +93,8 @@ NSUInteger index = [_videoTracks indexOfObjectIdenticalTo:track]; NSAssert(index != NSNotFound, @"|removeAudioTrack| called on unexpected RTCVideoTrack"); - if (index != NSNotFound && self.mediaStream->RemoveTrack(track.videoTrack)) { + if (index != NSNotFound && + self.mediaStream->RemoveTrack(track.nativeVideoTrack)) { [_videoTracks removeObjectAtIndex:index]; return YES; } diff --git a/app/webrtc/objc/RTCNSGLVideoView.m b/app/webrtc/objc/RTCNSGLVideoView.m index 292e792..7aa4a11 100644 --- a/app/webrtc/objc/RTCNSGLVideoView.m +++ b/app/webrtc/objc/RTCNSGLVideoView.m @@ -33,10 +33,10 @@ #import <CoreVideo/CVDisplayLink.h> #import <OpenGL/gl3.h> +#import "RTCI420Frame.h" #import "RTCOpenGLVideoRenderer.h" -#import "RTCVideoRenderer.h" -@interface RTCNSGLVideoView () <RTCVideoRendererDelegate> +@interface RTCNSGLVideoView () // |i420Frame| is set when we receive a frame from a worker thread and is read // from the display link callback so atomicity is required. @property(atomic, strong) RTCI420Frame* i420Frame; @@ -57,15 +57,6 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, @implementation RTCNSGLVideoView { CVDisplayLinkRef _displayLink; - RTCVideoRenderer* _videoRenderer; -} - -- (instancetype)initWithFrame:(NSRect)frame - pixelFormat:(NSOpenGLPixelFormat*)format { - if (self = [super initWithFrame:frame pixelFormat:format]) { - _videoRenderer = [[RTCVideoRenderer alloc] initWithDelegate:self]; - } - return self; } - (void)dealloc { @@ -109,37 +100,16 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, [super clearGLContext]; } -- (void)setVideoTrack:(RTCVideoTrack*)videoTrack { - if (_videoTrack == videoTrack) { - return; - } - if (_videoTrack) { - [_videoTrack removeRenderer:_videoRenderer]; - CVDisplayLinkStop(_displayLink); - // Clear contents. - self.i420Frame = nil; - [self drawFrame]; - } - _videoTrack = videoTrack; - if (_videoTrack) { - [_videoTrack addRenderer:_videoRenderer]; - CVDisplayLinkStart(_displayLink); - } -} - -#pragma mark - RTCVideoRendererDelegate +#pragma mark - RTCVideoRenderer -// These methods are called when the video track has frame information to -// provide. This occurs on non-main thread. -- (void)renderer:(RTCVideoRenderer*)renderer - didSetSize:(CGSize)size { +// These methods may be called on non-main thread. +- (void)setSize:(CGSize)size { dispatch_async(dispatch_get_main_queue(), ^{ [self.delegate videoView:self didChangeVideoSize:size]; }); } -- (void)renderer:(RTCVideoRenderer*)renderer - didReceiveFrame:(RTCI420Frame*)frame { +- (void)renderFrame:(RTCI420Frame*)frame { self.i420Frame = frame; } @@ -174,9 +144,7 @@ static CVReturn OnDisplayLinkFired(CVDisplayLinkRef displayLink, CGLPixelFormatObj cglPixelFormat = [[self pixelFormat] CGLPixelFormatObj]; CVDisplayLinkSetCurrentCGDisplayFromOpenGLContext( _displayLink, cglContext, cglPixelFormat); - if (_videoTrack) { - CVDisplayLinkStart(_displayLink); - } + CVDisplayLinkStart(_displayLink); } - (void)teardownDisplayLink { diff --git a/app/webrtc/objc/RTCPeerConnection.mm b/app/webrtc/objc/RTCPeerConnection.mm index 925de73..7767f76 100644 --- a/app/webrtc/objc/RTCPeerConnection.mm +++ b/app/webrtc/objc/RTCPeerConnection.mm @@ -68,6 +68,7 @@ class RTCCreateSessionDescriptionObserver [_delegate peerConnection:_peerConnection didCreateSessionDescription:session error:nil]; + delete desc; } virtual void OnFailure(const std::string& error) OVERRIDE { diff --git a/app/webrtc/objc/RTCVideoRenderer+Internal.h b/app/webrtc/objc/RTCVideoRendererAdapter.h index 22e445c..faf0906 100644 --- a/app/webrtc/objc/RTCVideoRenderer+Internal.h +++ b/app/webrtc/objc/RTCVideoRendererAdapter.h @@ -29,8 +29,12 @@ #include "talk/app/webrtc/mediastreaminterface.h" -@interface RTCVideoRenderer (Internal) +@interface RTCVideoRendererAdapter : NSObject -@property(nonatomic, readonly) webrtc::VideoRendererInterface* videoRenderer; +@property(nonatomic, readonly) id<RTCVideoRenderer> videoRenderer; +@property(nonatomic, readonly) + webrtc::VideoRendererInterface* nativeVideoRenderer; + +- (instancetype)initWithVideoRenderer:(id<RTCVideoRenderer>)videoRenderer; @end diff --git a/app/webrtc/objc/RTCVideoRenderer.mm b/app/webrtc/objc/RTCVideoRendererAdapter.mm index 4cfe43a..e29faad 100644 --- a/app/webrtc/objc/RTCVideoRenderer.mm +++ b/app/webrtc/objc/RTCVideoRendererAdapter.mm @@ -29,50 +29,46 @@ #error "This file requires ARC support." #endif -#import "RTCVideoRenderer+Internal.h" +#import "RTCVideoRendererAdapter.h" #import "RTCI420Frame+Internal.h" namespace webrtc { -class RTCVideoRendererAdapter : public VideoRendererInterface { +class RTCVideoRendererNativeAdapter : public VideoRendererInterface { public: - RTCVideoRendererAdapter(RTCVideoRenderer* renderer) { _renderer = renderer; } + RTCVideoRendererNativeAdapter(RTCVideoRendererAdapter* adapter) { + _adapter = adapter; + } virtual void SetSize(int width, int height) OVERRIDE { - [_renderer.delegate renderer:_renderer - didSetSize:CGSizeMake(width, height)]; + [_adapter.videoRenderer setSize:CGSizeMake(width, height)]; } virtual void RenderFrame(const cricket::VideoFrame* frame) OVERRIDE { - if (!_renderer.delegate) { - return; - } RTCI420Frame* i420Frame = [[RTCI420Frame alloc] initWithVideoFrame:frame]; - [_renderer.delegate renderer:_renderer didReceiveFrame:i420Frame]; + [_adapter.videoRenderer renderFrame:i420Frame]; } private: - __weak RTCVideoRenderer* _renderer; + __weak RTCVideoRendererAdapter* _adapter; }; } -@implementation RTCVideoRenderer { - rtc::scoped_ptr<webrtc::RTCVideoRendererAdapter> _adapter; +@implementation RTCVideoRendererAdapter { + id<RTCVideoRenderer> _videoRenderer; + rtc::scoped_ptr<webrtc::RTCVideoRendererNativeAdapter> _adapter; } -- (instancetype)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate { +- (instancetype)initWithVideoRenderer:(id<RTCVideoRenderer>)videoRenderer { + NSParameterAssert(videoRenderer); if (self = [super init]) { - _delegate = delegate; - _adapter.reset(new webrtc::RTCVideoRendererAdapter(self)); + _videoRenderer = videoRenderer; + _adapter.reset(new webrtc::RTCVideoRendererNativeAdapter(self)); } return self; } -@end - -@implementation RTCVideoRenderer (Internal) - -- (webrtc::VideoRendererInterface*)videoRenderer { +- (webrtc::VideoRendererInterface*)nativeVideoRenderer { return _adapter.get(); } diff --git a/app/webrtc/objc/RTCVideoTrack+Internal.h b/app/webrtc/objc/RTCVideoTrack+Internal.h index 03c8f95..5f267ac 100644 --- a/app/webrtc/objc/RTCVideoTrack+Internal.h +++ b/app/webrtc/objc/RTCVideoTrack+Internal.h @@ -34,7 +34,7 @@ @interface RTCVideoTrack (Internal) -@property(nonatomic, assign, readonly) - rtc::scoped_refptr<webrtc::VideoTrackInterface> videoTrack; +@property(nonatomic, readonly) + rtc::scoped_refptr<webrtc::VideoTrackInterface> nativeVideoTrack; @end diff --git a/app/webrtc/objc/RTCVideoTrack.mm b/app/webrtc/objc/RTCVideoTrack.mm index beebde0..959bc6d 100644 --- a/app/webrtc/objc/RTCVideoTrack.mm +++ b/app/webrtc/objc/RTCVideoTrack.mm @@ -32,46 +32,55 @@ #import "RTCVideoTrack+Internal.h" #import "RTCMediaStreamTrack+Internal.h" -#import "RTCVideoRenderer+Internal.h" +#import "RTCVideoRendererAdapter.h" @implementation RTCVideoTrack { - NSMutableArray* _rendererArray; + NSMutableArray* _adapters; } - (id)initWithMediaTrack: (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>) mediaTrack { if (self = [super initWithMediaTrack:mediaTrack]) { - _rendererArray = [NSMutableArray array]; + _adapters = [NSMutableArray array]; } return self; } -- (void)addRenderer:(RTCVideoRenderer*)renderer { - NSAssert1(![self.renderers containsObject:renderer], - @"renderers already contains object [%@]", - [renderer description]); - [_rendererArray addObject:renderer]; - self.videoTrack->AddRenderer(renderer.videoRenderer); -} - -- (void)removeRenderer:(RTCVideoRenderer*)renderer { - NSUInteger index = [self.renderers indexOfObjectIdenticalTo:renderer]; - if (index != NSNotFound) { - [_rendererArray removeObjectAtIndex:index]; - self.videoTrack->RemoveRenderer(renderer.videoRenderer); +- (void)addRenderer:(id<RTCVideoRenderer>)renderer { + // Make sure we don't have this renderer yet. + for (RTCVideoRendererAdapter* adapter in _adapters) { + NSParameterAssert(adapter.videoRenderer != renderer); } + // Create a wrapper that provides a native pointer for us. + RTCVideoRendererAdapter* adapter = + [[RTCVideoRendererAdapter alloc] initWithVideoRenderer:renderer]; + [_adapters addObject:adapter]; + self.nativeVideoTrack->AddRenderer(adapter.nativeVideoRenderer); } -- (NSArray*)renderers { - return [_rendererArray copy]; +- (void)removeRenderer:(id<RTCVideoRenderer>)renderer { + RTCVideoRendererAdapter* adapter = nil; + NSUInteger indexToRemove = NSNotFound; + for (NSUInteger i = 0; i < _adapters.count; i++) { + adapter = _adapters[i]; + if (adapter.videoRenderer == renderer) { + indexToRemove = i; + break; + } + } + if (indexToRemove == NSNotFound) { + return; + } + self.nativeVideoTrack->RemoveRenderer(adapter.nativeVideoRenderer); + [_adapters removeObjectAtIndex:indexToRemove]; } @end @implementation RTCVideoTrack (Internal) -- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)videoTrack { +- (rtc::scoped_refptr<webrtc::VideoTrackInterface>)nativeVideoTrack { return static_cast<webrtc::VideoTrackInterface*>(self.mediaTrack.get()); } diff --git a/app/webrtc/objc/public/RTCEAGLVideoView.h b/app/webrtc/objc/public/RTCEAGLVideoView.h index c38799e..526175f 100644 --- a/app/webrtc/objc/public/RTCEAGLVideoView.h +++ b/app/webrtc/objc/public/RTCEAGLVideoView.h @@ -37,11 +37,10 @@ @end -@class RTCVideoTrack; -// RTCEAGLVideoView renders |videoTrack| onto itself using OpenGLES. -@interface RTCEAGLVideoView : UIView +// RTCEAGLVideoView is an RTCVideoRenderer which renders i420 frames in its +// bounds using OpenGLES 2.0. +@interface RTCEAGLVideoView : UIView <RTCVideoRenderer> -@property(nonatomic, strong) RTCVideoTrack* videoTrack; @property(nonatomic, weak) id<RTCEAGLVideoViewDelegate> delegate; @end diff --git a/app/webrtc/objc/public/RTCI420Frame.h b/app/webrtc/objc/public/RTCI420Frame.h index 737968c..7a8c4d4 100644 --- a/app/webrtc/objc/public/RTCI420Frame.h +++ b/app/webrtc/objc/public/RTCI420Frame.h @@ -43,6 +43,8 @@ @property(nonatomic, readonly) NSInteger uPitch; @property(nonatomic, readonly) NSInteger vPitch; +- (BOOL)makeExclusive; + #ifndef DOXYGEN_SHOULD_SKIP_THIS // Disallow init and don't add to documentation - (id)init __attribute__(( diff --git a/app/webrtc/objc/public/RTCNSGLVideoView.h b/app/webrtc/objc/public/RTCNSGLVideoView.h index fd757cb..0af2dc5 100644 --- a/app/webrtc/objc/public/RTCNSGLVideoView.h +++ b/app/webrtc/objc/public/RTCNSGLVideoView.h @@ -31,7 +31,7 @@ #import <AppKit/NSOpenGLView.h> -#import "RTCVideoTrack.h" +#import "RTCVideoRenderer.h" @class RTCNSGLVideoView; @protocol RTCNSGLVideoViewDelegate @@ -40,9 +40,8 @@ @end -@interface RTCNSGLVideoView : NSOpenGLView +@interface RTCNSGLVideoView : NSOpenGLView <RTCVideoRenderer> -@property(nonatomic, strong) RTCVideoTrack* videoTrack; @property(nonatomic, weak) id<RTCNSGLVideoViewDelegate> delegate; @end diff --git a/app/webrtc/objc/public/RTCVideoRenderer.h b/app/webrtc/objc/public/RTCVideoRenderer.h index 37977ce..3c2baba 100644 --- a/app/webrtc/objc/public/RTCVideoRenderer.h +++ b/app/webrtc/objc/public/RTCVideoRenderer.h @@ -31,34 +31,13 @@ #endif @class RTCI420Frame; -@class RTCVideoRenderer; -// RTCVideoRendererDelegate is a protocol for an object that must be -// implemented to get messages when rendering. -@protocol RTCVideoRendererDelegate<NSObject> +@protocol RTCVideoRenderer<NSObject> // The size of the frame. -- (void)renderer:(RTCVideoRenderer*)renderer didSetSize:(CGSize)size; +- (void)setSize:(CGSize)size; // The frame to be displayed. -- (void)renderer:(RTCVideoRenderer*)renderer - didReceiveFrame:(RTCI420Frame*)frame; - -@end - -// Interface for rendering VideoFrames from a VideoTrack -@interface RTCVideoRenderer : NSObject - -@property(nonatomic, weak) id<RTCVideoRendererDelegate> delegate; - -// Initialize the renderer. Requires a delegate which does the actual drawing -// of frames. -- (instancetype)initWithDelegate:(id<RTCVideoRendererDelegate>)delegate; - -#ifndef DOXYGEN_SHOULD_SKIP_THIS -// Disallow init and don't add to documentation -- (id)init __attribute__(( - unavailable("init is not a supported initializer for this class."))); -#endif /* DOXYGEN_SHOULD_SKIP_THIS */ +- (void)renderFrame:(RTCI420Frame*)frame; @end diff --git a/app/webrtc/objc/public/RTCVideoTrack.h b/app/webrtc/objc/public/RTCVideoTrack.h index 291c923..8385b71 100644 --- a/app/webrtc/objc/public/RTCVideoTrack.h +++ b/app/webrtc/objc/public/RTCVideoTrack.h @@ -27,19 +27,16 @@ #import "RTCMediaStreamTrack.h" -@class RTCVideoRenderer; +@protocol RTCVideoRenderer; // RTCVideoTrack is an ObjectiveC wrapper for VideoTrackInterface. @interface RTCVideoTrack : RTCMediaStreamTrack -// The currently registered renderers. -@property(nonatomic, strong, readonly) NSArray *renderers; - // Register a renderer that will render all frames received on this track. -- (void)addRenderer:(RTCVideoRenderer *)renderer; +- (void)addRenderer:(id<RTCVideoRenderer>)renderer; // Deregister a renderer. -- (void)removeRenderer:(RTCVideoRenderer *)renderer; +- (void)removeRenderer:(id<RTCVideoRenderer>)renderer; #ifndef DOXYGEN_SHOULD_SKIP_THIS // Disallow init and don't add to documentation diff --git a/app/webrtc/objctests/RTCPeerConnectionTest.mm b/app/webrtc/objctests/RTCPeerConnectionTest.mm index 6c5950b..92d3c49 100644 --- a/app/webrtc/objctests/RTCPeerConnectionTest.mm +++ b/app/webrtc/objctests/RTCPeerConnectionTest.mm @@ -46,6 +46,16 @@ #error "This file requires ARC support." #endif +@interface RTCFakeRenderer : NSObject <RTCVideoRenderer> +@end + +@implementation RTCFakeRenderer + +- (void)setSize:(CGSize)size {} +- (void)renderFrame:(RTCI420Frame*)frame {} + +@end + @interface RTCPeerConnectionTest : NSObject // Returns whether the two sessions are of the same type. @@ -80,8 +90,7 @@ RTCMediaStream* localMediaStream = [factory mediaStreamWithLabel:streamLabel]; RTCVideoTrack* videoTrack = [factory videoTrackWithID:videoTrackID source:videoSource]; - RTCVideoRenderer* videoRenderer = - [[RTCVideoRenderer alloc] initWithDelegate:nil]; + RTCFakeRenderer* videoRenderer = [[RTCFakeRenderer alloc] init]; [videoTrack addRenderer:videoRenderer]; [localMediaStream addVideoTrack:videoTrack]; // Test that removal/re-add works. diff --git a/app/webrtc/peerconnection.cc b/app/webrtc/peerconnection.cc index b64caf7..64ddcad 100644 --- a/app/webrtc/peerconnection.cc +++ b/app/webrtc/peerconnection.cc @@ -420,11 +420,6 @@ bool PeerConnection::AddStream(MediaStreamInterface* local_stream) { return true; } -bool PeerConnection::AddStream(MediaStreamInterface* local_stream, - const MediaConstraintsInterface* constraints) { - return AddStream(local_stream); -} - void PeerConnection::RemoveStream(MediaStreamInterface* local_stream) { mediastream_signaling_->RemoveLocalStream(local_stream); if (IsClosed()) { diff --git a/app/webrtc/peerconnection.h b/app/webrtc/peerconnection.h index 355211c..68aa154 100644 --- a/app/webrtc/peerconnection.h +++ b/app/webrtc/peerconnection.h @@ -66,8 +66,6 @@ class PeerConnection : public PeerConnectionInterface, virtual rtc::scoped_refptr<StreamCollectionInterface> local_streams(); virtual rtc::scoped_refptr<StreamCollectionInterface> remote_streams(); virtual bool AddStream(MediaStreamInterface* local_stream); - virtual bool AddStream(MediaStreamInterface* local_stream, - const MediaConstraintsInterface* constraints); virtual void RemoveStream(MediaStreamInterface* local_stream); virtual rtc::scoped_refptr<DtmfSenderInterface> CreateDtmfSender( diff --git a/app/webrtc/peerconnectioninterface.h b/app/webrtc/peerconnectioninterface.h index 68b7879..73a4812 100644 --- a/app/webrtc/peerconnectioninterface.h +++ b/app/webrtc/peerconnectioninterface.h @@ -255,15 +255,7 @@ class PeerConnectionInterface : public rtc::RefCountInterface { // Add a new MediaStream to be sent on this PeerConnection. // Note that a SessionDescription negotiation is needed before the // remote peer can receive the stream. - // TODO(perkj): Make pure virtual once Chrome mocks have implemented. - virtual bool AddStream(MediaStreamInterface* stream) { return false;} - - // Deprecated: - // TODO(perkj): Remove once its not used by Chrome. - virtual bool AddStream(MediaStreamInterface* stream, - const MediaConstraintsInterface* constraints) { - return false; - } + virtual bool AddStream(MediaStreamInterface* stream) = 0; // Remove a MediaStream from this PeerConnection. // Note that a SessionDescription negotiation is need before the @@ -351,10 +343,6 @@ class PeerConnectionObserver { kIceState, }; - // Deprecated. - // TODO(perkj): Remove once its not used by Chrome. - virtual void OnError() {} - // Triggered when the SignalingState changed. virtual void OnSignalingChange( PeerConnectionInterface::SignalingState new_state) {} diff --git a/app/webrtc/peerconnectionproxy.h b/app/webrtc/peerconnectionproxy.h index 571c676..852d852 100644 --- a/app/webrtc/peerconnectionproxy.h +++ b/app/webrtc/peerconnectionproxy.h @@ -40,8 +40,6 @@ BEGIN_PROXY_MAP(PeerConnection) PROXY_METHOD0(rtc::scoped_refptr<StreamCollectionInterface>, remote_streams) PROXY_METHOD1(bool, AddStream, MediaStreamInterface*) - PROXY_METHOD2(bool, AddStream, MediaStreamInterface*, - const MediaConstraintsInterface*); PROXY_METHOD1(void, RemoveStream, MediaStreamInterface*) PROXY_METHOD1(rtc::scoped_refptr<DtmfSenderInterface>, CreateDtmfSender, AudioTrackInterface*) diff --git a/app/webrtc/webrtcsdp.cc b/app/webrtc/webrtcsdp.cc index 23b8f3d..c7b34c4 100644 --- a/app/webrtc/webrtcsdp.cc +++ b/app/webrtc/webrtcsdp.cc @@ -206,7 +206,9 @@ static const char kMediaPortRejected[] = "0"; // draft-ietf-mmusic-trickle-ice-01 // When no candidates have been gathered, set the connection // address to IP6 ::. -static const char kDummyAddress[] = "::"; +// TODO(perkj): FF can not parse IP6 ::. See http://crbug/430333 +// Use IPV4 per default. +static const char kDummyAddress[] = "0.0.0.0"; static const char kDummyPort[] = "9"; // RFC 3556 static const char kApplicationSpecificMaximum[] = "AS"; @@ -675,7 +677,7 @@ static void GetDefaultDestination( const std::vector<Candidate>& candidates, int component_id, std::string* port, std::string* ip, std::string* addr_type) { - *addr_type = kConnectionIpv6Addrtype; + *addr_type = kConnectionIpv4Addrtype; *port = kDummyPort; *ip = kDummyAddress; int current_preference = kPreferenceUnknown; diff --git a/app/webrtc/webrtcsdp_unittest.cc b/app/webrtc/webrtcsdp_unittest.cc index ea590db..8655487 100644 --- a/app/webrtc/webrtcsdp_unittest.cc +++ b/app/webrtc/webrtcsdp_unittest.cc @@ -213,8 +213,8 @@ static const char kSdpString[] = "t=0 0\r\n" "a=msid-semantic: WMS local_stream_1 local_stream_2\r\n" "m=audio 9 RTP/SAVPF 111 103 104\r\n" - "c=IN IP6 ::\r\n" - "a=rtcp:9 IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" "a=mid:audio_content_name\r\n" "a=sendrecv\r\n" @@ -234,8 +234,8 @@ static const char kSdpString[] = "a=ssrc:4 mslabel:local_stream_2\r\n" "a=ssrc:4 label:audio_track_id_2\r\n" "m=video 9 RTP/SAVPF 120\r\n" - "c=IN IP6 ::\r\n" - "a=rtcp:9 IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" "a=mid:video_content_name\r\n" "a=sendrecv\r\n" @@ -262,8 +262,8 @@ static const char kSdpString[] = static const char kSdpRtpDataChannelString[] = "m=application 9 RTP/SAVPF 101\r\n" - "c=IN IP6 ::\r\n" - "a=rtcp:9 IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_data\r\n" "a=ice-pwd:pwd_data\r\n" "a=mid:data_content_name\r\n" @@ -278,7 +278,7 @@ static const char kSdpRtpDataChannelString[] = static const char kSdpSctpDataChannelString[] = "m=application 9 DTLS/SCTP 5000\r\n" - "c=IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_data\r\n" "a=ice-pwd:pwd_data\r\n" "a=mid:data_content_name\r\n" @@ -289,7 +289,7 @@ static const char kSdpSctpDataChannelStringWithSctpPort[] = "m=application 9 DTLS/SCTP webrtc-datachannel\r\n" "a=fmtp:webrtc-datachannel max-message-size=100000\r\n" "a=sctp-port 5000\r\n" - "c=IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_data\r\n" "a=ice-pwd:pwd_data\r\n" "a=mid:data_content_name\r\n"; @@ -316,10 +316,10 @@ static const char kSdpConferenceString[] = "t=0 0\r\n" "a=msid-semantic: WMS\r\n" "m=audio 9 RTP/SAVPF 111 103 104\r\n" - "c=IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" "a=x-google-flag:conference\r\n" "m=video 9 RTP/SAVPF 120\r\n" - "c=IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" "a=x-google-flag:conference\r\n"; static const char kSdpSessionString[] = @@ -331,8 +331,8 @@ static const char kSdpSessionString[] = static const char kSdpAudioString[] = "m=audio 9 RTP/SAVPF 111\r\n" - "c=IN IP6 ::\r\n" - "a=rtcp:9 IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_voice\r\na=ice-pwd:pwd_voice\r\n" "a=mid:audio_content_name\r\n" "a=sendrecv\r\n" @@ -344,8 +344,8 @@ static const char kSdpAudioString[] = static const char kSdpVideoString[] = "m=video 9 RTP/SAVPF 120\r\n" - "c=IN IP6 ::\r\n" - "a=rtcp:9 IN IP6 ::\r\n" + "c=IN IP4 0.0.0.0\r\n" + "a=rtcp:9 IN IP4 0.0.0.0\r\n" "a=ice-ufrag:ufrag_video\r\na=ice-pwd:pwd_video\r\n" "a=mid:video_content_name\r\n" "a=sendrecv\r\n" @@ -1596,7 +1596,7 @@ TEST_F(WebRtcSdpTest, SerializeSessionDescriptionWithDataChannelAndBandwidth) { // TODO(pthatcher): We need to temporarily allow the SDP to control // this for backwards-compatibility. Once we don't need that any // more, remove this. - InjectAfter("m=application 9 RTP/SAVPF 101\r\nc=IN IP6 ::\r\n", + InjectAfter("m=application 9 RTP/SAVPF 101\r\nc=IN IP4 0.0.0.0\r\n", "b=AS:100\r\n", &expected_sdp); EXPECT_EQ(expected_sdp, message); |