private void startCall() { int ret = 0; if (enableVoice) { startVoiceEngine(); } if (enableVideo) { if (enableVideoSend) { // camera and preview surface svLocal = ViERenderer.CreateLocalRenderer(this); } channel = viEAndroidJavaAPI.CreateChannel(voiceChannel); ret = viEAndroidJavaAPI.SetLocalReceiver(channel, receivePortVideo); ret = viEAndroidJavaAPI.SetSendDestination(channel, destinationPortVideo, RemoteIPString); if (enableVideoReceive) { if (renderType == RenderType.OPENGL) { Log.Verbose(TAG, "Create OpenGL Render"); remoteSurfaceView = ViERenderer.CreateRenderer(this, true); } else if (renderType == RenderType.SURFACE) { Log.Verbose(TAG, "Create SurfaceView Render"); remoteSurfaceView = ViERenderer.CreateRenderer(this, false); } else if (renderType == RenderType.MEDIACODEC) { Log.Verbose(TAG, "Create MediaCodec Decoder/Renderer"); remoteSurfaceView = new SurfaceView(this); } if (mLlRemoteSurface != null) { mLlRemoteSurface.AddView(remoteSurfaceView); } if (renderType == RenderType.MEDIACODEC) { ret = viEAndroidJavaAPI.SetExternalMediaCodecDecoderRenderer(channel, remoteSurfaceView); } else { ret = viEAndroidJavaAPI.AddRemoteRenderer(channel, remoteSurfaceView); } ret = viEAndroidJavaAPI.SetReceiveCodec(channel, codecType, INIT_BITRATE, codecSizeWidth, codecSizeHeight, RECEIVE_CODEC_FRAMERATE); ret = viEAndroidJavaAPI.StartRender(channel); ret = viEAndroidJavaAPI.StartReceive(channel); } if (enableVideoSend) { ret = viEAndroidJavaAPI.SetSendCodec(channel, codecType, INIT_BITRATE, codecSizeWidth, codecSizeHeight, SEND_CODEC_FRAMERATE); int camId = viEAndroidJavaAPI.StartCamera(channel, usingFrontCamera ? 1 : 0); if (camId >= 0) { cameraId = camId; compensateCameraRotation(); } else { ret = camId; } ret = viEAndroidJavaAPI.StartSend(channel); } // TODO(leozwang): Add more options besides PLI, currently use pli // as the default. Also check return value. ret = viEAndroidJavaAPI.EnablePLI(channel, true); ret = viEAndroidJavaAPI.EnableNACK(channel, enableNack); ret = viEAndroidJavaAPI.SetCallback(channel, this); if (enableVideoSend) { if (mLlLocalSurface != null) { mLlLocalSurface.AddView(svLocal); } } isStatsOn = cbStats.Checked; if (isStatsOn) { addStatusView(); } else { removeStatusView(); } viERunning = true; } }