jpeg_ps_test.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <fcntl.h>
  6. #include <sys/mman.h>
  7. #include <unistd.h>
  8. #include <sys/ioctl.h>
  9. #include <string.h>
  10. #include "ark_jpeg_io.h"
  11. #include "memalloc.h"
  12. #include "ftcfg.h"
  13. #include "ftypes.h"
  14. #include "utils.h"
  15. #include "ark1668ft.h"
  16. #define JPEG_DEVICE_PATH "/dev/ark_jpeg"
  17. static struct cma_mem *inbuf = NULL, *outbuf = NULL;
  18. int JPEGSetFileSize(int fdjpeg, int file_size)
  19. {
  20. if (fdjpeg < 0)
  21. return -1;
  22. if (ioctl(fdjpeg, ARKJPEG_SET_JPG_SIZE, &file_size) < 0) {
  23. printf("ARKJPEG_SET_JPG_SIZE fail.\n");
  24. return -1;
  25. }
  26. return 0;
  27. }
  28. JPEG_DEC_RESULT JPEGDecodeExe(int fdjpeg, unsigned char *filename)
  29. {
  30. int fd = -1;
  31. JPEG_DEC_RESULT ret = DEC_SUCCESS;
  32. int count = 0;
  33. fd = open(filename, O_RDWR);
  34. if(fd < 0)
  35. {
  36. printf("open jpeg file %s fail.\n", filename);
  37. return DEC_ERROR;
  38. }
  39. unsigned int filesize = get_file_size(filename);
  40. JPEGSetFileSize(fdjpeg, filesize);
  41. if (ioctl(fdjpeg, ARKJPEG_DECODE, NULL) < 0) {
  42. printf("ARKJPEG_DECODE fail.\n");
  43. return DEC_ERROR;
  44. }
  45. while(1)
  46. {
  47. JPEG_API_INFO apiInfo;
  48. JPEG_API_RETINFO apiRetInfo;
  49. if (ioctl(fdjpeg, ARKJPEG_GET_APIEVENT, &apiInfo) < 0) {
  50. printf("Wait jpeg api event timeout.\n");
  51. if(++count == 3)
  52. {
  53. ret = DEC_ERROR;
  54. goto end;
  55. }
  56. } else {
  57. printf("EventType=%d.\n", apiInfo.EventType);
  58. switch(apiInfo.EventType) {
  59. case FREAD:
  60. apiRetInfo.dwReadedLen = read(fd, inbuf->viraddr, apiInfo.dwReadLen);
  61. if (ioctl(fdjpeg, ARKJPEG_SET_APIDONEEVENT, &apiRetInfo) < 0) {
  62. printf("ARKJPEG_SET_APIEVENT fail.\n");
  63. ret = DEC_ERROR;
  64. goto end;
  65. }
  66. break;
  67. case FSEEK:
  68. apiRetInfo.nSeekRet = lseek(fd, apiInfo.lOffset, apiInfo.nOrigin);
  69. if (ioctl(fdjpeg, ARKJPEG_SET_APIDONEEVENT, &apiRetInfo) < 0) {
  70. printf("ARKJPEG_SET_APIEVENT fail.\n");
  71. ret = DEC_ERROR;
  72. goto end;
  73. }
  74. break;
  75. case DEC_OVER:
  76. ret = apiInfo.DecResult;
  77. goto end;
  78. }
  79. }
  80. }
  81. end:
  82. close(fd);
  83. return ret;
  84. }
  85. int JPEGGetDecodeInfo(int fdjpeg, u32 *srcWidth, u32 *SrcHeight,
  86. u32 *destWidth, u32 *destHeight, u32 *dataSize)
  87. {
  88. if (fdjpeg < 0)
  89. return -1;
  90. JPEG_DECODE_INFO info;
  91. if (ioctl(fdjpeg, ARKJPEG_GET_DECODEINFO, &info) < 0) {
  92. printf("ARKJPEG_GET_DECODEINFO fail.\n");
  93. return -1;
  94. }
  95. *srcWidth = info.dwSrcWidth;
  96. *SrcHeight = info.dwSrcHeight;
  97. *destWidth = info.dwOutWidth;
  98. *destHeight = info.dwOutHeight;
  99. *dataSize = info.dwDecSize;
  100. return 0;
  101. }
  102. void *jpg_ps_test_thread(void *arg)
  103. {
  104. struct ft_runtime *rt = (struct ft_runtime *)arg;
  105. int fdjpeg = -1;
  106. unsigned int srcwidth, srcheight, outwidth, outheight, outsize;
  107. int fddata = -1;
  108. int datasize = 0;
  109. unsigned int *databuf = NULL;
  110. unsigned int *tmp;
  111. int i;
  112. inbuf = alloc_cma_mem(0x200000);
  113. if (!inbuf) {
  114. printf("alloc cma memory fail.\n");
  115. goto err;
  116. }
  117. outbuf = alloc_cma_mem(0x100000);
  118. if (!outbuf) {
  119. printf("alloc cma memory fail.\n");
  120. goto err;
  121. }
  122. fdjpeg = open(JPEG_DEVICE_PATH, O_RDWR | O_SYNC);
  123. if (fdjpeg == -1) {
  124. printf("open jpeg device file fail.\n");
  125. goto err;
  126. }
  127. JPEG_DECODE_OPT opt = {0};
  128. opt.ScalerMode = NOMAL_SCALER;
  129. opt.ZoomMode = ZOOM_IN_OUT;
  130. opt.RotateAngle = CLOCKWISE_0;
  131. opt.dwDestWidth = JPG_OUT_WIDTH;
  132. opt.dwDestHeight = JPG_OUT_HEIGHT;
  133. if (ioctl(fdjpeg, ARKJPEG_SET_DECODE_OPT, &opt) < 0) {
  134. printf("ARKJPEG_SET_DECODE_OPT fail.\n");
  135. goto err;
  136. }
  137. struct jpeg_buffer buffer;
  138. buffer.file_size = 0x200000;
  139. buffer.file_base_phys = inbuf->phyaddr;
  140. buffer.file_user_base_virt = inbuf->viraddr;
  141. buffer.decode_size = 0x100000;
  142. buffer.decode_base_phys = outbuf->phyaddr;
  143. buffer.decode_user_base_virt = outbuf->viraddr;
  144. if (ioctl(fdjpeg, ARKJPEG_SET_BUFFER, &buffer) < 0) {
  145. printf("ARKJPEG_SET_BUFFER fail.\n");
  146. goto err;
  147. }
  148. if (JPEGDecodeExe(fdjpeg, JPG_FILE_PATH) == DEC_SUCCESS) {
  149. JPEGGetDecodeInfo(fdjpeg, &srcwidth, &srcheight, &outwidth, &outheight, &outsize);
  150. printf("srcwidth=%d, srcheight=%d, outwidth=%d, outheight=%d, outsize=%d.\n",
  151. srcwidth, srcheight, outwidth, outheight, outsize);
  152. } else {
  153. printf("jpeg decode error.\n");
  154. goto err;
  155. }
  156. fddata = open(JPG_YUVDATA_PATH, O_RDONLY);
  157. if (fddata < 0) {
  158. printf("open data file fail.\n");
  159. goto err;
  160. }
  161. datasize = get_file_size(JPG_YUVDATA_PATH);
  162. databuf = malloc(datasize);
  163. if (!databuf) {
  164. printf("mallco databuf fail.\n");
  165. goto err;
  166. }
  167. if (read(fddata, databuf, datasize) != datasize) {
  168. printf("read data file err.\n");
  169. goto err;
  170. }
  171. tmp = (unsigned int*)outbuf->viraddr;
  172. for (i = 0; i < datasize / 4; i++) {
  173. if (databuf[i] != tmp[i]) {
  174. printf("compare data fail.0x%x, 0x%x.\n", databuf[i], tmp[i]);
  175. goto err;
  176. }
  177. }
  178. free(databuf);
  179. free_cma_mem(inbuf);
  180. free_cma_mem(outbuf);
  181. close(fdjpeg);
  182. close(fddata);
  183. rt->finish = 1;
  184. rt->pass = 1;
  185. return (void*)0;
  186. err:
  187. if (databuf)
  188. free(databuf);
  189. if (inbuf)
  190. free_cma_mem(inbuf);
  191. if (outbuf)
  192. free_cma_mem(outbuf);
  193. if (fdjpeg > 0)
  194. close(fdjpeg);
  195. if (fddata > 0)
  196. close(fddata);
  197. rt->finish = 1;
  198. return (void*)-1;
  199. }