#ifndef RT_VideoRender_C_H_
#define RT_VideoRender_C_H_

#include "common_c.h"
typedef void(*VideoRender_OnFrameYuv)(char* ybuffer, char*ubuffer, char*vbuffer, int ystride, int ustride, int vstride, int width, int height);

///
extern "C" {
#ifdef RT_WIN32
	// render video
	enum AVDScalingType {
		Scale_Fill = 1, // video frame is scaled to to fill the size of the view. Video aspect ratio is changed if necessary.
		Scale_Aspect_Fit = 2, // video frame is scaled to fit the size of the view by maintaining the aspect ratio (black borders may be displayed).
		Scale_Aspect_Full = 3, // video frame is scaled to fill the size of the view by maintaining the aspect ratio. Some portion of the video frame may be clipped.
	};
	/** 根据窗口句柄创建一个对应的渲染对象render
	*
	* @param[in] renderHandle 视频渲染对象句柄。
	* @param[in] *window 窗口句柄。
	* @param[in] isfullscreen 是否全屏显示。
	* @param[in] isgdi 是否使用GDI渲染方式，False使用DrectShow渲染。
	*
	* @note 在图像显示之初不建议使用全屏显示。渲染方式建议使用DrectShow方式渲染。
	* @return 返回错误代码。
	* @sa avd_render_destory
	*/
	RT_API_EXPORT Result avd_render_create(AVDHandle& renderHandle, void* window, AVDBool isfullscreen, AVDBool isgdi);
	/** 更新视频渲染对象的窗口大小
	*
	* @param[in] renderHandle 视频渲染对象句柄。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_render_updateSize(AVDHandle renderHandle);
	/** 设置视频渲染对象的渲染拉伸类型
	*
	* @param[in] renderHandle 视频渲染对象句柄。
	* @param[in] type 视频渲染拉伸类型。
	* @return 返回错误代码。
	* @sa AVDScalingType
	*/
	RT_API_EXPORT Result avd_render_setScalingType(AVDHandle renderHandle, AVDScalingType type);
	/** 销毁一个视频渲染对象
	*
	* @param[in] renderHandle 视频渲染对象句柄。
	*
	* @return 返回错误代码。
	* @sa avd_render_create
	*/
	RT_API_EXPORT Result avd_render_destory(AVDHandle renderHandle);
	/** 启停图像抓取功能
	*
	* @param[in] enable 开启或者停止。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_render_enableCapture(AVDHandle renderHandle, AVDBool enable);
	/** 抓取图像
	*
	* @param[in] fileName 图像保存地址，绝对地址, 支持".bmp和.jpg"。
	* @param[in] quality  图像质量：0-100, 0最差，100最好。
	* @return 返回错误代码。
	*/
	RT_API_EXPORT Result avd_render_captureImage(AVDHandle renderHandle, const char* fileName, int quality);
	
	/**
	* VideoRender attach到某个视频后，接收到首帧视频的回调
	*/
	typedef void(*AVDFuncOnFirstFrameArrived)(AVDHandle handle);
	/** 设置首帧数据回调指针
	*
	* @param[in] listener  首帧数据回调指针。
	* @return 返回错误代码。
	* @note 此函数设置后，VideoRender在首帧视频数据接收到时会回调onFirstFrameArrived；
	*		注意：每次重新attachRender后需要重新设置此函数，即设置此函数后，只有一次回调，下次即使同一VideoRender需要再次获取首帧回调，需要重新设置。
	*/
	RT_API_EXPORT Result avd_render_setFirstFrameListener(AVDHandle renderHandle, AVDFuncOnFirstFrameArrived listener);
	
	/////unity 下使用的接口
	 RT_API_EXPORT Result avd_render_create2(AVDHandle& renderHandle, VideoRender_OnFrameYuv callback);


    RT_API_EXPORT Result avd_render_create3(AVDHandle& renderHandle);


    RT_API_EXPORT Result avd_render_startbuffer(AVDHandle& renderHandle, uint8_t* ybuff, uint8_t* ubuff, uint8_t* vbuff);

    RT_API_EXPORT Result avd_update_size(AVDHandle& renderHandle, int& widht, int&height);

    //RT_API_EXPORT Result avd_update_texture2(AVDHandle& renderHandle, uint8_t* data, int& widht, int&height);

    RT_API_EXPORT Result avd_clear_texture(AVDHandle& renderHandle);
	
	RT_API_EXPORT Result avd_render_destroy2(AVDHandle& renderHandle);
#else
    /** 创建一个对应的渲染对象render
    *
    * @param[in] renderHandle 视频渲染对象句柄。
    * @param[in] callback 用户实现渲染的数据传输接口。
    *
    * @note 根据callback 创建关联renderHandle,将renderHandle attach到Video模块中。
    * @return 返回错误代码。
    * @sa avd_render_destory
    */
    RT_API_EXPORT Result avd_render_create(AVDHandle& renderHandle, LYuvRenderCallback callback);

    /** 销毁一个视频渲染对象
	*
	* @param[in] renderHandle 视频渲染对象句柄。
	*
	* @return 返回错误代码。
	* @sa avd_render_create
	*/
    RT_API_EXPORT Result avd_render_destroy(AVDHandle& renderHandle);
#endif // RT_WIN32

}
#endif//RT_VideoRender_C_H_
