1 /* 2 * Copyright 2015 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 package org.webrtc; 12 13 import android.support.annotation.Nullable; 14 import org.webrtc.MediaStreamTrack; 15 16 /** Java wrapper for a C++ RtpReceiverInterface. */ 17 public class RtpReceiver { 18 /** Java wrapper for a C++ RtpReceiverObserverInterface*/ 19 public static interface Observer { 20 // Called when the first audio or video packet is received. 21 @CalledByNative("Observer") onFirstPacketReceived(MediaStreamTrack.MediaType media_type)22 public void onFirstPacketReceived(MediaStreamTrack.MediaType media_type); 23 } 24 25 private long nativeRtpReceiver; 26 private long nativeObserver; 27 28 @Nullable private MediaStreamTrack cachedTrack; 29 30 @CalledByNative RtpReceiver(long nativeRtpReceiver)31 public RtpReceiver(long nativeRtpReceiver) { 32 this.nativeRtpReceiver = nativeRtpReceiver; 33 long nativeTrack = nativeGetTrack(nativeRtpReceiver); 34 cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack); 35 } 36 37 @Nullable track()38 public MediaStreamTrack track() { 39 return cachedTrack; 40 } 41 getParameters()42 public RtpParameters getParameters() { 43 checkRtpReceiverExists(); 44 return nativeGetParameters(nativeRtpReceiver); 45 } 46 id()47 public String id() { 48 checkRtpReceiverExists(); 49 return nativeGetId(nativeRtpReceiver); 50 } 51 52 @CalledByNative dispose()53 public void dispose() { 54 checkRtpReceiverExists(); 55 cachedTrack.dispose(); 56 if (nativeObserver != 0) { 57 nativeUnsetObserver(nativeRtpReceiver, nativeObserver); 58 nativeObserver = 0; 59 } 60 JniCommon.nativeReleaseRef(nativeRtpReceiver); 61 nativeRtpReceiver = 0; 62 } 63 SetObserver(Observer observer)64 public void SetObserver(Observer observer) { 65 checkRtpReceiverExists(); 66 // Unset the existing one before setting a new one. 67 if (nativeObserver != 0) { 68 nativeUnsetObserver(nativeRtpReceiver, nativeObserver); 69 } 70 nativeObserver = nativeSetObserver(nativeRtpReceiver, observer); 71 } 72 setFrameDecryptor(FrameDecryptor frameDecryptor)73 public void setFrameDecryptor(FrameDecryptor frameDecryptor) { 74 checkRtpReceiverExists(); 75 nativeSetFrameDecryptor(nativeRtpReceiver, frameDecryptor.getNativeFrameDecryptor()); 76 } 77 checkRtpReceiverExists()78 private void checkRtpReceiverExists() { 79 if (nativeRtpReceiver == 0) { 80 throw new IllegalStateException("RtpReceiver has been disposed."); 81 } 82 } 83 84 // This should increment the reference count of the track. 85 // Will be released in dispose(). nativeGetTrack(long rtpReceiver)86 private static native long nativeGetTrack(long rtpReceiver); nativeGetParameters(long rtpReceiver)87 private static native RtpParameters nativeGetParameters(long rtpReceiver); nativeGetId(long rtpReceiver)88 private static native String nativeGetId(long rtpReceiver); nativeSetObserver(long rtpReceiver, Observer observer)89 private static native long nativeSetObserver(long rtpReceiver, Observer observer); nativeUnsetObserver(long rtpReceiver, long nativeObserver)90 private static native void nativeUnsetObserver(long rtpReceiver, long nativeObserver); nativeSetFrameDecryptor(long rtpReceiver, long nativeFrameDecryptor)91 private static native void nativeSetFrameDecryptor(long rtpReceiver, long nativeFrameDecryptor); 92 }; 93