
This changes adds the API surface for injecting the FrameEncryptor and FrameDecryptor from Java. This assumes that the API User will be able to provide native implementations of both the Encryptor and Decryptor. Optional Java implementations may come later but due to the significant performance issues around copying every frame across the JNI boundary it doesn't seem like a good idea to support a non native backed implementation for now. Bug: webrtc:9681 Change-Id: Ib4471e69fdf0a99705f824de652c621637b92326 Reviewed-on: https://webrtc-review.googlesource.com/96865 Commit-Queue: Benjamin Wright <benwright@webrtc.org> Reviewed-by: Sami Kalliomäki <sakal@webrtc.org> Reviewed-by: Emad Omara <emadomara@webrtc.org> Reviewed-by: Steve Anton <steveanton@webrtc.org> Cr-Commit-Position: refs/heads/master@{#24610}
86 lines
2.9 KiB
Java
86 lines
2.9 KiB
Java
/*
|
|
* Copyright 2015 The WebRTC project authors. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by a BSD-style license
|
|
* that can be found in the LICENSE file in the root of the source
|
|
* tree. An additional intellectual property rights grant can be found
|
|
* in the file PATENTS. All contributing project authors may
|
|
* be found in the AUTHORS file in the root of the source tree.
|
|
*/
|
|
|
|
package org.webrtc;
|
|
|
|
import javax.annotation.Nullable;
|
|
import org.webrtc.MediaStreamTrack;
|
|
|
|
/** Java wrapper for a C++ RtpReceiverInterface. */
|
|
public class RtpReceiver {
|
|
/** Java wrapper for a C++ RtpReceiverObserverInterface*/
|
|
public static interface Observer {
|
|
// Called when the first audio or video packet is received.
|
|
@CalledByNative("Observer")
|
|
public void onFirstPacketReceived(MediaStreamTrack.MediaType media_type);
|
|
}
|
|
|
|
final long nativeRtpReceiver;
|
|
private long nativeObserver;
|
|
|
|
@Nullable private MediaStreamTrack cachedTrack;
|
|
|
|
@CalledByNative
|
|
public RtpReceiver(long nativeRtpReceiver) {
|
|
this.nativeRtpReceiver = nativeRtpReceiver;
|
|
long nativeTrack = nativeGetTrack(nativeRtpReceiver);
|
|
cachedTrack = MediaStreamTrack.createMediaStreamTrack(nativeTrack);
|
|
}
|
|
|
|
@Nullable
|
|
public MediaStreamTrack track() {
|
|
return cachedTrack;
|
|
}
|
|
|
|
public boolean setParameters(@Nullable RtpParameters parameters) {
|
|
return parameters == null ? false : nativeSetParameters(nativeRtpReceiver, parameters);
|
|
}
|
|
|
|
public RtpParameters getParameters() {
|
|
return nativeGetParameters(nativeRtpReceiver);
|
|
}
|
|
|
|
public String id() {
|
|
return nativeGetId(nativeRtpReceiver);
|
|
}
|
|
|
|
@CalledByNative
|
|
public void dispose() {
|
|
cachedTrack.dispose();
|
|
if (nativeObserver != 0) {
|
|
nativeUnsetObserver(nativeRtpReceiver, nativeObserver);
|
|
nativeObserver = 0;
|
|
}
|
|
JniCommon.nativeReleaseRef(nativeRtpReceiver);
|
|
}
|
|
|
|
public void SetObserver(Observer observer) {
|
|
// Unset the existing one before setting a new one.
|
|
if (nativeObserver != 0) {
|
|
nativeUnsetObserver(nativeRtpReceiver, nativeObserver);
|
|
}
|
|
nativeObserver = nativeSetObserver(nativeRtpReceiver, observer);
|
|
}
|
|
|
|
public void setFrameDecryptor(FrameDecryptor frameDecryptor) {
|
|
nativeSetFrameDecryptor(nativeRtpReceiver, frameDecryptor.getNativeFrameDecryptor());
|
|
}
|
|
|
|
// This should increment the reference count of the track.
|
|
// Will be released in dispose().
|
|
private static native long nativeGetTrack(long rtpReceiver);
|
|
private static native boolean nativeSetParameters(long rtpReceiver, RtpParameters parameters);
|
|
private static native RtpParameters nativeGetParameters(long rtpReceiver);
|
|
private static native String nativeGetId(long rtpReceiver);
|
|
private static native long nativeSetObserver(long rtpReceiver, Observer observer);
|
|
private static native void nativeUnsetObserver(long rtpReceiver, long nativeObserver);
|
|
private static native void nativeSetFrameDecryptor(long rtpReceiver, long nativeFrameDecryptor);
|
|
};
|