VideoRender.h 8.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327
  1. /**
  2. * @file VideoRender.h
  3. * @brief 显示库,将YUV显示出图像.
  4. * @author qi_zhiyu
  5. * @par Copyright (c):
  6. * ZheJiang Dahua Technology Stock Co.Ltd.
  7. * All Rights Reserved
  8. * @date 2015-08-17
  9. * @note 接口是线程不安全的。
  10. * @version 1.00.1
  11. */
  12. #ifndef __VIDEORENDER_H_
  13. #define __VIDEORENDER_H_
  14. #ifdef __cplusplus
  15. extern "C"{
  16. #endif // end #ifdef __cplusplus
  17. #ifdef WIN64
  18. #undef WIN32
  19. #endif
  20. /** 编译选项 */
  21. #ifdef WIN32 // win64位下,会报和def重复定义的警告
  22. # ifdef _USRDLL // 动态库导出
  23. # ifdef VIDEORENDER_EXPORTS
  24. # define VRENDER_API __declspec(dllexport)
  25. # else
  26. # define VRENDER_API __declspec(dllimport)
  27. # endif
  28. # else
  29. # define VRENDER_API
  30. #endif
  31. #else
  32. # define VRENDER_API
  33. #endif //end #ifdef WIN32
  34. #if (defined (WIN32) || defined(WIN64))
  35. # define CALLMETHOD __stdcall
  36. # define CALLBACK __stdcall
  37. #else
  38. # define CALLMETHOD
  39. # define CALLBACK
  40. #endif // end #if (defined (WIN32) || defined(WIN64))
  41. #define IN
  42. #define OUT
  43. typedef void* VR_HANDLE; /**< 播放API使用的句柄 */
  44. typedef void* VR_HWND; /**< 窗口句柄 */
  45. typedef void* VR_HDC; /**< 绘图句柄 */
  46. typedef void* VR_HFONT; /**< 字体句柄 */
  47. /**
  48. * @enum tagRenderMode
  49. * @brief 视频显示模式枚举定义
  50. * @attention 无
  51. */
  52. typedef enum tagVideoRenderMode
  53. {
  54. #if (defined (WIN32) || defined(WIN64))
  55. VR_MODE_D3D = 0, /**< 使用D3D的方式进行显示 */
  56. VR_MODE_GDI, /**< 使用GDI显示模式 */
  57. #elif (defined(LINUX32) || defined(LINUX64))
  58. VR_MODE_OPENGLX, /**< 使用Opengl的方式进行显示 */
  59. VR_MODE_X11, /**< 使用X11的方式进行显示 */
  60. #endif // end #if (defined (WIN32) || defined(WIN64))
  61. }VR_MODE_E;
  62. /**
  63. * @enum tagVideoRenderErr
  64. * @brief 接口返回值
  65. * @attention 无
  66. */
  67. typedef enum tagVideoRenderErr
  68. {
  69. VR_SUCCESS,
  70. VR_ILLEGAL_PARAM, /**< 非法参数*/
  71. VR_ERR_ORDER, /**< 调用接口顺序错误*/
  72. VR_NO_MEMORY, /**< 内存不足*/
  73. VR_NOT_SUPPORT, /**< 不支持,或是缺少系统库,或是不支持输入的参数值*/
  74. VR_D3D_PRESENT_FAILED, /**< D3D显示错误 */
  75. VR_GDI_CREATE_OBJ_FAILED, /**< GGI创建对象失败 */
  76. VR_DEFAULT_FONT_NOT_EXIST, /**< 默认字体不存在 */
  77. }VR_ERR_E;
  78. /**
  79. * @enum tagVideoRenderPixelType
  80. * @brief 帧像素类型
  81. * @attention 无
  82. */
  83. typedef enum tagVideoRenderPixelType
  84. {
  85. VR_PIXEL_FMT_NONE = -1,
  86. VR_PIXEL_FMT_YUV420P, ///< planar YUV 4:2:0, 12bpp, (1 Cr & Cb sample per 2x2 Y samples)
  87. VR_PIXEL_FMT_RGB24, ///< packet RGB 8:8:8, 24bpp, RGBRGB...
  88. VR_PIXEL_FMT_MONO8, ///< mono8
  89. }VR_PIXEL_TYPE_E;
  90. /**
  91. * @struct tagVideoRenderOpenParam
  92. * @brief 打开视频显示所需要的参数。供VR_Open接口使用。
  93. * @attention 无
  94. */
  95. typedef struct tagVideoRenderOpenParam
  96. {
  97. VR_HWND hWnd; /**< 窗口句柄*/
  98. VR_MODE_E eVideoRenderMode; /**< 显示模式*/
  99. int nWidth; /**< 视频宽*/
  100. int nHeight; /**< 视频高*/
  101. }VR_OPEN_PARAM_S;
  102. /**
  103. * @struct tagVideoRenderFrame
  104. * @brief 显示视频所需要的参数。供VR_RenderFrame接口使用。
  105. * @attention 无
  106. */
  107. typedef struct tagVideoRenderFrame
  108. {
  109. #define NUM_DATA_POINTS 4
  110. unsigned char* data[NUM_DATA_POINTS]; /**< 根据format决定,YUV420P时每个分量分别表示指向Y,U,V缓冲,RGB时,只使用data[0],指向RGB缓冲*/
  111. int stride[NUM_DATA_POINTS]; /**< 每个分量的跨距*/
  112. int nWidth; /**< 视频宽,为了防止显示过程中修改分辨率*/
  113. int nHeight; /**< 视频高,为了防止显示过程中修改分辨率*/
  114. VR_PIXEL_TYPE_E format;
  115. }VR_FRAME_S;
  116. /**
  117. * @struct tagVideoRenderRenderParam
  118. * @brief 显示视频所需要的参数。供VR_RenderEx接口使用。
  119. * @attention 不建议使用,兼容老版本而保留
  120. */
  121. typedef struct tagVideoRenderRenderParam
  122. {
  123. unsigned char* data[3]; /**< 每个分量分别表示指向Y,U,V缓冲*/
  124. int stride[3]; /**< 每个分量的跨距*/
  125. int nWidth[3]; /**< 每个分量的宽*/
  126. int nHeight[3]; /**< 每个分量的高*/
  127. }VR_RENDER_PARAM_S;
  128. #if (defined(WIN32) || defined (WIN64))
  129. typedef COLORREF VR_COLOR;
  130. #else
  131. typedef unsigned int VR_COLOR;
  132. typedef unsigned char BYTE;
  133. typedef unsigned short WORD;
  134. typedef unsigned int DWORD;
  135. #define GetRValue(rgb) ((BYTE)(rgb))
  136. #define GetGValue(rgb) ((BYTE)(((WORD)(rgb)) >> 8))
  137. #define GetBValue(rgb) ((BYTE)((rgb)>>16))
  138. #define RGB(r,g,b) ((VR_COLOR)(((BYTE)(r)|((WORD)((BYTE)(g))<<8))|(((DWORD)(BYTE)(b))<<16)))
  139. #endif
  140. /**
  141. * @struct tagFontInfo
  142. * @brief 字体参数。供VR_CreateFont接口使用。
  143. * @attention 无
  144. */
  145. typedef struct tagFontInfo
  146. {
  147. unsigned int nFontSize; ///< 字体大小
  148. }VR_FONT_INFO;
  149. /**
  150. * @struct tagVRPoint
  151. * @brief 点坐标
  152. * @attention 无
  153. */
  154. typedef struct tagVRPoint {
  155. long x;
  156. long y;
  157. } VR_POINT;
  158. /**
  159. * @struct tagVRRect
  160. * @brief 矩形
  161. * @attention 无
  162. */
  163. typedef struct tagVRRect
  164. {
  165. int left;
  166. int top;
  167. int right;
  168. int bottom;
  169. }VR_RECT;
  170. /**
  171. * @brief 生成一个播放对象
  172. * @param[in] pParam:VR_OPEN_PARAM_S结构体。生成播放对象所需要的参数。
  173. * @param[out] pHandle:VR_HANDLE句柄。输出生成的播放的对象。
  174. * @Return: VR_ERR_E:播放接口返回值
  175. * - VR_SUCCESS 表示执行成功
  176. * - 其他值见 VR_ERR_E枚举
  177. *
  178. * @note 执行成功后,需要调用VR_Close来释放资源。
  179. * @see VR_ERR_E,VR_Close
  180. */
  181. VRENDER_API VR_ERR_E CALLMETHOD VR_Open(IN VR_OPEN_PARAM_S* pParam, OUT VR_HANDLE* pHandle);
  182. /**
  183. * @brief 将输入的一帧YUV显示出图像
  184. * @param[in] handle:VR_HANDLE句柄,由VR_Open创建。
  185. * @param[in] param:VR_FRAME_S结构体。
  186. * @param[in] pEnlargeRect:VR_RECT结构体。放大矩形区域。原图大小显示,不需要放大时,填NULL;
  187. * @Return: VR_ERR_E:播放接口返回值
  188. * - VR_SUCCESS 表示执行成功
  189. * - 其他值见 VR_ERR_E枚举
  190. *
  191. * @note 输入一帧即显示,播放速度由外部输入速度控制。
  192. * @see VR_ERR_E
  193. */
  194. VRENDER_API VR_ERR_E CALLMETHOD VR_RenderFrame(IN VR_HANDLE handle, IN VR_FRAME_S* param, IN VR_RECT* pEnlargeRect);
  195. /**
  196. * @brief 关闭播放对象
  197. * @param[in] handle:VR_HANDLE句柄,由VR_Open创建。
  198. * @Return: VR_ERR_E:播放接口返回值
  199. * - VR_SUCCESS 表示执行成功
  200. * - 其他值见 VR_ERR_E枚举
  201. *
  202. * @note 和VR_Open配对使用。
  203. * @see VR_ERR_E,VR_Open
  204. */
  205. VRENDER_API VR_ERR_E CALLMETHOD VR_Close(IN VR_HANDLE handle);
  206. typedef void (CALLBACK *fnDrawCallback)(VR_HWND hWindow, VR_HDC hDrawHandle, void* pUserData);
  207. /**
  208. * @brief 设置GDI回调, 可以使用GDI在画面中绘制叠加显示
  209. * @param[in] handle:VR_HANDLE句柄,由VR_Open创建。
  210. * @param[in] callback:回调函数
  211. * @param[in] pUserData:用户回调参数
  212. * @Return: VR_ERR_E:播放接口返回值
  213. * - VR_SUCCESS 表示执行成功
  214. * - 其他值见 VR_ERR_E枚举
  215. */
  216. VRENDER_API VR_ERR_E CALLMETHOD VR_SetDrawCallback(IN VR_HANDLE handle, IN fnDrawCallback callback, IN void* pUserData);
  217. /**
  218. * @brief 创建字体句柄
  219. * @param[in] pFontInfo:字体信息,包括颜色和字体大小。
  220. * @param[out] hFont:获得字体句柄
  221. * @Return: VR_ERR_E:播放接口返回值
  222. * - VR_SUCCESS 表示执行成功
  223. * - 其他值见 VR_ERR_E枚举
  224. *
  225. * @note 画图辅助函数。
  226. */
  227. VRENDER_API VR_ERR_E CALLMETHOD VR_CreateFont(IN VR_FONT_INFO* pFontInfo, OUT VR_HFONT* hFont);
  228. /**
  229. * @brief 销毁字体句柄
  230. * @param[in] hFont:字体句柄,由VR_CreateFont创建
  231. * @Return: VR_ERR_E:播放接口返回值
  232. * - VR_SUCCESS 表示执行成功
  233. * - 其他值见 VR_ERR_E枚举
  234. *
  235. * @note 画图辅助函数。
  236. */
  237. VRENDER_API VR_ERR_E CALLMETHOD VR_DestroyFont(IN VR_HFONT hFont);
  238. /**
  239. * @brief 绘字。支持\n符回车显示
  240. * @param[in] hFont:字体。
  241. * @param[in] hWindow:窗口句柄,由fnDrawCallback绘图回调输出
  242. * @param[in] hDrawHandle:绘图句柄,由fnDrawCallback绘图回调输出
  243. * @param[in] lpText:UNICODE编码缓冲指针,支持中文显示。
  244. * @param[in] nTextLen:UNICODE编码缓冲大小
  245. * @param[in] color:字体颜色
  246. * @param[in] pointStart:开始绘制字符串的位置
  247. * @Return: VR_ERR_E:播放接口返回值
  248. * - VR_SUCCESS 表示执行成功
  249. * - 其他值见 VR_ERR_E枚举
  250. *
  251. * @note 画图辅助函数。
  252. */
  253. VRENDER_API VR_ERR_E CALLMETHOD VR_DrawText(IN VR_HFONT hFont,
  254. IN VR_HWND hWindow,
  255. IN VR_HDC hDrawHandle,
  256. IN const char* lpText,
  257. IN int nTextLen,
  258. IN VR_COLOR color,
  259. IN VR_POINT* pointStart);
  260. /**
  261. * @brief 将输入的一帧YUV显示出图像
  262. * @param[in] handle:VR_HANDLE句柄,由VR_Open创建。
  263. * @param[in] param:VR_RENDER_PARAM_S结构体。显示所需要的参数。
  264. * @param[in] pEnlargeRect:VR_RECT结构体。放大矩形区域。原图大小显示,不需要放大时,填NULL;
  265. * @attention 此接口不建议使用,建议使用VR_RenderFrame替代。为兼容老版本的使用而保留。
  266. * @Return: VR_ERR_E:播放接口返回值
  267. * - VR_SUCCESS 表示执行成功
  268. * - 其他值见 VR_ERR_E枚举
  269. *
  270. * @note 输入一帧即显示,播放速度由外部输入速度控制。
  271. * @see VR_ERR_E
  272. */
  273. VRENDER_API VR_ERR_E CALLMETHOD VR_RenderEx(IN VR_HANDLE handle, IN VR_RENDER_PARAM_S* param, IN VR_RECT* pEnlargeRect);
  274. /**
  275. * @brief 将输入的一帧YUV显示出图像
  276. * @param[in] handle:VR_HANDLE句柄,由VR_Open创建。
  277. * @param[in] param:VR_RENDER_PARAM_S结构体。显示所需要的参数。
  278. * @Return: VR_ERR_E:播放接口返回值
  279. * - VR_SUCCESS 表示执行成功
  280. * - 其他值见 VR_ERR_E枚举
  281. *
  282. * @attention 此接口不建议使用,建议使用VR_RenderFrame替代。为兼容老版本的使用而保留。
  283. * @note 输入一帧即显示,播放速度由外部输入速度控制。
  284. * @see VR_ERR_E
  285. */
  286. VRENDER_API VR_ERR_E CALLMETHOD VR_Render(IN VR_HANDLE handle, IN VR_RENDER_PARAM_S* param);
  287. #ifdef __cplusplus
  288. }
  289. #endif // end #ifdef __cplusplus
  290. #endif // end #ifndef __VIDEORENDER_H_