package cn.tee3.avd;
/**
 * Created by ming.ren on 2017/04/13.
 */
import android.util.Log;

/**
 * Rtsp客户端.
 *
 */
public class RtspClient {
    private static final String TAG = "RtspClient";
    /** 创建rtsp客户端
     *
     * @return rtsp客户端对象指针。
     */
    public static RtspClient create()  {
        RtspClient item = null;
        Log.i(TAG, "RtspClient::create ");
        try {
            item = new RtspClient();
        }
        catch (Exception e) {
            Log.e(TAG, "Create RtspClient failed. e:"+e.toString());
            return null;
        }
        Log.i(TAG, "Create RtspClient success.");
        return item;
    }
    /** 销毁rtsp客户端
     *
     * @param[in] client rtsp客户端对象指针。
     */
    public static void destoryClient(RtspClient client) {
        Log.d(TAG, "RtspClient::destoryClient, client:" + client);
        if (null == client) {
            return ;
        }
        client.dispose();
        Log.v(TAG, "destoryClient, out:");
    }
    /** 开始接收流
     *
     * @param[in] uri rtsp流地址。
     * @param[in] username	认证用户名。
     * @param[in] password	认证密码。
     * @sa
     * @note 如果不需要认证，username,password 可以为空字符串“”，也可以为null
     */
	public int start(String uri, String username, String password ){
		Log.d(TAG, "RtspClient::start , uri:" + uri + "username:" + username + "password:" + password);
        return nativestart(uri, username, password);
	}
    /** 停止接收流
     *
     * @sa
     */
	public int stop(){
		Log.d(TAG, "RtspClient::stop " );
        return nativestop();
	}
    /** 设置渲染接口指针
     *
     * @param[in] render 渲染接口指针。
     * @sa
     * @note 先对视频解码，在通过render渲染，如果需要使用硬件解码，必须通过AVDEngine设置。
     */
	public int setRender(VideoRenderer render){
		Log.d(TAG, "RtspClient::setRender, render:" + render);
		if (null == render) {
			Log.e(TAG, "setRender, render is null.");
            return -1;
        }
        return nativesetRender(render.nativeRender());
	}
    /** 设置模拟音频采集接口指针
     *
     * @param[in] capture 模拟音频采集接口指针。
     * @note 由于音频导入只能导入一种数据，PCM或者编码后的数据，所以enableAudioCallbackEncoded enableAudioCallbackPCM只能有一种生效，或者将默认导入encoded数据。
     * @note PCM：enableAudioCallbackEncoded(false)  enableAudioCallbackPCM(true); 导入encoded数据：enableAudioCallbackEncoded(true)  enableAudioCallbackPCM(false);
     * @sa enableVideoCallbackEncoded
     * @sa enableVideoCallbackYUV
     * @return 错误码。
     */
	public int setAudioCapture(FakeAudioCapturer capture){
		Log.d(TAG, "RtspClient::setAudioCapture, capture:" + capture);
		if (null == capture) {
			Log.e(TAG, "setAudioCapture, capture is null.");
            return -1;
        }
        return nativesetAudioCapture(capture.nativeCapture());
	}
    /** 设置模拟视频采集接口指针
     *
     * @param[in] capture 模拟视频采集接口指针。
     * @note 由于默认回调Encoded数据，只能使用导入编码数据的VideoCapture，如果需要传入的是导入YUV数据的FakeVideoCapture需要调用enableVideoCallbackYUV，并且调用enableVideoCallbackEncoded(false)。
     * @note YUV：enableVideoCallbackEncoded(false)  enableVideoCallbackYUV(true); 导入encoded数据：enableVideoCallbackEncoded(true)  enableVideoCallbackYUV(false);
     * @sa enableVideoCallbackEncoded
     * @sa enableVideoCallbackYUV
     * @return 错误码。
     */
	public int setVideoCapture(FakeVideoCapturer capture){
		Log.d(TAG, "RtspClient::setVideoCapture, capture:" + capture);
		if (null == capture) {
			Log.e(TAG, "setVideoCapture, capture is null.");
            return -1;
        }
        return nativesetVideoCapture(capture.nativeCapture());
	}
    /** 控制是否回调编码过的视频数据
     *
     * @param[in] callbackEncodedData 功能开启或关闭。
     * @note 默认为true，enableVideoCallbackYUV和enableVideoCallbackEncoded功能可同时开启。
     * @sa videoEncodedOut
     * @sa enableVideoCallbackYUV
     * @return 错误码。
     */
	public int enableVideoCallbackEncoded(boolean callbackEncodedData ){
		Log.d(TAG, "RtspClient::enableVideoCallbackEncoded, callbackEncodedData:" + callbackEncodedData);
        return nativeenableVideoCallbackEncoded(callbackEncodedData);
	}
    /** 控制是否回调解码后的视频数据
     *
     * @param[in] callbackYUVData 功能开启或关闭。
     * @note 默认为false, enableVideoCallbackYUV(true)调用后videoYUVOut接口才会有数据回调。
     * @sa videoYUVOut
     * @sa enableVideoCallbackYUV
     * @return 错误码。
     */
	public int enableVideoCallbackYUV(boolean callbackYUVData){
		Log.d(TAG, "RtspClient::enableVideoCallbackYUV, callbackYUVData:" + callbackYUVData);
        return nativeenableVideoCallbackYUV(callbackYUVData);
	}
    /** 控制是否回调编码过的音频数据
     *
     * @param[in] callbackEncodedData 功能开启或关闭。
     * @note 默认为true，enableAudioCallbackEncoded和enableAudioCallbackPCM功能可同时开启。
     * @sa audioEncodedOut
     * @sa enableAudioCallbackPCM
     * @return 错误码。
     */
	public int enableAudioCallbackEncoded(boolean callbackEncodedData) {
		Log.d(TAG, "RtspClient::enableAudioCallbackEncoded, callbackEncodedData:" + callbackEncodedData);
        return nativeenableAudioCallbackEncoded(callbackEncodedData);
	}
    /** 控制是否回调解码后的音频数据
     *
     * @param[in] callbackPcmData 功能开启或关闭。
     * @note 默认为false, enableAudioCallbackPCM(true)调用后audioPCMOut接口才会有数据回调。
     * @sa audioPCMOut
     * @sa enableAudioCallbackEncoded
     * @return 错误码。
     */
	public int enableAudioCallbackPCM(boolean callbackPcmData) {
		Log.d(TAG, "RtspClient::enableAudioCallbackPCM, callbackPcmData:" + callbackPcmData);
        return nativeenableAudioCallbackPCM(callbackPcmData);
	}
	private RtspClient() {
        nativeobj = nativecreate();
        if (0 == nativeobj) {
            throw new RuntimeException("Failed to Create FakeAudioCapturer!");
        }
    }
    protected void dispose() {
        if (0 != this.nativeobj) {
            nativedestroy(this.nativeobj);
            this.nativeobj = 0;
        }
    }
     ///
    private long nativeobj = 0;
    ///
	private static native long nativecreate();
    private static native void nativedestroy(long nativeObject);
    private native int nativestart(String uri, String username, String password);
    private native int nativestop();
    private native int nativesetRender(long nativeObject);

    private native int nativesetAudioCapture(long nativeObject);
    private native int nativesetVideoCapture(long nativeObject);
    private native int nativeenableVideoCallbackEncoded(boolean enabel);
    private native int nativeenableVideoCallbackYUV(boolean enabel);
    private native int nativeenableAudioCallbackEncoded(boolean enabel);
    private native int nativeenableAudioCallbackPCM(boolean enabel);
}
