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