sample_vin_ivps_joint_venc_rtsp.c 66 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675167616771678167916801681168216831684168516861687168816891690169116921693169416951696169716981699170017011702170317041705170617071708170917101711171217131714171517161717171817191720172117221723172417251726172717281729173017311732173317341735173617371738173917401741174217431744174517461747174817491750175117521753175417551756175717581759176017611762176317641765176617671768176917701771177217731774177517761777177817791780178117821783178417851786178717881789179017911792179317941795179617971798179918001801180218031804180518061807180818091810181118121813181418151816181718181819182018211822182318241825182618271828182918301831183218331834183518361837183818391840184118421843184418451846184718481849185018511852185318541855185618571858185918601861186218631864186518661867186818691870187118721873187418751876187718781879188018811882188318841885188618871888188918901891189218931894189518961897189818991900190119021903190419051906190719081909191019111912191319141915191619171918191919201921192219231924192519261927192819291930193119321933193419351936193719381939194019411942194319441945194619471948194919501951195219531954195519561957195819591960196119621963196419651966196719681969197019711972
  1. /**********************************************************************************
  2. *
  3. * Copyright (c) 2019-2020 Beijing AXera Technology Co., Ltd. All Rights Reserved.
  4. *
  5. * This source file is the property of Beijing AXera Technology Co., Ltd. and
  6. * may not be copied or distributed in any isomorphic form without the prior
  7. * written consent of Beijing AXera Technology Co., Ltd.
  8. *
  9. **********************************************************************************/
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <signal.h>
  14. #include <errno.h>
  15. #include <unistd.h>
  16. #include <pthread.h>
  17. #include <sys/prctl.h>
  18. #include <getopt.h>
  19. #include "ax_venc_api.h"
  20. #include "ax_ivps_api.h"
  21. #include "ax_isp_api.h"
  22. #include "ax_sys_dma_api.h"
  23. #include "common_sys.h"
  24. #include "common_vin.h"
  25. #include "common_cam.h"
  26. #include "common_venc.h"
  27. #include "sample_vin_ivps_joint_venc_rtsp.h"
  28. #include "AXRtspWrapper.h"
  29. #include "sample_run_joint_api.h"
  30. #include "sample_log.h"
  31. #include "inifile_api.h"
  32. #define SAMPLE_IVPS_GROUP_NUM (2)
  33. // #define SAMPLE_IVPS_CHN_NUM (1)
  34. #define SAMPLE_VENC_CHN_NUM (2)
  35. #define SAMPLE_REGION_COUNT (2)
  36. #define SAMPLE_RECT_BOX_COUNT (8)
  37. #define SAMPLE_POSE_LINE_COUNT (8)
  38. #define SAMPLE_IVPS_CHN_TOTAL (3)
  39. typedef struct _IVPS_GET_THREAD_PARAM
  40. {
  41. AX_U8 nIvpsIndex;
  42. AX_U8 nIvpsGrp;
  43. AX_U8 nIvpsChn;
  44. } IVPS_GET_THREAD_PARAM_T;
  45. static const AX_U8 s_sample_ivps_chn_num[SAMPLE_IVPS_GROUP_NUM] = {2, 1};
  46. static IVPS_GET_THREAD_PARAM_T s_sample_ivps_thread_param[SAMPLE_IVPS_CHN_TOTAL] = {{0, 0, 0}, {1, 0, 1}, {2, 1, 0}};
  47. #define RED 0xFF0000
  48. #define PINK 0xFFC0CB
  49. #define GREEN 0x00FF00
  50. #define BLUE 0x0000FF
  51. #define PURPLE 0xA020F0
  52. #define ORANGE 0xFFA500
  53. #define YELLOW 0xFFFF00
  54. #ifndef ALIGN_UP
  55. #define ALIGN_UP(x, align) ((((x) + ((align)-1)) / (align)) * (align))
  56. #endif
  57. #ifndef ALIGN_DOWN
  58. #define ALIGN_DOWN(x, align) (((x) / (align)) * (align))
  59. #endif
  60. typedef AX_S32 IVPS_GRP;
  61. typedef AX_S32 AX_IVPS_FILTER;
  62. typedef struct _stVencGetStreamParam
  63. {
  64. AX_S32 VeChn;
  65. AX_BOOL bThreadStart;
  66. AX_PAYLOAD_TYPE_E ePayloadType;
  67. } VENC_GETSTREAM_PARAM_T;
  68. typedef struct _stRCInfo
  69. {
  70. SAMPLE_VENC_RC_E eRCType;
  71. AX_U32 nMinQp;
  72. AX_U32 nMaxQp;
  73. AX_U32 nMinIQp;
  74. AX_U32 nMaxIQp;
  75. AX_S32 nIntraQpDelta;
  76. } RC_INFO_T;
  77. typedef struct _stVideoConfig
  78. {
  79. AX_PAYLOAD_TYPE_E ePayloadType;
  80. AX_U32 nGOP;
  81. AX_U32 nSrcFrameRate;
  82. AX_U32 nDstFrameRate;
  83. AX_U32 nStride;
  84. AX_S32 nInWidth;
  85. AX_S32 nInHeight;
  86. AX_S32 nOutWidth;
  87. AX_S32 nOutHeight;
  88. AX_S32 nOffsetCropX;
  89. AX_S32 nOffsetCropY;
  90. AX_S32 nOffsetCropW;
  91. AX_S32 nOffsetCropH;
  92. AX_IMG_FORMAT_E eImgFormat;
  93. RC_INFO_T stRCInfo;
  94. AX_S32 nBitrate;
  95. } VIDEO_CONFIG_T;
  96. typedef enum
  97. {
  98. SYS_CASE_NONE = -1,
  99. SYS_CASE_SINGLE_OS04A10 = 0,
  100. SYS_CASE_SINGLE_IMX334 = 1,
  101. SYS_CASE_SINGLE_GC4653 = 2,
  102. SYS_CASE_SINGLE_OS08A20 = 3,
  103. SYS_CASE_SINGLE_OS04A10_ONLINE = 4,
  104. SYS_CASE_BUTT
  105. } COMMON_SYS_CASE_E;
  106. typedef enum
  107. {
  108. VENC_CASE_NONE = -1,
  109. VENC_CASE_H264 = 0,
  110. VENC_CASE_H265 = 1,
  111. VENC_CASE_BUTT
  112. } COMMON_VENC_CASE_E;
  113. typedef struct _IVPS_REGION_PARAM
  114. {
  115. IVPS_RGN_HANDLE hChnRgn;
  116. IVPS_GRP nGroup;
  117. AX_IVPS_FILTER nFilter;
  118. AX_BOOL bExit;
  119. } IVPS_REGION_PARAM_T, *IVPS_REGION_PARAM_PTR;
  120. IVPS_REGION_PARAM_T g_arrRgnThreadParam[SAMPLE_REGION_COUNT];
  121. typedef struct
  122. {
  123. IVPS_GRP nGroup;
  124. AX_IVPS_FILTER nFilter;
  125. AX_U32 nChnWidth;
  126. AX_U32 nChnHeight;
  127. AX_U32 nRgnNum;
  128. AX_IVPS_RGN_LAYER_E eLayer;
  129. } RGN_GROUP_CFG_T;
  130. typedef struct _sample_RECT_S
  131. {
  132. float fX, fY, fW, fH;
  133. } SAMPLE_RECT_S;
  134. typedef struct _sample_POINT_S
  135. {
  136. float fX;
  137. float fY;
  138. float score;
  139. } SAMPLE_POINT_S;
  140. typedef struct _sample_PTS_S
  141. {
  142. SAMPLE_POINT_S point[15]
  143. } SAMPLE_PTS_S;
  144. typedef struct _sample_ALGO_RESULT_S
  145. {
  146. AX_U8 nSize;
  147. SAMPLE_RECT_S rect[SAMPLE_RECT_BOX_COUNT];
  148. SAMPLE_PTS_S pts[SAMPLE_RECT_BOX_COUNT];
  149. } SAMPLE_ALGO_RESULT_S;
  150. static SAMPLE_ALGO_RESULT_S g_sample_algo_result;
  151. static pthread_mutex_t g_result_mutex;
  152. static AX_S32 s_sample_framerate = 25;
  153. static AX_S32 s_sample_ldc_mode = AX_FALSE;
  154. static AX_S32 s_sample_ldc_dRatio = 0;
  155. static AX_S32 s_sample_ldc_xRatio = 0;
  156. static AX_S32 s_sample_ldc_yRatio = 0;
  157. static AX_IVPS_DEWARP_TYPE_E s_sample_gdc_dewarp = AX_IVPS_DEWARP_BUTT;
  158. static AX_S64 s_sample_gdc_perspective_matrix[9] = {0};
  159. static const AX_CHAR *s_sample_strInputYuvFile = NULL;
  160. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04a10Sdr[] = {
  161. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP, 4}, /*vin raw10 use */
  162. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  163. {2688, 1520, 2688, AX_YUV420_SEMIPLANAR, 4}, /*vin nv21/nv21 use */
  164. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  165. {1280, 720, 1280, AX_YUV420_SEMIPLANAR, 3},
  166. };
  167. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04a10OnlineSdr[] = {
  168. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP, 3}, /*vin raw10 use */
  169. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 5}, /*vin raw16 use */
  170. {2688, 1520, 2688, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  171. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 3},
  172. {1280, 720, 1280, AX_YUV420_SEMIPLANAR, 3},
  173. };
  174. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04a10Hdr[] = {
  175. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP, 4}, /*vin raw10 use */
  176. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  177. {2688, 1520, 2688, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  178. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  179. {720, 576, 720, AX_YUV420_SEMIPLANAR, 3},
  180. };
  181. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs04a10OnlineHdr[] = {
  182. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_10BPP, 4}, /*vin raw10 use */
  183. {2688, 1520, 2688, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  184. {2688, 1520, 2688, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  185. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  186. {720, 576, 720, AX_YUV420_SEMIPLANAR, 3},
  187. };
  188. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleImx334Sdr[] = {
  189. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_12BPP, 8}, /*vin raw10 use */
  190. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  191. {3840, 2160, 3840, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  192. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  193. {960, 540, 960, AX_YUV420_SEMIPLANAR, 3},
  194. };
  195. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleImx334Hdr[] = {
  196. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_10BPP, 8}, /*vin raw10 use */
  197. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  198. {3840, 2160, 3840, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  199. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  200. {960, 540, 960, AX_YUV420_SEMIPLANAR, 3},
  201. };
  202. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleGc4653[] = {
  203. {2560, 1440, 2560, AX_FORMAT_BAYER_RAW_10BPP, 4}, /*vin raw10 use */
  204. {2560, 1440, 2560, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  205. {2560, 1440, 2560, AX_YUV420_SEMIPLANAR, 4}, /*vin nv21/nv21 use */
  206. {1280, 720, 1280, AX_YUV420_SEMIPLANAR, 4},
  207. {640, 360, 640, AX_YUV420_SEMIPLANAR, 3},
  208. };
  209. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs08a20Sdr[] = {
  210. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_12BPP, 4}, /*vin raw10 use */
  211. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  212. {3840, 2160, 3840, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  213. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  214. {960, 540, 960, AX_YUV420_SEMIPLANAR, 3},
  215. };
  216. static COMMON_SYS_POOL_CFG_T gtSysCommPoolSingleOs08a20Hdr[] = {
  217. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_10BPP, 8}, /*vin raw10 use */
  218. {3840, 2160, 3840, AX_FORMAT_BAYER_RAW_16BPP, 4}, /*vin raw16 use */
  219. {3840, 2160, 3840, AX_YUV420_SEMIPLANAR, 6}, /*vin nv21/nv21 use */
  220. {1920, 1080, 1920, AX_YUV420_SEMIPLANAR, 4},
  221. {960, 540, 960, AX_YUV420_SEMIPLANAR, 3},
  222. };
  223. static CAMERA_T gCams[MAX_CAMERAS] = {0};
  224. static volatile AX_S32 gLoopExit = 0;
  225. static AX_S32 g_isp_force_loop_exit = 0;
  226. const static AX_S32 gVencChnMapping[SAMPLE_VENC_CHN_NUM] = {0, 2};
  227. static VENC_GETSTREAM_PARAM_T gGetStreamPara[SAMPLE_VENC_CHN_NUM];
  228. static pthread_t gGetStreamPid[SAMPLE_VENC_CHN_NUM];
  229. static AX_VOID *gJointHandle = NULL;
  230. AX_S32 s32ModelType = 1;
  231. AX_U32 CalcImgSize(AX_U32 nStride, AX_U32 nW, AX_U32 nH, AX_IMG_FORMAT_E eType, AX_U32 nAlign)
  232. {
  233. AX_U32 nBpp = 0;
  234. if (nW == 0 || nH == 0)
  235. {
  236. ALOGE("%s: Invalid width %d or height %d!", __func__, nW, nH);
  237. return 0;
  238. }
  239. if (0 == nStride)
  240. {
  241. nStride = (0 == nAlign) ? nW : ALIGN_UP(nW, nAlign);
  242. }
  243. else
  244. {
  245. if (nAlign > 0)
  246. {
  247. if (nStride % nAlign)
  248. {
  249. ALOGE("%s: stride: %u not %u aligned.!", __func__, nStride, nAlign);
  250. return 0;
  251. }
  252. }
  253. }
  254. switch (eType)
  255. {
  256. case AX_YUV420_PLANAR:
  257. case AX_YUV420_SEMIPLANAR:
  258. case AX_YUV420_SEMIPLANAR_VU:
  259. nBpp = 12;
  260. break;
  261. case AX_YUV422_INTERLEAVED_YUYV:
  262. case AX_YUV422_INTERLEAVED_UYVY:
  263. nBpp = 16;
  264. break;
  265. case AX_YUV444_PACKED:
  266. case AX_FORMAT_RGB888:
  267. nBpp = 24;
  268. break;
  269. case AX_FORMAT_RGBA8888:
  270. case AX_FORMAT_ARGB8888:
  271. nBpp = 32;
  272. break;
  273. default:
  274. nBpp = 0;
  275. break;
  276. }
  277. return nStride * nH * nBpp / 8;
  278. }
  279. AX_S32 BufPoolBlockAddrGet(AX_POOL PoolId, AX_U32 BlkSize, AX_U64 *nPhyAddr, AX_VOID **pVirAddr, AX_BLK *BlkId)
  280. {
  281. *BlkId = AX_POOL_GetBlock(PoolId, BlkSize, NULL);
  282. *nPhyAddr = AX_POOL_Handle2PhysAddr(*BlkId);
  283. if (!(*nPhyAddr))
  284. {
  285. ALOGE("AX_POOL_Handle2PhysAddr fail!");
  286. return -1;
  287. }
  288. ALOGI("AX_POOL_Handle2PhysAddr success!(Blockid:0x%X --> PhyAddr=0x%llx)", *BlkId, *nPhyAddr);
  289. *pVirAddr = AX_POOL_GetBlockVirAddr(*BlkId);
  290. if (!(*pVirAddr))
  291. {
  292. ALOGE("AX_POOL_GetBlockVirAddr fail!");
  293. return -1;
  294. }
  295. ALOGI("AX_POOL_GetBlockVirAddr success!blockVirAddr=0x%p", *pVirAddr);
  296. return 0;
  297. }
  298. /* venc get stream task */
  299. static void *VencGetStreamProc(void *arg)
  300. {
  301. AX_S32 s32Ret = -1;
  302. AX_VENC_RECV_PIC_PARAM_S stRecvParam;
  303. VENC_GETSTREAM_PARAM_T *pstPara;
  304. pstPara = (VENC_GETSTREAM_PARAM_T *)arg;
  305. AX_VENC_STREAM_S stStream;
  306. AX_S16 syncType = -1;
  307. AX_U32 totalGetStream = 0;
  308. s32Ret = AX_VENC_StartRecvFrame(pstPara->VeChn, &stRecvParam);
  309. if (AX_SUCCESS != s32Ret)
  310. {
  311. ALOGE("AX_VENC_StartRecvFrame failed, s32Ret:0x%x", s32Ret);
  312. return NULL;
  313. }
  314. memset(&stStream, 0, sizeof(AX_VENC_STREAM_S));
  315. while (AX_TRUE == pstPara->bThreadStart)
  316. {
  317. s32Ret = AX_VENC_GetStream(pstPara->VeChn, &stStream, syncType);
  318. if (AX_SUCCESS == s32Ret)
  319. {
  320. totalGetStream++;
  321. AX_Rtsp_SendNalu(pstPara->VeChn, stStream.stPack.pu8Addr, stStream.stPack.u32Len,
  322. stStream.stPack.u64PTS, (VENC_INTRA_FRAME == stStream.stPack.enCodingType) ? AX_TRUE : AX_FALSE);
  323. s32Ret = AX_VENC_ReleaseStream(pstPara->VeChn, &stStream);
  324. if (AX_SUCCESS != s32Ret)
  325. {
  326. // ALOGE("VencChn %d: AX_VENC_ReleaseStream failed!s32Ret:0x%x",pstPara->VeChn,s32Ret);
  327. goto EXIT;
  328. }
  329. }
  330. }
  331. EXIT:
  332. ALOGN("VencChn %d: Total get %u encoded frames. getStream Exit!", pstPara->VeChn, totalGetStream);
  333. return NULL;
  334. }
  335. static AX_S32 SampleVencInit(COMMON_VENC_CASE_E eVencType)
  336. {
  337. AX_VENC_CHN_ATTR_S stVencChnAttr;
  338. VIDEO_CONFIG_T config = {0};
  339. AX_S32 VencChn = 0, s32Ret = 0;
  340. AX_VENC_MOD_ATTR_S stModAttr;
  341. stModAttr.enVencType = VENC_MULTI_ENCODER;
  342. s32Ret = AX_VENC_Init(&stModAttr);
  343. if (AX_SUCCESS != s32Ret)
  344. {
  345. ALOGE("AX_VENC_Init failed, s32Ret:0x%x", s32Ret);
  346. return s32Ret;
  347. }
  348. config.stRCInfo.eRCType = VENC_RC_CBR;
  349. config.nGOP = 30;
  350. config.nBitrate = 2000;
  351. config.stRCInfo.nMinQp = 10;
  352. config.stRCInfo.nMaxQp = 51;
  353. config.stRCInfo.nMinIQp = 10;
  354. config.stRCInfo.nMaxIQp = 51;
  355. config.stRCInfo.nIntraQpDelta = -2;
  356. config.nOffsetCropX = 0;
  357. config.nOffsetCropY = 0;
  358. config.nOffsetCropW = 0;
  359. config.nOffsetCropH = 0;
  360. for (VencChn = 0; VencChn < SAMPLE_VENC_CHN_NUM; VencChn++)
  361. {
  362. config.ePayloadType = (eVencType == VENC_CASE_H264) ? PT_H264 : PT_H265;
  363. switch (VencChn)
  364. {
  365. case 0:
  366. config.nInWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  367. config.nInHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  368. config.nStride = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidthStride;
  369. config.nSrcFrameRate = s_sample_framerate;
  370. config.nDstFrameRate = s_sample_framerate;
  371. break;
  372. case 1:
  373. config.nInWidth = 720;
  374. config.nInHeight = 576;
  375. config.nStride = 720;
  376. config.nSrcFrameRate = s_sample_framerate;
  377. config.nDstFrameRate = s_sample_framerate;
  378. break;
  379. }
  380. memset(&stVencChnAttr, 0, sizeof(AX_VENC_CHN_ATTR_S));
  381. stVencChnAttr.stVencAttr.u32MaxPicWidth = 0;
  382. stVencChnAttr.stVencAttr.u32MaxPicHeight = 0;
  383. stVencChnAttr.stVencAttr.u32PicWidthSrc = config.nInWidth; /*the picture width*/
  384. stVencChnAttr.stVencAttr.u32PicHeightSrc = config.nInHeight; /*the picture height*/
  385. stVencChnAttr.stVencAttr.u32CropOffsetX = config.nOffsetCropX;
  386. stVencChnAttr.stVencAttr.u32CropOffsetY = config.nOffsetCropY;
  387. stVencChnAttr.stVencAttr.u32CropWidth = config.nOffsetCropW;
  388. stVencChnAttr.stVencAttr.u32CropHeight = config.nOffsetCropH;
  389. stVencChnAttr.stVencAttr.u32VideoRange = 1; /* 0: Narrow Range(NR), Y[16,235], Cb/Cr[16,240]; 1: Full Range(FR), Y/Cb/Cr[0,255] */
  390. ALOGN("VencChn %d:w:%d, h:%d, s:%d, Crop:(%d, %d, %d, %d) rcType:%d, payload:%d", gVencChnMapping[VencChn], stVencChnAttr.stVencAttr.u32PicWidthSrc, stVencChnAttr.stVencAttr.u32PicHeightSrc, config.nStride, stVencChnAttr.stVencAttr.u32CropOffsetX, stVencChnAttr.stVencAttr.u32CropOffsetY, stVencChnAttr.stVencAttr.u32CropWidth, stVencChnAttr.stVencAttr.u32CropHeight, config.stRCInfo.eRCType, config.ePayloadType);
  391. stVencChnAttr.stVencAttr.u32BufSize = config.nStride * config.nInHeight * 3 / 2; /*stream buffer size*/
  392. stVencChnAttr.stVencAttr.u32MbLinesPerSlice = 0; /*get stream mode is slice mode or frame mode?*/
  393. stVencChnAttr.stVencAttr.enLinkMode = AX_LINK_MODE;
  394. stVencChnAttr.stVencAttr.u32GdrDuration = 0;
  395. /* GOP Setting */
  396. stVencChnAttr.stGopAttr.enGopMode = VENC_GOPMODE_NORMALP;
  397. stVencChnAttr.stVencAttr.enType = config.ePayloadType;
  398. switch (stVencChnAttr.stVencAttr.enType)
  399. {
  400. case PT_H265:
  401. {
  402. stVencChnAttr.stVencAttr.enProfile = VENC_HEVC_MAIN_PROFILE;
  403. stVencChnAttr.stVencAttr.enLevel = VENC_HEVC_LEVEL_6;
  404. stVencChnAttr.stVencAttr.enTier = VENC_HEVC_MAIN_TIER;
  405. if (config.stRCInfo.eRCType == VENC_RC_CBR)
  406. {
  407. AX_VENC_H265_CBR_S stH265Cbr;
  408. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265CBR;
  409. stVencChnAttr.stRcAttr.s32FirstFrameStartQp = -1;
  410. stH265Cbr.u32Gop = config.nGOP;
  411. stH265Cbr.u32SrcFrameRate = config.nSrcFrameRate; /* input frame rate */
  412. stH265Cbr.fr32DstFrameRate = config.nDstFrameRate; /* target frame rate */
  413. stH265Cbr.u32BitRate = config.nBitrate;
  414. stH265Cbr.u32MinQp = config.stRCInfo.nMinQp;
  415. stH265Cbr.u32MaxQp = config.stRCInfo.nMaxQp;
  416. stH265Cbr.u32MinIQp = config.stRCInfo.nMinIQp;
  417. stH265Cbr.u32MaxIQp = config.stRCInfo.nMaxIQp;
  418. stH265Cbr.s32IntraQpDelta = config.stRCInfo.nIntraQpDelta;
  419. memcpy(&stVencChnAttr.stRcAttr.stH265Cbr, &stH265Cbr, sizeof(AX_VENC_H265_CBR_S));
  420. }
  421. else if (config.stRCInfo.eRCType == VENC_RC_VBR)
  422. {
  423. AX_VENC_H265_VBR_S stH265Vbr;
  424. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265VBR;
  425. stVencChnAttr.stRcAttr.s32FirstFrameStartQp = -1;
  426. stH265Vbr.u32Gop = config.nGOP;
  427. stH265Vbr.u32SrcFrameRate = config.nSrcFrameRate;
  428. stH265Vbr.fr32DstFrameRate = config.nDstFrameRate;
  429. stH265Vbr.u32MaxBitRate = config.nBitrate;
  430. stH265Vbr.u32MinQp = config.stRCInfo.nMinQp;
  431. stH265Vbr.u32MaxQp = config.stRCInfo.nMaxQp;
  432. stH265Vbr.u32MinIQp = config.stRCInfo.nMinIQp;
  433. stH265Vbr.u32MaxIQp = config.stRCInfo.nMaxIQp;
  434. stH265Vbr.s32IntraQpDelta = config.stRCInfo.nIntraQpDelta;
  435. memcpy(&stVencChnAttr.stRcAttr.stH265Vbr, &stH265Vbr, sizeof(AX_VENC_H265_VBR_S));
  436. }
  437. else if (config.stRCInfo.eRCType == VENC_RC_FIXQP)
  438. {
  439. AX_VENC_H265_FIXQP_S stH265FixQp;
  440. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H265FIXQP;
  441. stH265FixQp.u32Gop = config.nGOP;
  442. stH265FixQp.u32SrcFrameRate = config.nSrcFrameRate;
  443. stH265FixQp.fr32DstFrameRate = config.nDstFrameRate;
  444. stH265FixQp.u32IQp = 25;
  445. stH265FixQp.u32PQp = 30;
  446. stH265FixQp.u32BQp = 32;
  447. memcpy(&stVencChnAttr.stRcAttr.stH265FixQp, &stH265FixQp, sizeof(AX_VENC_H265_FIXQP_S));
  448. }
  449. break;
  450. }
  451. case PT_H264:
  452. {
  453. stVencChnAttr.stVencAttr.enProfile = VENC_H264_MAIN_PROFILE;
  454. stVencChnAttr.stVencAttr.enLevel = VENC_H264_LEVEL_5_2;
  455. if (config.stRCInfo.eRCType == VENC_RC_CBR)
  456. {
  457. AX_VENC_H264_CBR_S stH264Cbr;
  458. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264CBR;
  459. stVencChnAttr.stRcAttr.s32FirstFrameStartQp = -1;
  460. stH264Cbr.u32Gop = config.nGOP;
  461. stH264Cbr.u32SrcFrameRate = config.nSrcFrameRate; /* input frame rate */
  462. stH264Cbr.fr32DstFrameRate = config.nDstFrameRate; /* target frame rate */
  463. stH264Cbr.u32BitRate = config.nBitrate;
  464. stH264Cbr.u32MinQp = config.stRCInfo.nMinQp;
  465. stH264Cbr.u32MaxQp = config.stRCInfo.nMaxQp;
  466. stH264Cbr.u32MinIQp = config.stRCInfo.nMinIQp;
  467. stH264Cbr.u32MaxIQp = config.stRCInfo.nMaxIQp;
  468. stH264Cbr.s32IntraQpDelta = config.stRCInfo.nIntraQpDelta;
  469. memcpy(&stVencChnAttr.stRcAttr.stH264Cbr, &stH264Cbr, sizeof(AX_VENC_H264_CBR_S));
  470. }
  471. else if (config.stRCInfo.eRCType == VENC_RC_VBR)
  472. {
  473. AX_VENC_H264_VBR_S stH264Vbr;
  474. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264VBR;
  475. stVencChnAttr.stRcAttr.s32FirstFrameStartQp = -1;
  476. stH264Vbr.u32Gop = config.nGOP;
  477. stH264Vbr.u32SrcFrameRate = config.nSrcFrameRate;
  478. stH264Vbr.fr32DstFrameRate = config.nDstFrameRate;
  479. stH264Vbr.u32MaxBitRate = config.nBitrate;
  480. stH264Vbr.u32MinQp = config.stRCInfo.nMinQp;
  481. stH264Vbr.u32MaxQp = config.stRCInfo.nMaxQp;
  482. stH264Vbr.u32MinIQp = config.stRCInfo.nMinIQp;
  483. stH264Vbr.u32MaxIQp = config.stRCInfo.nMaxIQp;
  484. stH264Vbr.s32IntraQpDelta = config.stRCInfo.nIntraQpDelta;
  485. memcpy(&stVencChnAttr.stRcAttr.stH264Vbr, &stH264Vbr, sizeof(AX_VENC_H264_VBR_S));
  486. }
  487. else if (config.stRCInfo.eRCType == VENC_RC_FIXQP)
  488. {
  489. AX_VENC_H264_FIXQP_S stH264FixQp;
  490. stVencChnAttr.stRcAttr.enRcMode = VENC_RC_MODE_H264FIXQP;
  491. stH264FixQp.u32Gop = config.nGOP;
  492. stH264FixQp.u32SrcFrameRate = config.nSrcFrameRate;
  493. stH264FixQp.fr32DstFrameRate = config.nDstFrameRate;
  494. stH264FixQp.u32IQp = 25;
  495. stH264FixQp.u32PQp = 30;
  496. stH264FixQp.u32BQp = 32;
  497. memcpy(&stVencChnAttr.stRcAttr.stH264FixQp, &stH264FixQp, sizeof(AX_VENC_H264_FIXQP_S));
  498. }
  499. break;
  500. }
  501. default:
  502. ALOGE("VencChn %d:Payload type unrecognized.", VencChn);
  503. return -1;
  504. }
  505. AX_S32 ret = AX_VENC_CreateChn(gVencChnMapping[VencChn], &stVencChnAttr);
  506. if (AX_SUCCESS != ret)
  507. {
  508. ALOGE("VencChn %d: AX_VENC_CreateChn failed, s32Ret:0x%x", VencChn, ret);
  509. return -1;
  510. }
  511. /* create get output stream thread */
  512. gGetStreamPara[VencChn].VeChn = gVencChnMapping[VencChn];
  513. gGetStreamPara[VencChn].bThreadStart = AX_TRUE;
  514. gGetStreamPara[VencChn].ePayloadType = config.ePayloadType;
  515. pthread_create(&gGetStreamPid[VencChn], NULL, VencGetStreamProc, (void *)&gGetStreamPara[VencChn]);
  516. }
  517. return 0;
  518. }
  519. static AX_S32 SampleVencDeInit()
  520. {
  521. AX_S32 VencChn = 0, s32Ret = 0;
  522. for (VencChn = 0; VencChn < SAMPLE_VENC_CHN_NUM; VencChn++)
  523. {
  524. s32Ret = AX_VENC_StopRecvFrame(gVencChnMapping[VencChn]);
  525. if (0 != s32Ret)
  526. {
  527. ALOGE("VencChn %d:AX_VENC_StopRecvFrame failed,s32Ret:0x%x.", gVencChnMapping[VencChn], s32Ret);
  528. return s32Ret;
  529. }
  530. s32Ret = AX_VENC_DestroyChn(gVencChnMapping[VencChn]);
  531. if (0 != s32Ret)
  532. {
  533. ALOGE("VencChn %d:AX_VENC_DestroyChn failed,s32Ret:0x%x.", gVencChnMapping[VencChn], s32Ret);
  534. return s32Ret;
  535. }
  536. if (AX_TRUE == gGetStreamPara[VencChn].bThreadStart)
  537. {
  538. gGetStreamPara[VencChn].bThreadStart = AX_FALSE;
  539. pthread_join(gGetStreamPid[VencChn], NULL);
  540. }
  541. }
  542. s32Ret = AX_VENC_Deinit();
  543. if (AX_SUCCESS != s32Ret)
  544. {
  545. ALOGE("AX_VENC_Deinit failed, s32Ret=0x%x", s32Ret);
  546. return s32Ret;
  547. }
  548. return 0;
  549. }
  550. AX_VOID StartOverlay(AX_VOID)
  551. {
  552. memset(&g_arrRgnThreadParam[0], 0, sizeof(IVPS_REGION_PARAM_T) * SAMPLE_REGION_COUNT);
  553. AX_S32 nRet = 0;
  554. AX_U8 nRgnIndex = 0;
  555. for (AX_U8 i = 0; i < SAMPLE_IVPS_GROUP_NUM; i++)
  556. {
  557. IVPS_RGN_HANDLE hChnRgn = AX_IVPS_RGN_Create();
  558. if (AX_IVPS_INVALID_REGION_HANDLE != hChnRgn)
  559. {
  560. AX_S32 nFilter = 0x11; // only chn0 fliter
  561. nRet = AX_IVPS_RGN_AttachToFilter(hChnRgn, i, nFilter);
  562. if (0 != nRet)
  563. {
  564. ALOGE("AX_IVPS_RGN_AttachToFilter(Grp: %d, Filter: 0x%x) failed, ret=0x%x", i, nFilter, nRet);
  565. return;
  566. }
  567. g_arrRgnThreadParam[nRgnIndex].hChnRgn = hChnRgn;
  568. g_arrRgnThreadParam[nRgnIndex].nGroup = i;
  569. g_arrRgnThreadParam[nRgnIndex].nFilter = nFilter;
  570. nRgnIndex++;
  571. ALOGN("AX_IVPS_RGN_AttachToFilter(Grp: %d, Filter: 0x%x) successfully, hChnRgn=%d.", i, nFilter, hChnRgn);
  572. }
  573. else
  574. {
  575. ALOGE("AX_IVPS_RGN_Create(Grp: %d) failed.", i);
  576. }
  577. }
  578. }
  579. AX_VOID StopOverlay(AX_VOID)
  580. {
  581. AX_S32 nRet = 0;
  582. AX_U8 nRgnIndex = 0;
  583. for (AX_U8 i = 0; i < SAMPLE_REGION_COUNT; i++)
  584. {
  585. g_arrRgnThreadParam[i].bExit = AX_TRUE;
  586. }
  587. for (AX_U8 i = 0; i < SAMPLE_IVPS_GROUP_NUM; i++)
  588. {
  589. AX_S32 nFilter = 0x11; // only chn0 fliter
  590. nRet = AX_IVPS_RGN_DetachFromFilter(g_arrRgnThreadParam[nRgnIndex].hChnRgn, i, nFilter);
  591. if (0 != nRet)
  592. {
  593. ALOGE("AX_IVPS_RGN_DetachFromFilter(Grp: %d, Filter: %x) failed, ret=0x%x", i, nFilter, nRet);
  594. }
  595. nRet = AX_IVPS_RGN_Destroy(g_arrRgnThreadParam[nRgnIndex].hChnRgn);
  596. if (0 != nRet)
  597. {
  598. ALOGE("AX_IVPS_RGN_Destroy(Grp: %d) failed, ret=0x%x", i, nRet);
  599. }
  600. nRgnIndex++;
  601. }
  602. }
  603. static int SampleIvpsInit()
  604. {
  605. AX_S32 s32Ret = 0;
  606. AX_S32 nGrp = 0, nChn = 0;
  607. AX_IVPS_GRP_ATTR_S stGrpAttr = {0};
  608. AX_IVPS_PIPELINE_ATTR_S stPipelineAttr = {0};
  609. s32Ret = AX_IVPS_Init();
  610. if (0 != s32Ret)
  611. {
  612. ALOGE("AX_IVPS_Init failed,s32Ret:0x%x", s32Ret);
  613. return s32Ret;
  614. }
  615. stPipelineAttr.tFbInfo.PoolId = AX_INVALID_POOLID;
  616. stPipelineAttr.nOutChnNum = s_sample_ivps_chn_num[nGrp];
  617. for (nGrp = 0; nGrp < SAMPLE_IVPS_GROUP_NUM; nGrp++)
  618. {
  619. stGrpAttr.nInFifoDepth = 1;
  620. stGrpAttr.ePipeline = AX_IVPS_PIPELINE_DEFAULT;
  621. s32Ret = AX_IVPS_CreateGrp(nGrp, &stGrpAttr);
  622. if (0 != s32Ret)
  623. {
  624. ALOGE("AX_IVPS_CreateGrp failed,nGrp %d,s32Ret:0x%x", nGrp, s32Ret);
  625. return s32Ret;
  626. }
  627. memset(&stPipelineAttr.tFilter, 0x00, sizeof(stPipelineAttr.tFilter));
  628. if (s_sample_ldc_mode || s_sample_gdc_dewarp != AX_IVPS_DEWARP_BUTT)
  629. {
  630. if (nGrp == 0)
  631. {
  632. stPipelineAttr.tFilter[0][0].bEnable = AX_TRUE;
  633. stPipelineAttr.tFilter[0][0].tFRC.nSrcFrameRate = s_sample_framerate;
  634. stPipelineAttr.tFilter[0][0].tFRC.nDstFrameRate = s_sample_framerate;
  635. stPipelineAttr.tFilter[0][0].nDstPicOffsetX0 = 0;
  636. stPipelineAttr.tFilter[0][0].nDstPicOffsetY0 = 0;
  637. stPipelineAttr.tFilter[0][0].nDstPicWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  638. stPipelineAttr.tFilter[0][0].nDstPicHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  639. stPipelineAttr.tFilter[0][0].nDstPicStride = ALIGN_UP(gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidthStride, 64);
  640. stPipelineAttr.tFilter[0][0].nDstFrameWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  641. stPipelineAttr.tFilter[0][0].nDstFrameHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  642. stPipelineAttr.tFilter[0][0].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  643. stPipelineAttr.tFilter[0][0].eEngine = AX_IVPS_ENGINE_GDC;
  644. stPipelineAttr.tFilter[0][0].tGdcCfg.bDewarpEnable = AX_TRUE;
  645. // if (s_sample_ldc_mode && s_sample_gdc_dewarp == AX_IVPS_DEWARP_PERSPECTIVE) {
  646. // stPipelineAttr.tFilter[0][0].tGdcCfg.bDewarpType = AX_IVPS_DEWARP_LDC_PERSPECTIVE;
  647. // }
  648. // else if (s_sample_ldc_mode) {
  649. // stPipelineAttr.tFilter[0][0].tGdcCfg.bDewarpType = AX_IVPS_DEWARP_LDC;
  650. // }
  651. // else if (s_sample_gdc_dewarp == AX_IVPS_DEWARP_PERSPECTIVE) {
  652. // stPipelineAttr.tFilter[0][0].tGdcCfg.bDewarpType = AX_IVPS_DEWARP_PERSPECTIVE;
  653. // }
  654. if (s_sample_ldc_mode)
  655. {
  656. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.bAspect = AX_FALSE;
  657. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nXRatio = (AX_S16)s_sample_ldc_xRatio;
  658. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nYRatio = (AX_S16)s_sample_ldc_yRatio;
  659. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nXYRatio = 0;
  660. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nCenterXOffset = 0;
  661. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nCenterYOffset = 0;
  662. stPipelineAttr.tFilter[0][0].tGdcCfg.tLdcFactor.nDistortionRatio = (AX_S16)s_sample_ldc_dRatio;
  663. }
  664. // if (s_sample_gdc_dewarp == AX_IVPS_DEWARP_PERSPECTIVE) {
  665. // memcpy(stPipelineAttr.tFilter[0][0].tGdcCfg.tPerspectiveFactor.nPerspectiveMatrix,
  666. // s_sample_gdc_perspective_matrix,
  667. // sizeof(stPipelineAttr.tFilter[0][0].tGdcCfg.tPerspectiveFactor.nPerspectiveMatrix));
  668. // stPipelineAttr.tFilter[0][0].tGdcCfg.tPerspectiveFactor.bMatrixInverse = AX_FALSE;
  669. // stPipelineAttr.tFilter[0][0].tGdcCfg.tPerspectiveFactor.nEncryptionType = 1;
  670. // }
  671. stPipelineAttr.tFilter[0][0].tGdcCfg.bEnhanceMode = AX_TRUE;
  672. stPipelineAttr.tFilter[0][0].tGdcCfg.eRotation = AX_IVPS_ROTATION_0;
  673. stPipelineAttr.tFilter[0][0].tGdcCfg.bMirror = AX_FALSE;
  674. stPipelineAttr.tFilter[0][0].tGdcCfg.bFlip = AX_FALSE;
  675. }
  676. }
  677. for (nChn = 0; nChn < s_sample_ivps_chn_num[nGrp]; nChn++)
  678. {
  679. if (nGrp == 0)
  680. {
  681. if (nChn == 0)
  682. {
  683. stPipelineAttr.tFilter[nChn + 1][0].bEnable = AX_TRUE;
  684. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nSrcFrameRate = s_sample_framerate;
  685. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nDstFrameRate = s_sample_framerate;
  686. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetX0 = 0;
  687. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetY0 = 0;
  688. stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  689. stPipelineAttr.tFilter[nChn + 1][0].nDstPicHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  690. stPipelineAttr.tFilter[nChn + 1][0].nDstPicStride = ALIGN_UP(gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidthStride, 64);
  691. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  692. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  693. stPipelineAttr.tFilter[nChn + 1][0].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  694. stPipelineAttr.tFilter[nChn + 1][0].eEngine = AX_IVPS_ENGINE_TDP;
  695. stPipelineAttr.tFilter[nChn + 1][0].tGdcCfg.eRotation = AX_IVPS_ROTATION_0;
  696. stPipelineAttr.tFilter[nChn + 1][1].bEnable = AX_TRUE;
  697. stPipelineAttr.tFilter[nChn + 1][1].tFRC.nSrcFrameRate = s_sample_framerate;
  698. stPipelineAttr.tFilter[nChn + 1][1].tFRC.nDstFrameRate = s_sample_framerate;
  699. stPipelineAttr.tFilter[nChn + 1][1].nDstPicOffsetX0 = 0;
  700. stPipelineAttr.tFilter[nChn + 1][1].nDstPicOffsetY0 = 0;
  701. stPipelineAttr.tFilter[nChn + 1][1].nDstPicWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  702. stPipelineAttr.tFilter[nChn + 1][1].nDstPicHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  703. stPipelineAttr.tFilter[nChn + 1][1].nDstPicStride = ALIGN_UP(gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidthStride, 64);
  704. stPipelineAttr.tFilter[nChn + 1][1].nDstFrameWidth = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth;
  705. stPipelineAttr.tFilter[nChn + 1][1].nDstFrameHeight = gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight;
  706. stPipelineAttr.tFilter[nChn + 1][1].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  707. stPipelineAttr.tFilter[nChn + 1][1].eEngine = AX_IVPS_ENGINE_VO;
  708. stPipelineAttr.nOutFifoDepth[nChn] = 0;
  709. }
  710. else if (nChn == 1)
  711. {
  712. stPipelineAttr.tFilter[nChn + 1][0].bEnable = AX_TRUE;
  713. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nSrcFrameRate = s_sample_framerate;
  714. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nDstFrameRate = s_sample_framerate;
  715. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetX0 = 0;
  716. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetY0 = 0;
  717. stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth = 1920;
  718. stPipelineAttr.tFilter[nChn + 1][0].nDstPicHeight = 1080;
  719. stPipelineAttr.tFilter[nChn + 1][0].nDstPicStride = ALIGN_UP(stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth, 64);
  720. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameWidth = 1920;
  721. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameHeight = 1080;
  722. stPipelineAttr.tFilter[nChn + 1][0].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  723. stPipelineAttr.tFilter[nChn + 1][0].eEngine = AX_IVPS_ENGINE_TDP;
  724. stPipelineAttr.tFilter[nChn + 1][0].tTdpCfg.eRotation = AX_IVPS_ROTATION_0;
  725. stPipelineAttr.nOutFifoDepth[nChn] = 1; // for AI runjoint
  726. }
  727. }
  728. else if (nGrp == 1)
  729. {
  730. stPipelineAttr.tFilter[nChn + 1][0].bEnable = AX_TRUE;
  731. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nSrcFrameRate = s_sample_framerate;
  732. stPipelineAttr.tFilter[nChn + 1][0].tFRC.nDstFrameRate = s_sample_framerate;
  733. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetX0 = 0;
  734. stPipelineAttr.tFilter[nChn + 1][0].nDstPicOffsetY0 = 0;
  735. stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth = 720;
  736. stPipelineAttr.tFilter[nChn + 1][0].nDstPicHeight = 576;
  737. stPipelineAttr.tFilter[nChn + 1][0].nDstPicStride = ALIGN_UP(stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth, 64);
  738. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameWidth = 720;
  739. stPipelineAttr.tFilter[nChn + 1][0].nDstFrameHeight = 576;
  740. stPipelineAttr.tFilter[nChn + 1][0].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  741. stPipelineAttr.tFilter[nChn + 1][0].eEngine = AX_IVPS_ENGINE_TDP;
  742. stPipelineAttr.tFilter[nChn + 1][0].tTdpCfg.eRotation = AX_IVPS_ROTATION_0;
  743. stPipelineAttr.tFilter[nChn + 1][1].bEnable = AX_TRUE;
  744. stPipelineAttr.tFilter[nChn + 1][1].tFRC.nSrcFrameRate = s_sample_framerate;
  745. stPipelineAttr.tFilter[nChn + 1][1].tFRC.nDstFrameRate = s_sample_framerate;
  746. stPipelineAttr.tFilter[nChn + 1][1].nDstPicOffsetX0 = 0;
  747. stPipelineAttr.tFilter[nChn + 1][1].nDstPicOffsetY0 = 0;
  748. stPipelineAttr.tFilter[nChn + 1][1].nDstPicWidth = 720;
  749. stPipelineAttr.tFilter[nChn + 1][1].nDstPicHeight = 576;
  750. stPipelineAttr.tFilter[nChn + 1][1].nDstPicStride = ALIGN_UP(stPipelineAttr.tFilter[nChn + 1][0].nDstPicWidth, 64);
  751. stPipelineAttr.tFilter[nChn + 1][1].nDstFrameWidth = 720;
  752. stPipelineAttr.tFilter[nChn + 1][1].nDstFrameHeight = 576;
  753. stPipelineAttr.tFilter[nChn + 1][1].eDstPicFormat = AX_YUV420_SEMIPLANAR;
  754. stPipelineAttr.tFilter[nChn + 1][1].eEngine = AX_IVPS_ENGINE_VO;
  755. stPipelineAttr.nOutFifoDepth[nChn] = 0;
  756. }
  757. s32Ret = AX_IVPS_SetPipelineAttr(nGrp, &stPipelineAttr);
  758. if (0 != s32Ret)
  759. {
  760. ALOGE("AX_IVPS_SetPipelineAttr failed,nGrp %d,s32Ret:0x%x", nGrp, s32Ret);
  761. return s32Ret;
  762. }
  763. s32Ret = AX_IVPS_EnableChn(nGrp, nChn);
  764. if (0 != s32Ret)
  765. {
  766. ALOGE("AX_IVPS_EnableChn failed,nGrp %d,nChn %d,s32Ret:0x%x", nGrp, nChn, s32Ret);
  767. return s32Ret;
  768. }
  769. }
  770. s32Ret = AX_IVPS_StartGrp(nGrp);
  771. if (0 != s32Ret)
  772. {
  773. ALOGE("AX_IVPS_StartGrp failed,nGrp %d,s32Ret:0x%x", nGrp, s32Ret);
  774. return s32Ret;
  775. }
  776. }
  777. StartOverlay();
  778. return 0;
  779. }
  780. static AX_S32 SampleIvpsDeInit()
  781. {
  782. AX_S32 s32Ret = 0, nGrp = 0, nChn = 0;
  783. for (nGrp = 0; nGrp < SAMPLE_IVPS_GROUP_NUM; nGrp++)
  784. {
  785. s32Ret = AX_IVPS_StopGrp(nGrp);
  786. if (0 != s32Ret)
  787. {
  788. ALOGE("AX_IVPS_StopGrp failed,nGrp %d,s32Ret:0x%x", nGrp, s32Ret);
  789. return s32Ret;
  790. }
  791. for (nChn = 0; nChn < s_sample_ivps_chn_num[nGrp]; nChn++)
  792. {
  793. s32Ret = AX_IVPS_DisableChn(nGrp, nChn);
  794. if (0 != s32Ret)
  795. {
  796. ALOGE("AX_IVPS_DisableChn failed,nGrp %d,nChn %d,s32Ret:0x%x", nGrp, nChn, s32Ret);
  797. return s32Ret;
  798. }
  799. }
  800. s32Ret = AX_IVPS_DestoryGrp(nGrp);
  801. if (0 != s32Ret)
  802. {
  803. ALOGE("AX_IVPS_DestoryGrp failed,nGrp %d,s32Ret:0x%x", nGrp, s32Ret);
  804. return s32Ret;
  805. }
  806. }
  807. s32Ret = AX_IVPS_Deinit();
  808. if (0 != s32Ret)
  809. {
  810. ALOGE("AX_IVPS_Deinit failed,s32Ret:0x%x", s32Ret);
  811. return s32Ret;
  812. }
  813. return 0;
  814. }
  815. static AX_VOID *GetFrameThreadForAI(AX_VOID *pThreadParam)
  816. {
  817. IVPS_GET_THREAD_PARAM_T *t = (IVPS_GET_THREAD_PARAM_T *)pThreadParam;
  818. IVPS_GRP IvpsGrp = t->nIvpsGrp;
  819. IVPS_CHN IvpsChn = t->nIvpsChn;
  820. IVPS_CHN nIvpsIndex = t->nIvpsIndex;
  821. prctl(PR_SET_NAME, "SAMPLE_IVPS_GET_AI");
  822. while (!gLoopExit)
  823. {
  824. AX_VIDEO_FRAME_S tVideoFrame;
  825. AX_S32 ret = AX_IVPS_GetChnFrame(IvpsGrp, IvpsChn, &tVideoFrame, -1);
  826. if (0 != ret)
  827. {
  828. if (AX_ERR_IVPS_BUF_EMPTY == ret)
  829. {
  830. usleep(1000);
  831. continue;
  832. }
  833. usleep(1000);
  834. continue;
  835. }
  836. tVideoFrame.u64VirAddr[0] = (AX_U32)AX_POOL_GetBlockVirAddr(tVideoFrame.u32BlkId[0]);
  837. tVideoFrame.u64PhyAddr[0] = AX_POOL_Handle2PhysAddr(tVideoFrame.u32BlkId[0]);
  838. tVideoFrame.u32FrameSize = tVideoFrame.u32PicStride[0] * tVideoFrame.u32Height * 3 / 2;
  839. if (gJointHandle)
  840. {
  841. sampleRunJoint_RESULT_S *pResult = NULL;
  842. ret = SampleRunJointProcess(gJointHandle, (const AX_VIDEO_FRAME_S *)&tVideoFrame, &pResult);
  843. pthread_mutex_lock(&g_result_mutex);
  844. if(s32ModelType == 1){
  845. if (0 == ret && pResult)
  846. {
  847. memset(&g_sample_algo_result, 0x00, sizeof(g_sample_algo_result));
  848. AX_U8 i,j = 0;
  849. for (i = 0; i < pResult->nObjectSize && i < SAMPLE_RECT_BOX_COUNT; i++)
  850. {
  851. g_sample_algo_result.rect[i].fX = pResult->pstObjectItems[i].stRect.x / pResult->nWidth;
  852. g_sample_algo_result.rect[i].fY = pResult->pstObjectItems[i].stRect.y / pResult->nHeight;
  853. g_sample_algo_result.rect[i].fW = pResult->pstObjectItems[i].stRect.w / pResult->nWidth;
  854. g_sample_algo_result.rect[i].fH = pResult->pstObjectItems[i].stRect.h / pResult->nHeight;
  855. for(j =0;j < pResult->pstObjectItems[i].nLandmark;j++){
  856. g_sample_algo_result.pts[i].point[j].fX = pResult->pstObjectItems[i].landmark[j].x / pResult->nWidth;
  857. g_sample_algo_result.pts[i].point[j].fY = pResult->pstObjectItems[i].landmark[j].y / pResult->nHeight;
  858. g_sample_algo_result.pts[i].point[j].score = pResult->pstObjectItems[i].landmark[j].score;
  859. }
  860. }
  861. g_sample_algo_result.nSize = i;
  862. }
  863. ALOGN("==========================================");
  864. ALOGN("Object Size: %u\n", pResult->nObjectSize);
  865. ALOGN("Width: %d\n", pResult->nWidth);
  866. ALOGN("Height: %d\n", pResult->nHeight);
  867. for (int i = 0; i < pResult->nObjectSize; i++)
  868. {
  869. const sampleRunJoint_OBJECT_ITEM_S *objectItem = &(pResult->pstObjectItems[i]);
  870. ALOGN("Object %u - Label ID: %u, Label Name: %s, Probability: %f",
  871. i, objectItem->labelId, objectItem->labelName, objectItem->prob);
  872. ALOGN(" Rectangle: X=%f, Y=%f, Width=%f, Height=%f",
  873. objectItem->stRect.x, objectItem->stRect.y, objectItem->stRect.w, objectItem->stRect.h);
  874. ALOGN(" Landmarks:");
  875. for (AX_U32 j = 0; j < objectItem->nLandmark; ++j)
  876. {
  877. const sampleRunJoint_POINT_S *landmark = &(objectItem->landmark[j]);
  878. ALOGN(" Landmark %u - X=%f, Y=%f, Score=%f",
  879. j, landmark->x, landmark->y, landmark->score);
  880. }
  881. }
  882. ALOGN("==========================================");
  883. }
  884. pthread_mutex_unlock(&g_result_mutex);
  885. if (pResult)
  886. {
  887. SampleRunJointReleaseResult(pResult);
  888. }
  889. }
  890. ret = AX_IVPS_ReleaseChnFrame(IvpsGrp, IvpsChn, &tVideoFrame);
  891. }
  892. return (AX_VOID *)0;
  893. }
  894. AX_VOID *RgnThreadFunc(AX_VOID *pArg)
  895. {
  896. if (!pArg)
  897. {
  898. return (AX_VOID *)0;
  899. }
  900. prctl(PR_SET_NAME, "SAMPLE_IVPS_RGN");
  901. RGN_GROUP_CFG_T tRgnGroupConfig[SAMPLE_REGION_COUNT] = {
  902. {0, 0x11, 2688, 1520, SAMPLE_RECT_BOX_COUNT, AX_IVPS_RGN_LAYER_COVER},
  903. {1, 0x11, 720, 576, SAMPLE_RECT_BOX_COUNT, AX_IVPS_RGN_LAYER_COVER},
  904. };
  905. IVPS_REGION_PARAM_PTR pThreadParam = (IVPS_REGION_PARAM_PTR)pArg;
  906. AX_IVPS_FILTER nFilter = pThreadParam->nFilter;
  907. IVPS_GRP nIvpsGrp = pThreadParam->nGroup;
  908. AX_U8 nCfgIndex = -1;
  909. for (AX_U32 i = 0; i < SAMPLE_REGION_COUNT; ++i)
  910. {
  911. if (nIvpsGrp == tRgnGroupConfig[i].nGroup && nFilter == tRgnGroupConfig[i].nFilter)
  912. {
  913. nCfgIndex = i;
  914. break;
  915. }
  916. }
  917. if (-1 == nCfgIndex)
  918. {
  919. ALOGE("Can not find OSD configuration for group %d, filter 0x%x", nIvpsGrp, nFilter);
  920. return (AX_VOID *)0;
  921. }
  922. ALOGN("[%d][0x%02x] +++", nIvpsGrp, nFilter);
  923. AX_S32 ret = 0;
  924. pThreadParam->bExit = AX_FALSE;
  925. while (!pThreadParam->bExit && !gLoopExit)
  926. {
  927. RGN_GROUP_CFG_T *tGrpCfg = &tRgnGroupConfig[nCfgIndex];
  928. if (0 == tGrpCfg->nRgnNum)
  929. {
  930. break;
  931. }
  932. AX_IVPS_RGN_DISP_GROUP_S tDisp;
  933. memset(&tDisp, 0, sizeof(AX_IVPS_RGN_DISP_GROUP_S));
  934. tDisp.nNum = tGrpCfg->nRgnNum;
  935. tDisp.tChnAttr.nAlpha = 1024;
  936. tDisp.tChnAttr.eFormat = AX_FORMAT_ARGB1555;
  937. tDisp.tChnAttr.nZindex = nIvpsGrp + 1;
  938. tDisp.tChnAttr.nBitColor.nColor = 0xFF0000;
  939. tDisp.tChnAttr.nBitColor.bEnable = AX_FALSE;
  940. tDisp.tChnAttr.nBitColor.nColorInv = 0xFF;
  941. tDisp.tChnAttr.nBitColor.nColorInvThr = 0xA0A0A0;
  942. pthread_mutex_lock(&g_result_mutex);
  943. for (AX_U8 i = 0; i < tDisp.nNum; ++i)
  944. {
  945. if (i < g_sample_algo_result.nSize)
  946. {
  947. tDisp.arrDisp[i].bShow = AX_TRUE;
  948. tDisp.arrDisp[i].eType = AX_IVPS_RGN_TYPE_RECT;
  949. AX_U32 nChnWidth = tGrpCfg->nChnWidth;
  950. AX_U32 nChnHeight = tGrpCfg->nChnHeight;
  951. tDisp.arrDisp[i].uDisp.tPolygon.tRect.nX = (AX_U32)(g_sample_algo_result.rect[i].fX * nChnWidth);
  952. tDisp.arrDisp[i].uDisp.tPolygon.tRect.nY = (AX_U32)(g_sample_algo_result.rect[i].fY * nChnHeight);
  953. tDisp.arrDisp[i].uDisp.tPolygon.tRect.nW = (AX_U32)(g_sample_algo_result.rect[i].fW * nChnWidth);
  954. tDisp.arrDisp[i].uDisp.tPolygon.tRect.nH = (AX_U32)(g_sample_algo_result.rect[i].fH * nChnHeight);
  955. tDisp.arrDisp[i].uDisp.tPolygon.bSolid = AX_FALSE;
  956. tDisp.arrDisp[i].uDisp.tPolygon.nLineWidth = 2;
  957. tDisp.arrDisp[i].uDisp.tPolygon.nColor = GREEN;
  958. tDisp.arrDisp[i].uDisp.tPolygon.nAlpha = 255;
  959. }
  960. else
  961. {
  962. tDisp.arrDisp[i].bShow = AX_FALSE;
  963. }
  964. }
  965. pthread_mutex_unlock(&g_result_mutex);
  966. ret = AX_IVPS_RGN_Update(pThreadParam->hChnRgn, &tDisp);
  967. if (0 != ret)
  968. {
  969. ALOGE("[%d][0x%02x] AX_IVPS_RGN_Update fail, ret=0x%x, hChnRgn=%d", nIvpsGrp, nFilter, ret, pThreadParam->hChnRgn);
  970. }
  971. usleep(60000);
  972. }
  973. ALOGN("[%d][0x%02x] ---", nIvpsGrp, nFilter);
  974. return (AX_VOID *)0;
  975. }
  976. AX_S32 IVPS_ThreadStart(AX_VOID *p)
  977. {
  978. pthread_t tid = 0;
  979. // AI
  980. if (0 != pthread_create(&tid, NULL, GetFrameThreadForAI, (AX_VOID *)&s_sample_ivps_thread_param[1]))
  981. {
  982. return -1;
  983. }
  984. pthread_detach(tid);
  985. /* Start region thread */
  986. for (AX_U8 i = 0; i < SAMPLE_REGION_COUNT; i++)
  987. {
  988. if (AX_IVPS_INVALID_REGION_HANDLE != g_arrRgnThreadParam[i].hChnRgn)
  989. {
  990. if (0 != pthread_create(&tid, NULL, RgnThreadFunc, (AX_VOID *)&g_arrRgnThreadParam[i]))
  991. {
  992. return -1;
  993. }
  994. pthread_detach(tid);
  995. }
  996. }
  997. return 0;
  998. }
  999. static AX_VOID *GetYuvFrameThread(AX_VOID *p)
  1000. {
  1001. AX_YUV_SOURCE_ID_E nChn = AX_YUV_SOURCE_ID_MAIN;
  1002. AX_U64 nPhyaddr = 0;
  1003. AX_VOID *pViraddr = NULL;
  1004. prctl(PR_SET_NAME, "SAMPLE_YUV_GET");
  1005. FILE *fp = fopen(s_sample_strInputYuvFile, "rb");
  1006. if (fp)
  1007. {
  1008. fseek(fp, 0, SEEK_END);
  1009. AX_U32 nFileSize = ftell(fp);
  1010. fseek(fp, 0, SEEK_SET);
  1011. AX_S32 ret = AX_SYS_MemAlloc(&nPhyaddr, &pViraddr, nFileSize, 256, NULL);
  1012. if (0 == ret)
  1013. {
  1014. AX_U64 *pData = (AX_U64 *)pViraddr;
  1015. fread(pData, nFileSize, 1, fp);
  1016. }
  1017. fclose(fp);
  1018. }
  1019. AXI_DMA_HAND_T nDMAHandle = AX_HAL_DMA_ChnOpen();
  1020. while (!gLoopExit)
  1021. {
  1022. AX_IMG_INFO_T tImgInfo;
  1023. AX_S32 nRet = AX_VIN_GetYuvFrame(0, nChn, &tImgInfo, -1);
  1024. if (0 != nRet)
  1025. {
  1026. continue;
  1027. }
  1028. AX_VIDEO_FRAME_S tDstFrame;
  1029. AX_BLK BlkId = 0;
  1030. AX_U32 nImgSize = 0;
  1031. AX_U64 nPhyAddr = 0;
  1032. memset(&tDstFrame, 0, sizeof(tDstFrame));
  1033. nImgSize = CalcImgSize(tImgInfo.tFrameInfo.stVFrame.u32PicStride[0],
  1034. tImgInfo.tFrameInfo.stVFrame.u32Width,
  1035. tImgInfo.tFrameInfo.stVFrame.u32Height,
  1036. AX_YUV420_SEMIPLANAR,
  1037. 16);
  1038. nRet = BufPoolBlockAddrGet(AX_INVALID_POOLID, nImgSize, &tDstFrame.u64PhyAddr[0], (AX_VOID **)(&tDstFrame.u64VirAddr[0]), &BlkId);
  1039. if (nRet != 0)
  1040. {
  1041. ALOGE("BufPoolBlockAddrGet fail");
  1042. AX_VIN_ReleaseYuvFrame(0, nChn, &tImgInfo);
  1043. continue;
  1044. }
  1045. AX_POOL_IncreaseRefCnt(BlkId, AX_ID_USER);
  1046. AXI_DMA_CFG_T tDMACfg;
  1047. AXI_DMA_XFER_T tDMAXferCfg;
  1048. memset(&tDMACfg, 0x00, sizeof(tDMACfg));
  1049. memset(&tDMAXferCfg, 0x00, sizeof(tDMAXferCfg));
  1050. tDMACfg.lli_num = 1;
  1051. tDMACfg.direction = AX_DMA_MEM_TO_MEM;
  1052. tDMACfg.xfer_mode = AX_DMA_TRF_SINGLE;
  1053. tDMAXferCfg.dst_addr = tDstFrame.u64PhyAddr[0];
  1054. tDMAXferCfg.src_addr = nPhyaddr;
  1055. tDMAXferCfg.xfer_len = nImgSize;
  1056. AX_HAL_DMA_ChnCfg(nDMAHandle, &tDMACfg, &tDMAXferCfg);
  1057. AX_HAL_DMA_ChnStart(nDMAHandle);
  1058. while (AX_HAL_DMA_ChnWaitDone(nDMAHandle, AX_DMA_BROKED_MODE, AX_DMA_WAITING_FOREVER) != 0)
  1059. ;
  1060. AX_VIN_ReleaseYuvFrame(0, nChn, &tImgInfo);
  1061. tDstFrame.enImgFormat = AX_YUV420_SEMIPLANAR;
  1062. tDstFrame.u32Width = tImgInfo.tFrameInfo.stVFrame.u32Width;
  1063. tDstFrame.u32Height = tImgInfo.tFrameInfo.stVFrame.u32Height;
  1064. tDstFrame.u32PicStride[0] = tImgInfo.tFrameInfo.stVFrame.u32PicStride[0];
  1065. tDstFrame.u32PicStride[1] = tImgInfo.tFrameInfo.stVFrame.u32PicStride[1];
  1066. tDstFrame.u32PicStride[2] = tImgInfo.tFrameInfo.stVFrame.u32PicStride[2];
  1067. tDstFrame.u32FrameSize = nImgSize;
  1068. tDstFrame.u32BlkId[0] = BlkId;
  1069. tDstFrame.u64PhyAddr[1] = tDstFrame.u64PhyAddr[0] + tDstFrame.u32PicStride[0] * tDstFrame.u32Height;
  1070. nRet = AX_IVPS_SendFrame(0, &tDstFrame, -1);
  1071. if (nRet != 0)
  1072. {
  1073. ALOGE("AX_IVPS_SendFrame fail nRet=%x", nRet);
  1074. continue;
  1075. }
  1076. if (BlkId != 0)
  1077. {
  1078. AX_POOL_DecreaseRefCnt(BlkId, AX_ID_USER);
  1079. nRet = AX_POOL_ReleaseBlock(BlkId);
  1080. }
  1081. }
  1082. if (nPhyaddr != 0)
  1083. {
  1084. AX_SYS_MemFree(nPhyaddr, pViraddr);
  1085. }
  1086. AX_HAL_DMA_ChnClose(nDMAHandle);
  1087. return (AX_VOID *)0;
  1088. }
  1089. AX_S32 VIN_ThreadStart(AX_VOID)
  1090. {
  1091. pthread_t tid = 0;
  1092. if (0 != pthread_create(&tid, NULL, GetYuvFrameThread, NULL))
  1093. {
  1094. return -1;
  1095. }
  1096. return 0;
  1097. }
  1098. static void *IspRun(void *args)
  1099. {
  1100. AX_U32 i = (AX_U32)args;
  1101. ALOGN("cam %d is running...", i);
  1102. while (!g_isp_force_loop_exit)
  1103. {
  1104. if (!gCams[i].bOpen)
  1105. {
  1106. usleep(40 * 1000);
  1107. continue;
  1108. }
  1109. AX_ISP_Run(gCams[i].nPipeId);
  1110. }
  1111. return NULL;
  1112. }
  1113. static AX_S32 SysRun()
  1114. {
  1115. AX_S32 s32Ret = 0, i;
  1116. g_isp_force_loop_exit = 0;
  1117. for (i = 0; i < MAX_CAMERAS; i++)
  1118. {
  1119. if (gCams[i].bOpen)
  1120. pthread_create(&gCams[i].tIspProcThread, NULL, IspRun, (AX_VOID *)i);
  1121. }
  1122. while (!gLoopExit)
  1123. {
  1124. sleep(1);
  1125. }
  1126. g_isp_force_loop_exit = 1;
  1127. for (i = 0; i < MAX_CAMERAS; i++)
  1128. {
  1129. if (gCams[i].bOpen)
  1130. {
  1131. pthread_cancel(gCams[i].tIspProcThread);
  1132. s32Ret = pthread_join(gCams[i].tIspProcThread, NULL);
  1133. if (s32Ret < 0)
  1134. {
  1135. ALOGE(" isp run thread exit failed,s32Ret:0x%x\n", s32Ret);
  1136. }
  1137. }
  1138. }
  1139. return 0;
  1140. }
  1141. static AX_VOID __sigint(int iSigNo)
  1142. {
  1143. // ALOGN("Catch signal %d!\n", iSigNo);
  1144. gLoopExit = 1;
  1145. return;
  1146. }
  1147. static AX_S32 LinkControl(AX_BOOL bLink)
  1148. {
  1149. /*
  1150. VIN --> IVPS
  1151. (ModId GrpId ChnId) | (ModId GrpId ChnId)
  1152. --------------------------------------------------
  1153. (VIN 0 1) -> (IVPS 1 0)
  1154. (VIN 0 0) -> (IVPS 0 0)
  1155. */
  1156. AX_MOD_INFO_S srcMod, dstMod;
  1157. if (!s_sample_strInputYuvFile)
  1158. {
  1159. srcMod.enModId = AX_ID_VIN;
  1160. srcMod.s32GrpId = 0;
  1161. srcMod.s32ChnId = 0;
  1162. dstMod.enModId = AX_ID_IVPS;
  1163. dstMod.s32GrpId = 0;
  1164. dstMod.s32ChnId = 0;
  1165. bLink ? AX_SYS_Link(&srcMod, &dstMod) : AX_SYS_UnLink(&srcMod, &dstMod);
  1166. }
  1167. srcMod.enModId = AX_ID_VIN;
  1168. srcMod.s32GrpId = 0;
  1169. srcMod.s32ChnId = 1;
  1170. dstMod.enModId = AX_ID_IVPS;
  1171. dstMod.s32GrpId = 1;
  1172. dstMod.s32ChnId = 0;
  1173. bLink ? AX_SYS_Link(&srcMod, &dstMod) : AX_SYS_UnLink(&srcMod, &dstMod);
  1174. /*
  1175. IVPS --> VENC
  1176. (ModId GrpId ChnId) | (ModId GrpId ChnId)
  1177. --------------------------------------------------
  1178. (IVPS 1 0) -> (VENC 0 2)
  1179. (IVPS 0 0) -> (VENC 0 0)
  1180. */
  1181. srcMod.enModId = AX_ID_IVPS;
  1182. srcMod.s32GrpId = 0;
  1183. srcMod.s32ChnId = 0;
  1184. dstMod.enModId = AX_ID_VENC;
  1185. dstMod.s32GrpId = 0;
  1186. dstMod.s32ChnId = 0;
  1187. bLink ? AX_SYS_Link(&srcMod, &dstMod) : AX_SYS_UnLink(&srcMod, &dstMod);
  1188. srcMod.enModId = AX_ID_IVPS;
  1189. srcMod.s32GrpId = 1;
  1190. srcMod.s32ChnId = 0;
  1191. dstMod.enModId = AX_ID_VENC;
  1192. dstMod.s32GrpId = 0;
  1193. dstMod.s32ChnId = 2;
  1194. bLink ? AX_SYS_Link(&srcMod, &dstMod) : AX_SYS_UnLink(&srcMod, &dstMod);
  1195. return 0;
  1196. }
  1197. static AX_S32 SampleLinkInit()
  1198. {
  1199. return LinkControl(AX_TRUE);
  1200. ;
  1201. }
  1202. static AX_S32 SampleLinkDeInit()
  1203. {
  1204. return LinkControl(AX_FALSE);
  1205. ;
  1206. }
  1207. AX_BOOL LoadGdcConfig(const AX_CHAR *strGdcConfig)
  1208. {
  1209. AX_INI_HANDLE handle = NULL;
  1210. AX_BOOL bRet = AX_FALSE;
  1211. AX_S32 ret = AX_INI_Load(strGdcConfig, &handle);
  1212. if (ret != 0)
  1213. {
  1214. ALOGE("open file failed!");
  1215. goto EXIT;
  1216. }
  1217. if (handle)
  1218. {
  1219. const AX_CHAR *strLdcSect = "ldc";
  1220. if (AX_INI_HasSection(handle, strLdcSect))
  1221. {
  1222. if (0 == AX_INI_GetIntValue(handle, strLdcSect, "dRatio", &s_sample_ldc_dRatio))
  1223. {
  1224. ALOGI("dRatio = %d", s_sample_ldc_dRatio);
  1225. }
  1226. else
  1227. {
  1228. ALOGE("no dRatio");
  1229. goto EXIT;
  1230. }
  1231. if (0 == AX_INI_GetIntValue(handle, strLdcSect, "xRatio", &s_sample_ldc_xRatio))
  1232. {
  1233. ALOGI("xRatio = %d", s_sample_ldc_xRatio);
  1234. }
  1235. else
  1236. {
  1237. ALOGE("no xRatio");
  1238. goto EXIT;
  1239. }
  1240. if (0 == AX_INI_GetIntValue(handle, strLdcSect, "yRatio", &s_sample_ldc_yRatio))
  1241. {
  1242. ALOGI("yRatio = %d", s_sample_ldc_yRatio);
  1243. }
  1244. else
  1245. {
  1246. ALOGE("no yRatio");
  1247. goto EXIT;
  1248. }
  1249. s_sample_ldc_mode = AX_TRUE;
  1250. }
  1251. const AX_CHAR *strGdcSect = "gdc";
  1252. if (AX_INI_HasSection(handle, strGdcSect))
  1253. {
  1254. AX_S32 dewarpType = 0;
  1255. if (0 == AX_INI_GetIntValue(handle, strGdcSect, "dewarp", &dewarpType))
  1256. {
  1257. ALOGI("dewarpType = %d", dewarpType);
  1258. }
  1259. else
  1260. {
  1261. ALOGN("no dewarp");
  1262. bRet = AX_TRUE;
  1263. goto EXIT;
  1264. }
  1265. s_sample_gdc_dewarp = (AX_IVPS_DEWARP_TYPE_E)dewarpType;
  1266. if (s_sample_gdc_dewarp >= AX_IVPS_DEWARP_BUTT)
  1267. {
  1268. ALOGE("invalid dewarp type(%d)", s_sample_gdc_dewarp);
  1269. goto EXIT;
  1270. }
  1271. if (s_sample_gdc_dewarp == AX_IVPS_DEWARP_PERSPECTIVE)
  1272. {
  1273. const AX_CHAR *strPerspectiveSect = "perspective";
  1274. if (AX_INI_HasSection(handle, strPerspectiveSect))
  1275. {
  1276. AX_F64 matrix[9] = {0};
  1277. AX_S32 matrixSize = 0;
  1278. if (0 == AX_INI_GetArrayValue(handle, strPerspectiveSect, "matrix", matrix, &matrixSize, 9))
  1279. {
  1280. ALOGI("matrix size(%d):", matrixSize);
  1281. for (AX_S32 i = 0; i < matrixSize; i++)
  1282. {
  1283. ALOGI(" matrix[%d]: %.20f", i, matrix[i]);
  1284. }
  1285. if (matrixSize != 9)
  1286. {
  1287. ALOGE("invalid matrix size(%d)", matrixSize);
  1288. goto EXIT;
  1289. }
  1290. for (AX_S32 i = 0; i < matrixSize; i++)
  1291. {
  1292. s_sample_gdc_perspective_matrix[i] = (AX_S64)matrix[i];
  1293. }
  1294. }
  1295. else
  1296. {
  1297. ALOGE("no matrix");
  1298. goto EXIT;
  1299. }
  1300. }
  1301. else
  1302. {
  1303. ALOGE("no section: %s", strPerspectiveSect);
  1304. goto EXIT;
  1305. }
  1306. bRet = AX_TRUE;
  1307. }
  1308. }
  1309. else
  1310. {
  1311. ALOGN("no gdc dewarp");
  1312. bRet = AX_TRUE;
  1313. goto EXIT;
  1314. }
  1315. }
  1316. EXIT:
  1317. if (handle)
  1318. {
  1319. AX_INI_Close(handle);
  1320. }
  1321. return bRet;
  1322. }
  1323. static AX_VOID PrintHelp(char *testApp)
  1324. {
  1325. printf("Usage:%s -h for help\n\n", testApp);
  1326. printf("\t-c: ISP Test Case:\n");
  1327. printf("\t\t0: Single OS04A10\n");
  1328. printf("\t\t1: Single IMX334\n");
  1329. printf("\t\t2: Single GC4653\n");
  1330. printf("\t\t3: Single OS08A20\n");
  1331. printf("\t\t4: Single OS04A10 Online\n");
  1332. printf("\t-e: SDR/HDR Mode:\n");
  1333. printf("\t\t1: SDR\n");
  1334. printf("\t\t2: HDR 2DOL\n");
  1335. printf("\t-v: Video Encode Type, default is h264\n");
  1336. printf("\t\t0: h264\n");
  1337. printf("\t\t1: h265\n");
  1338. printf("\t-r: Sensor&Video Framerate (framerate need supported by sensor), default is 25\n");
  1339. printf("\t-g: Gdc config, default empty for none Gdc mode\n");
  1340. printf("\t\tfilename: Gdc config file\n");
  1341. printf("\t-i: input source, default empty for input source from camera\n");
  1342. printf("\t\tfilename: input yuv source file\n");
  1343. exit(0);
  1344. }
  1345. int main(int argc, char *argv[])
  1346. {
  1347. AX_S32 isExit = 0, i, ch;
  1348. AX_S32 s32Ret = 0;
  1349. COMMON_SYS_CASE_E eSysCase = SYS_CASE_NONE;
  1350. COMMON_SYS_ARGS_T tCommonArgs = {0};
  1351. AX_SNS_HDR_MODE_E eHdrMode = AX_SNS_LINEAR_MODE;
  1352. SAMPLE_SNS_TYPE_E eSnsType = OMNIVISION_OS04A10;
  1353. COMMON_VENC_CASE_E eVencType = VENC_CASE_H264;
  1354. const AX_CHAR *strGdcConfig = NULL;
  1355. signal(SIGPIPE, SIG_IGN);
  1356. signal(SIGINT, __sigint);
  1357. ALOGN("sample_vin_ivps_joint_venc_rtsp begin\n\n");
  1358. if (argc < 2)
  1359. {
  1360. PrintHelp(argv[0]);
  1361. exit(0);
  1362. }
  1363. while ((ch = getopt(argc, argv, "c:e:v:r:g:i:h")) != -1)
  1364. {
  1365. isExit = 0;
  1366. switch (ch)
  1367. {
  1368. case 'c':
  1369. eSysCase = (COMMON_SYS_CASE_E)atoi(optarg);
  1370. break;
  1371. case 'e':
  1372. eHdrMode = (AX_SNS_HDR_MODE_E)atoi(optarg);
  1373. break;
  1374. case 'v':
  1375. eVencType = (COMMON_VENC_CASE_E)atoi(optarg);
  1376. if (eVencType != VENC_CASE_H264 && eVencType != VENC_CASE_H265)
  1377. {
  1378. isExit = 1;
  1379. }
  1380. break;
  1381. case 'r':
  1382. s_sample_framerate = (AX_S32)atoi(optarg);
  1383. if (s_sample_framerate <= 0)
  1384. {
  1385. s_sample_framerate = 25;
  1386. }
  1387. break;
  1388. case 'g':
  1389. strGdcConfig = optarg;
  1390. if (!strGdcConfig)
  1391. {
  1392. isExit = 1;
  1393. }
  1394. break;
  1395. case 'i':
  1396. s_sample_strInputYuvFile = optarg;
  1397. if (!s_sample_strInputYuvFile)
  1398. {
  1399. isExit = 1;
  1400. }
  1401. break;
  1402. case 'h':
  1403. isExit = 1;
  1404. break;
  1405. default:
  1406. isExit = 1;
  1407. break;
  1408. }
  1409. }
  1410. if (isExit)
  1411. {
  1412. PrintHelp(argv[0]);
  1413. exit(0);
  1414. }
  1415. ALOGN("eSysCase=%d,eHdrMode=%d,eVencType=%d\n", eSysCase, eHdrMode, eVencType);
  1416. if (strGdcConfig)
  1417. {
  1418. if (!LoadGdcConfig(strGdcConfig))
  1419. {
  1420. ALOGE("load gdc config file fail");
  1421. exit(0);
  1422. }
  1423. }
  1424. if (eSysCase == SYS_CASE_SINGLE_OS04A10)
  1425. {
  1426. tCommonArgs.nCamCnt = 1;
  1427. eSnsType = OMNIVISION_OS04A10;
  1428. COMMON_ISP_GetSnsConfig(OMNIVISION_OS04A10, &gCams[0].stSnsAttr, &gCams[0].stSnsClkAttr, &gCams[0].stDevAttr, &gCams[0].stPipeAttr, &gCams[0].stChnAttr);
  1429. if (eHdrMode == AX_SNS_LINEAR_MODE)
  1430. {
  1431. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04a10Sdr) / sizeof(gtSysCommPoolSingleOs04a10Sdr[0]);
  1432. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs04a10Sdr;
  1433. }
  1434. else if (eHdrMode == AX_SNS_HDR_2X_MODE)
  1435. {
  1436. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04a10Hdr) / sizeof(gtSysCommPoolSingleOs04a10Hdr[0]);
  1437. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs04a10Hdr;
  1438. }
  1439. gCams[0].stPipeAttr.ePipeDataSrc = AX_PIPE_SOURCE_DEV_ONLINE;
  1440. gCams[0].stSnsAttr.nFrameRate = s_sample_framerate;
  1441. gCams[0].stChnAttr.tChnAttr[2].bEnable = AX_FALSE;
  1442. }
  1443. else if (eSysCase == SYS_CASE_SINGLE_OS04A10_ONLINE)
  1444. {
  1445. tCommonArgs.nCamCnt = 1;
  1446. eSnsType = OMNIVISION_OS04A10;
  1447. COMMON_ISP_GetSnsConfig(OMNIVISION_OS04A10, &gCams[0].stSnsAttr, &gCams[0].stSnsClkAttr, &gCams[0].stDevAttr, &gCams[0].stPipeAttr, &gCams[0].stChnAttr);
  1448. if (eHdrMode == AX_SNS_LINEAR_MODE)
  1449. {
  1450. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04a10OnlineSdr) / sizeof(gtSysCommPoolSingleOs04a10OnlineSdr[0]);
  1451. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs04a10OnlineSdr;
  1452. }
  1453. else if (eHdrMode == AX_SNS_HDR_2X_MODE)
  1454. {
  1455. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs04a10OnlineHdr) / sizeof(gtSysCommPoolSingleOs04a10OnlineHdr[0]);
  1456. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs04a10OnlineHdr;
  1457. }
  1458. gCams[0].stPipeAttr.ePipeDataSrc = AX_PIPE_SOURCE_DEV_ONLINE;
  1459. gCams[0].stChnAttr.tChnAttr[0].nDepth = 1;
  1460. gCams[0].stChnAttr.tChnAttr[1].nDepth = 1;
  1461. gCams[0].stChnAttr.tChnAttr[2].nDepth = 1;
  1462. gCams[0].stSnsAttr.nFrameRate = s_sample_framerate;
  1463. gCams[0].stChnAttr.tChnAttr[2].bEnable = AX_FALSE;
  1464. }
  1465. else if (eSysCase == SYS_CASE_SINGLE_IMX334)
  1466. {
  1467. tCommonArgs.nCamCnt = 1;
  1468. eSnsType = SONY_IMX334;
  1469. COMMON_ISP_GetSnsConfig(SONY_IMX334, &gCams[0].stSnsAttr, &gCams[0].stSnsClkAttr, &gCams[0].stDevAttr, &gCams[0].stPipeAttr,
  1470. &gCams[0].stChnAttr);
  1471. if (eHdrMode == AX_SNS_LINEAR_MODE)
  1472. {
  1473. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleImx334Sdr) / sizeof(gtSysCommPoolSingleImx334Sdr[0]);
  1474. tCommonArgs.pPoolCfg = gtSysCommPoolSingleImx334Sdr;
  1475. gCams[0].stSnsAttr.eRawType = AX_RT_RAW12;
  1476. gCams[0].stDevAttr.ePixelFmt = AX_FORMAT_BAYER_RAW_12BPP;
  1477. gCams[0].stPipeAttr.ePixelFmt = AX_FORMAT_BAYER_RAW_12BPP;
  1478. }
  1479. else
  1480. {
  1481. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleImx334Hdr) / sizeof(gtSysCommPoolSingleImx334Hdr[0]);
  1482. tCommonArgs.pPoolCfg = gtSysCommPoolSingleImx334Hdr;
  1483. }
  1484. gCams[0].stSnsAttr.nFrameRate = s_sample_framerate;
  1485. gCams[0].stChnAttr.tChnAttr[2].bEnable = AX_FALSE;
  1486. }
  1487. else if (eSysCase == SYS_CASE_SINGLE_GC4653)
  1488. {
  1489. tCommonArgs.nCamCnt = 1;
  1490. eSnsType = GALAXYCORE_GC4653;
  1491. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleGc4653) / sizeof(gtSysCommPoolSingleGc4653[0]);
  1492. tCommonArgs.pPoolCfg = gtSysCommPoolSingleGc4653;
  1493. COMMON_ISP_GetSnsConfig(GALAXYCORE_GC4653, &gCams[0].stSnsAttr, &gCams[0].stSnsClkAttr, &gCams[0].stDevAttr, &gCams[0].stPipeAttr,
  1494. &gCams[0].stChnAttr);
  1495. gCams[0].stSnsAttr.nFrameRate = s_sample_framerate;
  1496. gCams[0].stChnAttr.tChnAttr[2].bEnable = AX_FALSE;
  1497. }
  1498. else if (eSysCase == SYS_CASE_SINGLE_OS08A20)
  1499. {
  1500. tCommonArgs.nCamCnt = 1;
  1501. eSnsType = OMNIVISION_OS08A20;
  1502. COMMON_ISP_GetSnsConfig(OMNIVISION_OS08A20, &gCams[0].stSnsAttr, &gCams[0].stSnsClkAttr, &gCams[0].stDevAttr, &gCams[0].stPipeAttr,
  1503. &gCams[0].stChnAttr);
  1504. if (eHdrMode == AX_SNS_LINEAR_MODE)
  1505. {
  1506. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs08a20Sdr) / sizeof(gtSysCommPoolSingleOs08a20Sdr[0]);
  1507. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs08a20Sdr;
  1508. gCams[0].stSnsAttr.eRawType = AX_RT_RAW12;
  1509. gCams[0].stDevAttr.ePixelFmt = AX_FORMAT_BAYER_RAW_12BPP;
  1510. gCams[0].stPipeAttr.ePixelFmt = AX_FORMAT_BAYER_RAW_12BPP;
  1511. }
  1512. else
  1513. {
  1514. tCommonArgs.nPoolCfgCnt = sizeof(gtSysCommPoolSingleOs08a20Hdr) / sizeof(gtSysCommPoolSingleOs08a20Hdr[0]);
  1515. tCommonArgs.pPoolCfg = gtSysCommPoolSingleOs08a20Hdr;
  1516. }
  1517. gCams[0].stSnsAttr.nFrameRate = s_sample_framerate;
  1518. gCams[0].stChnAttr.tChnAttr[2].bEnable = AX_FALSE;
  1519. }
  1520. else
  1521. {
  1522. ALOGE("Unsupported case eSysCase=%d\n", eSysCase);
  1523. PrintHelp(argv[0]);
  1524. exit(0);
  1525. }
  1526. // FIXME.
  1527. if (s_sample_ldc_mode || s_sample_gdc_dewarp != AX_IVPS_DEWARP_BUTT)
  1528. {
  1529. tCommonArgs.pPoolCfg[2].nBlkCnt += 4;
  1530. }
  1531. if (s_sample_strInputYuvFile)
  1532. {
  1533. FILE *fp = fopen(s_sample_strInputYuvFile, "rb");
  1534. if (fp)
  1535. {
  1536. fseek(fp, 0, SEEK_END);
  1537. AX_U32 nFileSize = ftell(fp);
  1538. if (nFileSize != gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nWidth * gCams[0].stChnAttr.tChnAttr[AX_YUV_SOURCE_ID_MAIN].nHeight * 3 / 2)
  1539. {
  1540. ALOGE("%s not matched", s_sample_strInputYuvFile);
  1541. exit(0);
  1542. }
  1543. ALOGN("main channel will use input source: %s", s_sample_strInputYuvFile);
  1544. fclose(fp);
  1545. }
  1546. else
  1547. {
  1548. ALOGE("%s not exist", s_sample_strInputYuvFile);
  1549. exit(0);
  1550. }
  1551. }
  1552. /*step 1:sys init*/
  1553. s32Ret = COMMON_SYS_Init(&tCommonArgs);
  1554. if (s32Ret)
  1555. {
  1556. ALOGE("COMMON_SYS_Init failed,s32Ret:0x%x\n", s32Ret);
  1557. return -1;
  1558. }
  1559. /*step 2:link init*/
  1560. s32Ret = SampleLinkInit();
  1561. if (s32Ret)
  1562. {
  1563. ALOGE("COMMON_SYS_Init failed,s32Ret:0x%x\n", s32Ret);
  1564. goto EXIT_1;
  1565. }
  1566. /*step 3:npu init*/
  1567. for (i = 0; i < tCommonArgs.nCamCnt; i++)
  1568. {
  1569. gCams[i].eSnsType = eSnsType;
  1570. gCams[i].stSnsAttr.eSnsMode = eHdrMode;
  1571. gCams[i].stDevAttr.eSnsMode = eHdrMode;
  1572. gCams[i].stPipeAttr.eSnsMode = eHdrMode;
  1573. if (s_sample_strInputYuvFile)
  1574. {
  1575. gCams[i].stChnAttr.tChnAttr[0].nDepth = 1;
  1576. }
  1577. else
  1578. {
  1579. gCams[i].stChnAttr.tChnAttr[0].nDepth = 0;
  1580. }
  1581. gCams[i].stChnAttr.tChnAttr[1].nDepth = 0;
  1582. gCams[i].stChnAttr.tChnAttr[2].nDepth = 0;
  1583. if (i == 0)
  1584. {
  1585. gCams[i].nDevId = 0;
  1586. gCams[i].nRxDev = AX_MIPI_RX_DEV_0;
  1587. gCams[i].nPipeId = 0;
  1588. }
  1589. else if (i == 1)
  1590. {
  1591. gCams[i].nDevId = 2;
  1592. gCams[i].nRxDev = AX_MIPI_RX_DEV_2;
  1593. gCams[i].nPipeId = 2;
  1594. }
  1595. }
  1596. AX_NPU_SDK_EX_ATTR_T sNpuAttr;
  1597. sNpuAttr.eHardMode = AX_NPU_VIRTUAL_1_1;
  1598. s32Ret = AX_NPU_SDK_EX_Init_with_attr(&sNpuAttr);
  1599. if (0 != s32Ret)
  1600. {
  1601. ALOGE("AX_NPU_SDK_EX_Init_with_attr failed,s32Ret:0x%x\n", s32Ret);
  1602. goto EXIT_2;
  1603. }
  1604. // s32ModelType = 1;
  1605. // s32ModelType 人体关键点+检测模型=1、分割模型=2。
  1606. // s32Ret = SampleRunJointInit("/share/AX620_SDK_V0.31.0_P44_20230302193737_NO519/msp/sample/asj_ai/model/yolov8n_pose_pullup.joint", &gJointHandle,s32ModelType);
  1607. s32ModelType = 2;
  1608. s32Ret = SampleRunJointInit("/share/AX620_SDK_V0.31.0_P44_20230302193737_NO519/msp/sample/asj_ai/model/yolov8n-seg-sub.joint", &gJointHandle,s32ModelType);
  1609. if (0 != s32Ret || !gJointHandle)
  1610. {
  1611. ALOGE("runjoint init failed,s32Ret:0x%x\n", s32Ret);
  1612. goto EXIT_2;
  1613. }
  1614. /*step 3:camera init*/
  1615. s32Ret = COMMON_CAM_Init();
  1616. if (0 != s32Ret)
  1617. {
  1618. ALOGE("COMMON_CAM_Init failed,s32Ret:0x%x\n", s32Ret);
  1619. goto EXIT_2;
  1620. }
  1621. AX_Rtsp_Start((AX_S32 *)gVencChnMapping, SAMPLE_VENC_CHN_NUM, eVencType == VENC_CASE_H264 ? AX_TRUE : AX_FALSE);
  1622. for (i = 0; i < tCommonArgs.nCamCnt; i++)
  1623. {
  1624. s32Ret = COMMON_CAM_Open(&gCams[i]);
  1625. if (s32Ret)
  1626. {
  1627. ALOGE("COMMON_CAM_Open failed,s32Ret:0x%x\n", s32Ret);
  1628. goto EXIT_3;
  1629. }
  1630. gCams[i].bOpen = AX_TRUE;
  1631. ALOGN("camera %d is open\n", i);
  1632. }
  1633. /*step 4:ivps init*/
  1634. s32Ret = SampleIvpsInit();
  1635. if (AX_SUCCESS != s32Ret)
  1636. {
  1637. ALOGE("SampleIvpsInit failed,s32Ret:0x%x\n", s32Ret);
  1638. goto EXIT_4;
  1639. }
  1640. /*step 5:venc init*/
  1641. s32Ret = SampleVencInit(eVencType);
  1642. if (AX_SUCCESS != s32Ret)
  1643. {
  1644. ALOGE("SampleVencInit failed,s32Ret:0x%x\n", s32Ret);
  1645. goto EXIT_5;
  1646. }
  1647. /*step 6:sys run*/
  1648. if (s_sample_strInputYuvFile)
  1649. {
  1650. VIN_ThreadStart();
  1651. }
  1652. IVPS_ThreadStart(NULL);
  1653. s32Ret = SysRun();
  1654. if (AX_SUCCESS != s32Ret)
  1655. {
  1656. ALOGE("SysRun error,s32Ret:0x%x\n", s32Ret);
  1657. goto EXIT_6;
  1658. }
  1659. EXIT_6:
  1660. SampleVencDeInit();
  1661. EXIT_5:
  1662. StopOverlay();
  1663. SampleIvpsDeInit();
  1664. EXIT_4:
  1665. for (i = 0; i < tCommonArgs.nCamCnt; i++)
  1666. {
  1667. if (!gCams[i].bOpen)
  1668. continue;
  1669. COMMON_CAM_Close(&gCams[i]);
  1670. }
  1671. AX_Rtsp_Stop();
  1672. EXIT_3:
  1673. COMMON_CAM_Deinit();
  1674. EXIT_2:
  1675. SampleLinkDeInit();
  1676. if (gJointHandle)
  1677. {
  1678. SampleRunJointDeInit(gJointHandle);
  1679. }
  1680. EXIT_1:
  1681. COMMON_SYS_DeInit();
  1682. ALOGN("sample_vin_ivps_joint_venc_rtsp end\n");
  1683. return 0;
  1684. }