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 androidx.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 /** Returns a pointer to webrtc::RtpReceiverInterface. */ getNativeRtpReceiver()53 long getNativeRtpReceiver() { 54 checkRtpReceiverExists(); 55 return nativeRtpReceiver; 56 } 57 58 @CalledByNative dispose()59 public void dispose() { 60 checkRtpReceiverExists(); 61 cachedTrack.dispose(); 62 if (nativeObserver != 0) { 63 nativeUnsetObserver(nativeRtpReceiver, nativeObserver); 64 nativeObserver = 0; 65 } 66 JniCommon.nativeReleaseRef(nativeRtpReceiver); 67 nativeRtpReceiver = 0; 68 } 69 SetObserver(Observer observer)70 public void SetObserver(Observer observer) { 71 checkRtpReceiverExists(); 72 // Unset the existing one before setting a new one. 73 if (nativeObserver != 0) { 74 nativeUnsetObserver(nativeRtpReceiver, nativeObserver); 75 } 76 nativeObserver = nativeSetObserver(nativeRtpReceiver, observer); 77 } 78 setFrameDecryptor(FrameDecryptor frameDecryptor)79 public void setFrameDecryptor(FrameDecryptor frameDecryptor) { 80 checkRtpReceiverExists(); 81 nativeSetFrameDecryptor(nativeRtpReceiver, frameDecryptor.getNativeFrameDecryptor()); 82 } 83 checkRtpReceiverExists()84 private void checkRtpReceiverExists() { 85 if (nativeRtpReceiver == 0) { 86 throw new IllegalStateException("RtpReceiver has been disposed."); 87 } 88 } 89 90 // This should increment the reference count of the track. 91 // Will be released in dispose(). nativeGetTrack(long rtpReceiver)92 private static native long nativeGetTrack(long rtpReceiver); nativeGetParameters(long rtpReceiver)93 private static native RtpParameters nativeGetParameters(long rtpReceiver); nativeGetId(long rtpReceiver)94 private static native String nativeGetId(long rtpReceiver); nativeSetObserver(long rtpReceiver, Observer observer)95 private static native long nativeSetObserver(long rtpReceiver, Observer observer); nativeUnsetObserver(long rtpReceiver, long nativeObserver)96 private static native void nativeUnsetObserver(long rtpReceiver, long nativeObserver); nativeSetFrameDecryptor(long rtpReceiver, long nativeFrameDecryptor)97 private static native void nativeSetFrameDecryptor(long rtpReceiver, long nativeFrameDecryptor); 98 }; 99