2

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.

Syed Bilal
  • 81
  • 5

0 Answers0