| Index: webrtc/api/objc/RTCMediaStreamTrack.mm | 
| diff --git a/webrtc/api/objc/RTCMediaStreamTrack.mm b/webrtc/api/objc/RTCMediaStreamTrack.mm | 
| index 25979b38d9a32bd968d531bdc66a5553ec77f4d7..7f24c94f38d785423b32f9b186fd7214fa89685b 100644 | 
| --- a/webrtc/api/objc/RTCMediaStreamTrack.mm | 
| +++ b/webrtc/api/objc/RTCMediaStreamTrack.mm | 
| @@ -47,6 +47,20 @@ | 
| readyState]; | 
| } | 
|  | 
| +- (BOOL)isEqual:(id)object { | 
| +  if (self == object) { | 
| +    return YES; | 
| +  } | 
| +  if (![object isMemberOfClass:[self class]]) { | 
| +    return NO; | 
| +  } | 
| +  return [self isEqualToTrack:(RTCMediaStreamTrack *)object]; | 
| +} | 
| + | 
| +- (NSUInteger)hash { | 
| +  return (NSUInteger)_nativeTrack.get(); | 
| +} | 
| + | 
| #pragma mark - Private | 
|  | 
| - (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { | 
| @@ -64,6 +78,29 @@ | 
| return self; | 
| } | 
|  | 
| +- (instancetype)initWithNativeTrack: | 
| +    (rtc::scoped_refptr<webrtc::MediaStreamTrackInterface>)nativeTrack { | 
| +  NSParameterAssert(nativeTrack); | 
| +  if (nativeTrack->kind() == | 
| +      std::string(webrtc::MediaStreamTrackInterface::kAudioKind)) { | 
| +    return [self initWithNativeTrack:nativeTrack | 
| +                                type:RTCMediaStreamTrackTypeAudio]; | 
| +  } | 
| +  if (nativeTrack->kind() == | 
| +      std::string(webrtc::MediaStreamTrackInterface::kVideoKind)) { | 
| +    return [self initWithNativeTrack:nativeTrack | 
| +                                type:RTCMediaStreamTrackTypeVideo]; | 
| +  } | 
| +  return nil; | 
| +} | 
| + | 
| +- (BOOL)isEqualToTrack:(RTCMediaStreamTrack *)track { | 
| +  if (!track) { | 
| +    return NO; | 
| +  } | 
| +  return _nativeTrack == track.nativeTrack; | 
| +} | 
| + | 
| + (webrtc::MediaStreamTrackInterface::TrackState)nativeTrackStateForState: | 
| (RTCMediaStreamTrackState)state { | 
| switch (state) { | 
|  |