Example #1
0
        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;
            }
        }