ARKMirrorRender.cpp 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <unistd.h>
  4. #include <sys/types.h>
  5. #include <sys/stat.h>
  6. #include <fcntl.h>
  7. #include <sys/ioctl.h>
  8. #include <sys/mman.h>
  9. #include <string.h>
  10. #include <iostream>
  11. using namespace std;
  12. #include "ARKMirrorRender.h"
  13. #if (ARK_COMPILE_MODE == COMPILE_USE_ARK_VIDEO_API)
  14. #include "ark_api.h"
  15. //#include "memalloc.h"
  16. //#define MEMALLOC_MODULE_PATH "/dev/memalloc"
  17. #define MAX_STREAM_BUFFER_SIZE (1024*1024)
  18. #define RAW_STRM_TYPE_H264 104
  19. ARKMirrorRender::ARKMirrorRender()
  20. {
  21. cur_direction = ECMirrorRender::VERTICAL;
  22. }
  23. ARKMirrorRender::~ARKMirrorRender()
  24. {
  25. }
  26. void ARKMirrorRender::initialize()
  27. {
  28. video_cfg cfg;
  29. printf("run mode==>USE_ARK_VIDEO_API.\n");
  30. //hide ui layer to display video image
  31. arkapi_display_force_hide_layer(PRIMARY_LAYER);
  32. arkapi_display_force_hide_layer(OVER_LAYER);
  33. handle_vid = arkapi_video_init(RAW_STRM_TYPE_H264);
  34. //arkapi_video_get_config(handle_vid, &cfg);
  35. cfg.disp_x = 0;
  36. cfg.disp_y = 0;
  37. cfg.disp_width = 1024;
  38. cfg.disp_height= 600;
  39. cfg.direction = ECMirrorRender::VERTICAL;
  40. arkapi_video_set_config(handle_vid, &cfg);
  41. arkapi_video_show(handle_vid, 1);
  42. }
  43. void ARKMirrorRender::play(const void *data, int len, MirrorDirection direction)
  44. {
  45. video_cfg cfg;
  46. if(cur_direction != direction){
  47. arkapi_video_get_config(handle_vid, &cfg);
  48. cfg.direction = direction;
  49. cur_direction = direction;
  50. arkapi_video_set_config(handle_vid, &cfg);
  51. }
  52. arkapi_video_play(handle_vid, data, len);
  53. }
  54. void ARKMirrorRender::show()
  55. {
  56. arkapi_video_show(handle_vid, 1);
  57. }
  58. void ARKMirrorRender::hide()
  59. {
  60. arkapi_video_show(handle_vid, 0);
  61. }
  62. void ARKMirrorRender::release()
  63. {
  64. arkapi_video_release(handle_vid);
  65. //show ui layer to display video image
  66. arkapi_display_force_show_layer(PRIMARY_LAYER);
  67. arkapi_display_force_show_layer(OVER_LAYER);
  68. }
  69. #elif (ARK_COMPILE_MODE == COMPILE_MFC_STORE_FILE_NO_ARK_API)
  70. #define MEMALLOC_MODULE_PATH "/tmp/dev/memalloc"
  71. #define MAX_STREAM_BUFFER_SIZE (1024*1024)
  72. #define RAW_STRM_TYPE_H264 104
  73. ARKMirrorRender::ARKMirrorRender()
  74. {
  75. initialized = false;
  76. fd_memalloc = -1;
  77. //fd_fb = -1;
  78. last_display_addr = 0;
  79. first_show = 1;
  80. dec_first_frame = 1;
  81. rotate_buffer_index = 0;
  82. cur_direction = ECMirrorRender::VERTICAL;
  83. in_buffer.virtualAddress = (u32*)MAP_FAILED;
  84. in_buffer.busAddress = 0;
  85. for (int i = 0; i < 3; i++) {
  86. rotate_buffer[i].virtualAddress = (u32*)MAP_FAILED;
  87. rotate_buffer[i].busAddress = 0;
  88. }
  89. }
  90. ARKMirrorRender::~ARKMirrorRender()
  91. {
  92. }
  93. void ARKMirrorRender::initialize()
  94. {
  95. if (initialized) return;
  96. printf("run mode==>MFC_STORE_FILE_NO_ARK_API.\n");
  97. //initalize buffer
  98. fd_memalloc = open(MEMALLOC_MODULE_PATH, O_RDWR | O_SYNC);
  99. if (fd_memalloc < 0) {
  100. printf("open memalloc device fail.\n");
  101. return;
  102. }
  103. if (alloc_buffer() < 0)
  104. return;
  105. handle_mfc = mfc_init(RAW_STRM_TYPE_H264);
  106. initialized = true;
  107. }
  108. void ARKMirrorRender::play(const void *data, int len, MirrorDirection direction)
  109. {
  110. int count = 3;
  111. unsigned int addr = 0;
  112. memcpy(in_buffer.virtualAddress, data, len);
  113. in_buffer.size = len;
  114. out_buffer.num = 0;
  115. mfc_decode(handle_mfc,&in_buffer, &out_buffer);
  116. if (dec_first_frame)
  117. dec_first_frame = 0;
  118. if (direction != cur_direction) {
  119. first_show = 1;
  120. cur_direction = direction;
  121. }
  122. for (int i = 0; i < out_buffer.num; i++) {
  123. mMirrorW = out_buffer.frameWidth;
  124. mMirrorH = out_buffer.frameHeight;
  125. //存储数据文件需要传入虚拟地址
  126. data_process((unsigned int)out_buffer.buffer[i].pyVirAddress, (unsigned int)rotate_buffer[rotate_buffer_index].virtualAddress, cur_direction);
  127. render(rotate_buffer[rotate_buffer_index].busAddress);
  128. rotate_buffer_index = (rotate_buffer_index + 1) % 3;
  129. }
  130. }
  131. void ARKMirrorRender::show()
  132. {
  133. return;
  134. }
  135. void ARKMirrorRender::hide()
  136. {
  137. return;
  138. }
  139. void ARKMirrorRender::release()
  140. {
  141. hide();
  142. free_buffer();
  143. if (fd_memalloc > 0) {
  144. close(fd_memalloc);
  145. fd_memalloc = -1;
  146. }
  147. mfc_uninit(handle_mfc);
  148. }
  149. int ARKMirrorRender::alloc_buffer(void)
  150. {
  151. u32 pgsize = getpagesize();
  152. MemallocParams params;
  153. DWLLinearMem_t *info = &in_buffer;
  154. int fd_mem;
  155. fd_mem = open("/dev/mem", O_RDWR | O_SYNC);
  156. if (fd_mem == -1) {
  157. printf("Failed to open: %s\n", "/dev/mem");
  158. return -1;
  159. }
  160. /* get memory linear memory buffers */
  161. params.size = info->size = MAX_STREAM_BUFFER_SIZE;
  162. ioctl(fd_memalloc, MEMALLOC_IOCXGETBUFFER, &params);
  163. if (params.busAddress == 0) {
  164. printf("Memalloc: get buffer failure\n");
  165. close(fd_mem);
  166. return -1;
  167. }
  168. info->busAddress = params.busAddress;
  169. /* Map the bus address to virtual address */
  170. info->virtualAddress = (u32 *) mmap(0, info->size, PROT_READ | PROT_WRITE,
  171. MAP_SHARED, fd_mem, params.busAddress);
  172. if (info->virtualAddress == MAP_FAILED) {
  173. close(fd_mem);
  174. return -1;
  175. }
  176. for (int i = 0; i < 3; i++) {
  177. info = &rotate_buffer[i];
  178. /* get memory linear memory buffers */
  179. params.size = info->size = mScreenW * mScreenH * 2;
  180. ioctl(fd_memalloc, MEMALLOC_IOCXGETBUFFER, &params);
  181. if (params.busAddress == 0) {
  182. printf("Memalloc: get buffer failure\n");
  183. close(fd_mem);
  184. return -1;
  185. }
  186. info->busAddress = params.busAddress;
  187. /* Map the bus address to virtual address */
  188. info->virtualAddress = (u32 *) mmap(0, info->size, PROT_READ | PROT_WRITE,
  189. MAP_SHARED, fd_mem, params.busAddress);
  190. if (info->virtualAddress == MAP_FAILED) {
  191. close(fd_mem);
  192. return -1;
  193. }
  194. }
  195. close(fd_mem);
  196. return 0;
  197. }
  198. void ARKMirrorRender::free_buffer(void)
  199. {
  200. if (in_buffer.busAddress)
  201. ioctl(fd_memalloc, MEMALLOC_IOCSFREEBUFFER, &in_buffer.busAddress);
  202. if (in_buffer.virtualAddress != MAP_FAILED)
  203. munmap(in_buffer.virtualAddress, MAX_STREAM_BUFFER_SIZE);
  204. for (int i = 0; i < 3; i++) {
  205. if (rotate_buffer[i].busAddress)
  206. ioctl(fd_memalloc, MEMALLOC_IOCSFREEBUFFER, &rotate_buffer[i].busAddress);
  207. if (rotate_buffer[i].virtualAddress != MAP_FAILED)
  208. munmap(rotate_buffer[i].virtualAddress, mScreenW * mScreenH * 2);
  209. }
  210. }
  211. void ARKMirrorRender::data_process(unsigned int src_addr, unsigned int dst_addr, MirrorDirection direction)
  212. {
  213. static int index = 0;
  214. char file_name[32];
  215. int fd, size, ret;
  216. size = (mMirrorW*mMirrorH*3)/2;
  217. if (++index % 50 == 0){
  218. snprintf(file_name, 20, "mfc_raw%d.yuv", index);
  219. printf("+++save data-->%s, mMirrorW=%d,mMirrorH=%d,size=%d.\n", file_name, mMirrorW, mMirrorH,size);
  220. fd = open(file_name, O_RDWR | O_CREAT | O_TRUNC);
  221. if (fd < 0) {
  222. printf("store raw,open %s fail.\n",file_name);
  223. return;
  224. }
  225. ret = write(fd, (void *)src_addr, size);
  226. printf("write ret=%d.\n",ret);
  227. close(fd);
  228. system("sync");
  229. printf("---save data.\n");
  230. }
  231. return;
  232. }
  233. void ARKMirrorRender::render(unsigned int addr)
  234. {
  235. return;
  236. }
  237. #else
  238. #define MEMALLOC_MODULE_PATH "/tmp/dev/memalloc"
  239. #define MAX_STREAM_BUFFER_SIZE (1024*1024)
  240. #define RAW_STRM_TYPE_H264 104
  241. extern int ark_test_mode;
  242. ARKMirrorRender::ARKMirrorRender()
  243. {
  244. initialized = false;
  245. fd_memalloc = -1;
  246. //fd_fb = -1;
  247. last_display_addr = 0;
  248. first_show = 1;
  249. dec_first_frame = 1;
  250. rotate_buffer_index = 0;
  251. cur_direction = ECMirrorRender::VERTICAL;
  252. in_buffer.virtualAddress = (u32*)MAP_FAILED;
  253. in_buffer.busAddress = 0;
  254. for (int i = 0; i < 3; i++) {
  255. rotate_buffer[i].virtualAddress = (u32*)MAP_FAILED;
  256. rotate_buffer[i].busAddress = 0;
  257. }
  258. }
  259. ARKMirrorRender::~ARKMirrorRender()
  260. {
  261. }
  262. void ARKMirrorRender::initialize()
  263. {
  264. enum ark_disp_layer layer = VIDEO_LAYER;
  265. if (initialized) return;
  266. //hide ui layer to display video image
  267. arkapi_display_force_hide_layer(PRIMARY_LAYER);
  268. arkapi_display_force_hide_layer(VIDEO_LAYER);
  269. arkapi_display_force_hide_layer(OVER_LAYER);
  270. printf("ark_test_mode=%d.\n", ark_test_mode);
  271. //initialize display
  272. if(ark_test_mode == USE_ARK_VIDEO_API){
  273. video_cfg cfg;
  274. printf("run mode==>USE_ARK_VIDEO_API.\n");
  275. handle_vid = arkapi_video_init(RAW_STRM_TYPE_H264);
  276. //arkapi_video_get_config(handle_vid, &cfg);
  277. cfg.disp_x = 0;
  278. cfg.disp_y = 0;
  279. cfg.disp_width = 1024;
  280. cfg.disp_height= 600;
  281. cfg.direction = ECMirrorRender::VERTICAL;
  282. arkapi_video_set_config(handle_vid, &cfg);
  283. arkapi_video_show(handle_vid, 1);
  284. return;
  285. }
  286. else if(ark_test_mode == ARKN141_MFC_DISPLAY_API){
  287. printf("run mode==>ARKN141_MFC_DISPLAY_API.\n");
  288. layer = PRIMARY_LAYER;
  289. }
  290. else if(ark_test_mode == ARK1668_MFC_DISPLAY_API){
  291. printf("run mode==>ARK1668_MFC_DISPLAY_API.\n");
  292. layer = AUX_LAYER;
  293. }
  294. else if(ark_test_mode == USE_ARK_DISPLAY_2D_API){
  295. ark2d_cfg cfg_2d;
  296. printf("run mode==>USE_ARK_DISPLAY_2D_API.\n");
  297. handle_2d = arkapi_2d_init();
  298. cfg_2d.win_src_x = 0;
  299. cfg_2d.win_src_y = 0;
  300. cfg_2d.src_width = cfg_2d.win_src_width = mMirrorW;
  301. cfg_2d.src_height= cfg_2d.win_src_height= mMirrorH;
  302. cfg_2d.win_dst_x = 0;
  303. cfg_2d.win_dst_y = 0;
  304. cfg_2d.dst_width = cfg_2d.win_dst_width = mScreenW;
  305. cfg_2d.dst_height= cfg_2d.win_dst_height= mScreenH;
  306. cfg_2d.src_format = ARK_gcvSURF_NV12;
  307. cfg_2d.dst_format = ARK_gcvSURF_R5G6B5;
  308. cfg_2d.direction = VERTICAL;
  309. arkapi_2d_set_config(handle_2d, &cfg_2d);
  310. layer = VIDEO_LAYER;
  311. }
  312. else if(ark_test_mode == USE_ARK_RAW2D_DISPLAY_API){
  313. //initialize 2D
  314. /* Construct the gcoOS object. */
  315. gceSTATUS status;
  316. status = gcoOS_Construct(gcvNULL, &g_os);
  317. if (status < 0)
  318. {
  319. printf("*ERROR* Failed to construct OS object (status = %d)\n", status);
  320. return;
  321. }
  322. /* Construct the gcoHAL object. */
  323. status = gcoHAL_Construct(gcvNULL, g_os, &g_hal);
  324. if (status < 0)
  325. {
  326. printf("*ERROR* Failed to construct GAL object (status = %d)\n", status);
  327. return;
  328. }
  329. status = gcoHAL_Get2DEngine(g_hal, &g_engine2d);
  330. if (status < 0)
  331. {
  332. printf("*ERROR* Failed to get 2D engine object (status = %d)\n", status);
  333. return;
  334. }
  335. printf("run mode==>USE_ARK_RAW2D_DISPLAY_API.\n");
  336. layer = VIDEO_LAYER;
  337. }
  338. else{
  339. printf("run mode==>error, exit.\n");
  340. return;
  341. }
  342. //initialize display
  343. handle_display= arkapi_display_open_layer(layer);
  344. if (!handle_display) {
  345. printf("open fb fail.\n");
  346. return;
  347. }
  348. //initalize buffer
  349. handle_mem = arkapi_memalloc_init();
  350. if (!handle_mem) {
  351. return;
  352. }
  353. if (alloc_buffer() < 0)
  354. return;
  355. handle_mfc = mfc_init(RAW_STRM_TYPE_H264);
  356. initialized = true;
  357. }
  358. void ARKMirrorRender::play(const void *data, int len, MirrorDirection direction)
  359. {
  360. int count = 3;
  361. unsigned int addr = 0;
  362. if(ark_test_mode == USE_ARK_VIDEO_API){
  363. video_cfg cfg;
  364. if(cur_direction != direction){
  365. arkapi_video_get_config(handle_vid, &cfg);
  366. cfg.direction = direction;
  367. cur_direction = direction;
  368. arkapi_video_set_config(handle_vid, &cfg);
  369. }
  370. arkapi_video_play(handle_vid, data, len);
  371. return;
  372. }
  373. else if(ark_test_mode == ARKN141_MFC_DISPLAY_API){
  374. memcpy(in_buffer.virtualAddress, data, len);
  375. //usleep(25000);
  376. }else{
  377. memcpy(in_buffer.virtualAddress, data, len);
  378. arkapi_display_get_layer_addr(handle_display, &addr, NULL, NULL);
  379. while (last_display_addr && addr == rotate_buffer[rotate_buffer_index].busAddress && count--) {
  380. arkapi_display_wait_for_vsync(handle_display);
  381. arkapi_display_get_layer_addr(handle_display, &addr, NULL, NULL);
  382. }
  383. }
  384. in_buffer.size = len;
  385. out_buffer.num = 0;
  386. mfc_decode(handle_mfc,&in_buffer, &out_buffer);
  387. if (dec_first_frame)
  388. dec_first_frame = 0;
  389. if (direction != cur_direction) {
  390. first_show = 1;
  391. cur_direction = direction;
  392. }
  393. for (int i = 0; i < out_buffer.num; i++) {
  394. if(ark_test_mode == USE_ARK_RAW2D_DISPLAY_API){
  395. data_process(out_buffer.buffer[i].yBusAddress, rotate_buffer[rotate_buffer_index].busAddress, cur_direction);
  396. render(rotate_buffer[rotate_buffer_index].busAddress);
  397. }
  398. else if(ark_test_mode == USE_ARK_DISPLAY_2D_API){
  399. ark2d_cfg cfg_2d;
  400. arkapi_2d_get_config(handle_2d, &cfg_2d);
  401. cfg_2d.src_width = cfg_2d.win_src_width = out_buffer.frameWidth;
  402. cfg_2d.src_height= cfg_2d.win_src_height= out_buffer.frameHeight;
  403. cfg_2d.direction = cur_direction;
  404. arkapi_2d_set_config(handle_2d, &cfg_2d);
  405. arkapi_2d_process(handle_2d, out_buffer.buffer[i].yBusAddress, rotate_buffer[rotate_buffer_index].busAddress);
  406. out_width = handle_2d->out_width;
  407. out_height= handle_2d->out_height;
  408. render(rotate_buffer[rotate_buffer_index].busAddress);
  409. }
  410. else{
  411. out_width = out_buffer.frameWidth;
  412. out_height = out_buffer.frameHeight;
  413. render(out_buffer.buffer[i].yBusAddress);
  414. }
  415. rotate_buffer_index = (rotate_buffer_index + 1) % 3;
  416. }
  417. }
  418. void ARKMirrorRender::show()
  419. {
  420. if(ark_test_mode == USE_ARK_VIDEO_API){
  421. arkapi_video_show(handle_vid, 1);
  422. }else{
  423. arkapi_display_show_layer(handle_display);
  424. }
  425. }
  426. void ARKMirrorRender::hide()
  427. {
  428. if(ark_test_mode == USE_ARK_VIDEO_API){
  429. arkapi_video_show(handle_vid, 0);
  430. }else{
  431. arkapi_display_hide_layer(handle_display);
  432. }
  433. }
  434. void ARKMirrorRender::release()
  435. {
  436. if(ark_test_mode == USE_ARK_VIDEO_API){
  437. arkapi_video_release(handle_vid);
  438. //show ui layer to display video image
  439. arkapi_display_force_show_layer(PRIMARY_LAYER);
  440. arkapi_display_force_show_layer(OVER_LAYER);
  441. return;
  442. }
  443. else if(ark_test_mode == USE_ARK_RAW2D_DISPLAY_API){
  444. if (g_hal != gcvNULL) {
  445. gcoHAL_Commit(g_hal, gcvTRUE);
  446. gcoHAL_Destroy(g_hal);
  447. }
  448. if (g_os != gcvNULL) {
  449. gcoOS_Destroy(g_os);
  450. }
  451. }else if(ark_test_mode == USE_ARK_DISPLAY_2D_API){
  452. arkapi_2d_release(handle_2d);
  453. }
  454. hide();
  455. free_buffer();
  456. arkapi_display_close_layer(handle_display);
  457. mfc_uninit(handle_mfc);
  458. //show ui layer to display video image
  459. arkapi_display_force_show_layer(PRIMARY_LAYER);
  460. arkapi_display_force_show_layer(VIDEO_LAYER);
  461. arkapi_display_force_show_layer(OVER_LAYER);
  462. }
  463. int ARKMirrorRender::alloc_buffer(void)
  464. {
  465. reqbuf_info reqbuf;
  466. int ret, i;
  467. if(!handle_mem){
  468. printf("%s: handle null, error.\n", __func__);
  469. return -EINVAL;
  470. }
  471. reqbuf.size = MAX_STREAM_BUFFER_SIZE;
  472. reqbuf.count = 1;
  473. ret = arkapi_memalloc_reqbuf(handle_mem, &reqbuf);
  474. if (ret < 0) {
  475. printf("memalloc: get buffer failure 1.\n");
  476. return -1;
  477. }
  478. in_buffer.size = reqbuf.size;
  479. in_buffer.busAddress = reqbuf.phy_addr[0];
  480. in_buffer.virtualAddress = (unsigned int *)reqbuf.virt_addr[0];
  481. reqbuf.count = ROTATE_BUF_MAX;
  482. reqbuf.size = mScreenW * mScreenH * 2;
  483. ret = arkapi_memalloc_reqbuf(handle_mem, &reqbuf);
  484. if (ret < 0) {
  485. printf("memalloc: get buffer failure.\n");
  486. return -1;
  487. }
  488. for(i = 0; i < reqbuf.count; i++){
  489. rotate_buffer[i].size = reqbuf.size;
  490. rotate_buffer[i].busAddress = reqbuf.phy_addr[i];
  491. rotate_buffer[i].virtualAddress = (unsigned int *)reqbuf.virt_addr[i];
  492. }
  493. printf("%s: <---success.\n", __func__);
  494. return 0;
  495. }
  496. void ARKMirrorRender::free_buffer(void)
  497. {
  498. if (handle_mem)
  499. arkapi_memalloc_release(handle_mem);
  500. }
  501. void ARKMirrorRender::data_process(unsigned int src_addr, unsigned int dst_addr, MirrorDirection direction)
  502. {
  503. gceSTATUS status;
  504. gctUINT8 horKernel = 5, verKernel = 7;
  505. int srcWidth, srcHeight, dstWidth, dstHeight;
  506. gcoSURF srcSurf, dstSurf;
  507. gctUINT32 srcAddress[3] = {0, 0, 0};
  508. gctUINT32 dstAddress[3] = {0, 0, 0};
  509. gctUINT32 srcStride[3] = {0, 0, 0};
  510. gctUINT32 dstStride[3] = {0, 0, 0};
  511. gcsRECT srcRect, dstRect;
  512. gceSURF_FORMAT srcFormat = gcvSURF_NV12, dstFormat = gcvSURF_R5G6B5;//gcvSURF_A8R8G8B8;
  513. gceSURF_ROTATION rotation = gcvSURF_0_DEGREE;
  514. int width = mMirrorW, height = mMirrorH;
  515. srcWidth = (mMirrorW + 15) & ~15;
  516. srcHeight = (mMirrorH + 15) & ~15;
  517. if (direction == LANDSCAPE) {
  518. rotation = gcvSURF_270_DEGREE;
  519. width = mMirrorH;
  520. height = mMirrorW;
  521. }
  522. float hcoff, vcoff;
  523. hcoff = (float) width / mScreenW;
  524. vcoff = (float) height / mScreenH;
  525. if (hcoff > vcoff) {
  526. out_width = mScreenW;
  527. out_height = (height * mScreenW / width) & ~1;
  528. } else {
  529. out_height = mScreenH;
  530. out_width = (width * mScreenH / height) & ~1;
  531. }
  532. dstWidth = out_width;
  533. dstHeight = out_height;
  534. if (dstFormat == gcvSURF_A8R8G8B8 || dstFormat == gcvSURF_A8B8G8R8)
  535. dstStride[0] = dstWidth * 4;
  536. else if (dstFormat == gcvSURF_B5G6R5 || dstFormat == gcvSURF_R5G6B5)
  537. dstStride[0] = dstWidth * 2;
  538. srcAddress[0] = src_addr;
  539. dstAddress[0] = dst_addr;
  540. //not support gcvSURF_VYUY scaler
  541. if (srcFormat == gcvSURF_UYVY) {
  542. srcAddress[2] = srcAddress[1] = 0xFFFFFFFF;
  543. srcStride[2] = srcStride[1] = srcStride[0] = srcWidth * 2;
  544. } else if (srcFormat == gcvSURF_NV21 || srcFormat == gcvSURF_NV12) {
  545. srcAddress[2] = 0xFFFFFFFF;
  546. srcAddress[1] = srcAddress[0] + srcWidth*srcHeight;
  547. srcStride[2] = srcStride[1] = srcStride[0] = srcWidth;
  548. }
  549. srcRect.left = 0;
  550. srcRect.top = 0;
  551. srcRect.right = mMirrorW;
  552. srcRect.bottom = mMirrorH;
  553. dstRect.left = 0;
  554. dstRect.top = 0;
  555. if (rotation == gcvSURF_90_DEGREE || rotation == gcvSURF_270_DEGREE) {
  556. dstRect.right = dstHeight;
  557. dstRect.bottom = dstWidth;
  558. } else {
  559. dstRect.right = dstWidth;
  560. dstRect.bottom = dstHeight;
  561. }
  562. // set clippint rect
  563. gcmONERROR(gco2D_SetClipping(g_engine2d, &srcRect));
  564. // set kernel size
  565. gcmONERROR(gco2D_EnableUserFilterPasses(g_engine2d, gcvTRUE, gcvTRUE));
  566. gcmONERROR(gco2D_SetKernelSize(g_engine2d, horKernel, verKernel));
  567. gcmONERROR(gco2D_FilterBlitEx2(g_engine2d,
  568. srcAddress, 2,
  569. srcStride, 2,
  570. gcvLINEAR, srcFormat,
  571. gcvSURF_0_DEGREE, srcWidth,
  572. srcHeight, &srcRect,
  573. dstAddress, 1,
  574. dstStride, 1,
  575. gcvLINEAR, dstFormat,
  576. rotation, dstWidth,
  577. dstHeight,
  578. &dstRect, gcvNULL));
  579. gcmONERROR(gco2D_Flush(g_engine2d));
  580. gcmONERROR(gcoHAL_Commit(g_hal, gcvTRUE));
  581. return;
  582. OnError:
  583. printf("2d func failure.\n");
  584. return;
  585. }
  586. void ARKMirrorRender::render(unsigned int addr)
  587. {
  588. int offx, offy, width, height, format, ycbaddr, ycraddr;
  589. if(ark_test_mode == USE_ARK_RAW2D_DISPLAY_API || ark_test_mode == USE_ARK_DISPLAY_2D_API){
  590. offx = (mScreenW - out_width) / 2;
  591. offy = (mScreenH - out_height) / 2;
  592. width = out_width;
  593. height = out_height;
  594. format = ARK_LCDC_FORMAT_R5G6B5;
  595. ycbaddr= 0;
  596. ycraddr= 0;
  597. }else{
  598. width = out_width;
  599. if(mScreenH < out_height)
  600. height = mScreenH;
  601. else
  602. height = out_height;
  603. offx = (mScreenW - width) / 2;
  604. offy = (mScreenH - height) / 2;
  605. format = ARK_LCDC_FORMAT_Y_UV420;
  606. ycbaddr= addr + out_width*out_height;
  607. ycraddr= 0;
  608. }
  609. if (first_show) {
  610. arkapi_display_set_layer_pos_atomic(handle_display, offx, offy);
  611. arkapi_display_set_layer_size_atomic(handle_display, width, height);
  612. arkapi_display_set_layer_format_atomic(handle_display, format);
  613. arkapi_display_set_layer_addr_atomic(handle_display, addr, ycbaddr, ycraddr);
  614. arkapi_display_layer_update_commit(handle_display);
  615. last_display_addr = addr;
  616. usleep(20000);
  617. arkapi_display_show_layer(handle_display);
  618. first_show = 0;
  619. } else {
  620. arkapi_display_set_layer_addr(handle_display, addr, ycbaddr, ycraddr);
  621. last_display_addr = addr;
  622. }
  623. }
  624. #endif