When the user comes to calling screen video track renderer has been set fine. Either user goes another activity or back activity without ending video call session, but when the user comes back to calling activity I've to set a remote media stream which I couldn't achieve successfully. So, I have implemented different approaches but application got crash when I set the renderer to remote stream.
First Time I set remote media stream in onAddRemoteStream()
which is working well.
override fun onAddRemoteStream(remoteStream: MediaStream, pcId: String, endPoint: Int) {
val renderer = VideoRenderer(remoteRender)
remoteStream.videoTracks[0].addRenderer(renderer)
WebrtcClient.getInstance().peerConnections[pcId]?.videoRenderer = renderer
VideoRendererGui.update(remoteRender,
REMOTE_X, REMOTE_Y,
REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, true)
VideoRendererGui.update(localRender,
LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
scalingType, true)
}
Iniitalizing webrtc client
private fun init() {
val displaySize = Point()
windowManager.defaultDisplay.getSize(displaySize)
val params = PeerConnectionParameters(
true, false, displaySize.x, displaySize.y, 30, 1,
VIDEO_CODEC_VP9, true, 1, AUDIO_CODEC_OPUS, true)
WebrtcClient.getInstance().webRtcClient(this, params, VideoRendererGui.getEGLContext())
}
Preparing webrtc client
public void webRtcClient(RtcListener listener, PeerConnectionParameters params, EGLContext mEGLcontext) {
mListener = listener;
pcParams = params;
pcConstraints = new MediaConstraints();
PeerConnectionFactory.initializeAndroidGlobals(listener, true, true,
params.videoCodecHwAcceleration, mEGLcontext);
factory = new PeerConnectionFactory();
pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveAudio", "true"));
pcConstraints.mandatory.add(new MediaConstraints.KeyValuePair("OfferToReceiveVideo", "true"));
pcConstraints.optional.add(new MediaConstraints.KeyValuePair("DtlsSrtpKeyAgreement", "true"));
}
Second Time I'm trying to set in VideoRendererGui.setView(glview_call) { \\... }
inside it. But app is being crash again and again.
private fun initWebrtc() {
glview_call.preserveEGLContextOnPause = true
glview_call.keepScreenOn = true
// Video Calling
VideoRendererGui.setView(glview_call) {
if (!WebrtcClient.getInstance().onResumingCalling) {
// Initializing Call
init()
} else {
// on call resuming
// Set local media stream
val localStream = WebrtcClient.getInstance().localMediaStream
if (localStream.videoTracks.size > 0) {
localStream.videoTracks[0].addRenderer(VideoRenderer(localRender))
VideoRendererGui.update(localRender,
LOCAL_X_CONNECTED, LOCAL_Y_CONNECTED,
LOCAL_WIDTH_CONNECTED, LOCAL_HEIGHT_CONNECTED,
scalingType, true)
}
WebrtcClient.getInstance().callingInfo.users.forEach {
val peer = WebrtcClient.getInstance().peerConnections[it.user?.id]
// 'peer' get return each user peer connection
peer?.let { p ->
p.remoteMediaStream?.let { mediaStream ->
// Checking video track linkedList length
if (mediaStream.videoTracks.size > 0) {
// removing old video renderer from video track
mediaStream.videoTracks.first.removeRenderer(p.videoRenderer)
// New renderer to show remote media stream
val renderer = VideoRenderer(remoteRender)
mediaStream.videoTracks[0].addRenderer(renderer)
p.videoRenderer = renderer
VideoRendererGui.update(remoteRender,
REMOTE_X,
REMOTE_Y, REMOTE_WIDTH,
REMOTE_HEIGHT, scalingType, true
)
}
}
}
}
}
}
// remote render
remoteRender = VideoRendererGui.create(
REMOTE_X,
REMOTE_Y, REMOTE_WIDTH,
REMOTE_HEIGHT, scalingType, true)
localRender = VideoRendererGui.create(
LOCAL_X_CONNECTING,
LOCAL_Y_CONNECTING,
LOCAL_WIDTH_CONNECTING,
LOCAL_HEIGHT_CONNECTING, scalingType, true)
}
If I comment:
val renderer = VideoRenderer(remoteRender)
mediaStream.videoTracks[0].addRenderer(renderer)
VideoRendererGui.update(remoteRender, REMOTE_X, REMOTE_Y, REMOTE_WIDTH, REMOTE_HEIGHT, scalingType, true )
app is being running fine and black screen appears.