sonix_io.c 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776
  1. #include "sonix_xu_ctrls.h"
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <fcntl.h>
  5. #include <unistd.h>
  6. #include <stdint.h>
  7. #include <stdlib.h>
  8. #include <errno.h>
  9. #include <getopt.h>
  10. #include <sys/ioctl.h>
  11. #include <sys/mman.h>
  12. #include <sys/select.h>
  13. #include <sys/time.h> //for timestamp incomplete error in kernel 2.6.21
  14. #include <linux/videodev2.h>
  15. #include <linux/version.h>
  16. #include <sys/utsname.h>
  17. #include <pthread.h>
  18. //#include "v4l2uvc.h"
  19. #include "sonix_xu_ctrls.h"
  20. #include "nalu.h"
  21. #include "debug.h"
  22. //#include "cap_desc_parser.h"
  23. //#include "cap_desc.h"
  24. #define V4L_BUFFERS_DEFAULT 6//16
  25. #define V4L_BUFFERS_MAX 16//32
  26. #define H264_SIZE_HD ((1280<<16)|720)
  27. #define H264_SIZE_VGA ((640<<16)|480)
  28. #define H264_SIZE_QVGA ((320<<16)|240)
  29. #define H264_SIZE_QQVGA ((160<<16)|112)
  30. #define H264_SIZE_360P ((640<<16)|360)
  31. #define H264_SIZE_180P ((320<<16)|180)
  32. #define MULTI_STREAM_HD_QVGA 0x01
  33. #define MULTI_STREAM_HD_180P 0x02
  34. #define MULTI_STREAM_HD_360P 0x04
  35. #define MULTI_STREAM_HD_VGA 0x08
  36. #define MULTI_STREAM_HD_QVGA_VGA 0x10
  37. #define MULTI_STREAM_QVGA_VGA 0x20
  38. #define MULTI_STREAM_HD_180P_360P 0x40
  39. #define MULTI_STREAM_360P_180P 0x80
  40. struct H264Format *gH264fmt = NULL;
  41. int Dbg_Param = 0x1f;
  42. int video_get_framerate(int dev, int *framerate)
  43. {
  44. struct v4l2_streamparm parm;
  45. int ret;
  46. memset(&parm, 0, sizeof parm);
  47. parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  48. ret = ioctl(dev, VIDIOC_G_PARM, &parm);
  49. if (ret < 0) {
  50. TestAp_Printf(TESTAP_DBG_ERR, "Unable to get frame rate: %d.\n", errno);
  51. return ret;
  52. }
  53. TestAp_Printf(TESTAP_DBG_FLOW, "Current frame rate: %u/%u\n",
  54. parm.parm.capture.timeperframe.numerator,
  55. parm.parm.capture.timeperframe.denominator);
  56. *framerate = parm.parm.capture.timeperframe.denominator;
  57. return 0;
  58. }
  59. static int video_open(const char *devname)
  60. {
  61. struct v4l2_capability cap;
  62. int dev, ret;
  63. dev = open(devname, O_RDWR);
  64. if (dev < 0) {
  65. TestAp_Printf(TESTAP_DBG_ERR, "Error opening device %s: %d.\n", devname, errno);
  66. return dev;
  67. }
  68. memset(&cap, 0, sizeof cap);
  69. ret = ioctl(dev, VIDIOC_QUERYCAP, &cap);
  70. if (ret < 0) {
  71. TestAp_Printf(TESTAP_DBG_ERR, "Error opening device %s: unable to query device.\n",
  72. devname);
  73. close(dev);
  74. return ret;
  75. }
  76. #if 0
  77. if ((cap.capabilities & V4L2_CAP_VIDEO_CAPTURE) == 0) {
  78. TestAp_Printf(TESTAP_DBG_ERR, "Error opening device %s: video capture not supported.\n",
  79. devname);
  80. close(dev);
  81. return -EINVAL;
  82. }
  83. #endif
  84. printf( "Device %s opened: %s.\n", devname, cap.card);
  85. return dev;
  86. }
  87. static int get_vendor_verson(int dev, unsigned char szFlashVendorVer[12])
  88. {
  89. return XU_SF_Read(dev, 0x154, szFlashVendorVer, 12);
  90. }
  91. static int video_set_format(int dev, unsigned int w, unsigned int h, unsigned int format)
  92. {
  93. struct v4l2_format fmt;
  94. int ret;
  95. memset(&fmt, 0, sizeof fmt);
  96. fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  97. fmt.fmt.pix.width = w;
  98. fmt.fmt.pix.height = h;
  99. fmt.fmt.pix.pixelformat = format;
  100. fmt.fmt.pix.field = V4L2_FIELD_ANY;
  101. ret = ioctl(dev, VIDIOC_S_FMT, &fmt);
  102. if (ret < 0) {
  103. TestAp_Printf(TESTAP_DBG_ERR, "Unable to set format: %d.\n", errno);
  104. return ret;
  105. }
  106. TestAp_Printf(TESTAP_DBG_FLOW, "Video format set: width: %u height: %u buffer size: %u\n",
  107. fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.sizeimage);
  108. return 0;
  109. }
  110. static int video_set_still_format(int dev, unsigned int w, unsigned int h, unsigned int format)
  111. {
  112. struct v4l2_format fmt;
  113. int ret;
  114. memset(&fmt, 0, sizeof fmt);
  115. fmt.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  116. fmt.fmt.pix.width = w;
  117. fmt.fmt.pix.height = h;
  118. fmt.fmt.pix.pixelformat = format;
  119. fmt.fmt.pix.field = V4L2_FIELD_ANY;
  120. if(GetKernelVersion()> KERNEL_VERSION (3, 0, 36))
  121. ret = ioctl(dev, UVCIOC_STILL_S_FMT_KNL3, &fmt);
  122. else
  123. ret = ioctl(dev, UVCIOC_STILL_S_FMT_KNL2, &fmt);
  124. if (ret < 0) {
  125. TestAp_Printf(TESTAP_DBG_ERR, "Unable to set still format: %d.\n", errno);
  126. if(errno == EINVAL)
  127. TestAp_Printf(TESTAP_DBG_ERR, "still function doesn't support?\n", errno);
  128. return ret;
  129. }
  130. TestAp_Printf(TESTAP_DBG_FLOW, "still format set: width: %u height: %u buffer size: %u\n",
  131. fmt.fmt.pix.width, fmt.fmt.pix.height, fmt.fmt.pix.sizeimage);
  132. return 0;
  133. }
  134. static int video_set_framerate(int dev, int framerate, unsigned int *MaxPayloadTransferSize)
  135. {
  136. struct v4l2_streamparm parm;
  137. int ret;
  138. memset(&parm, 0, sizeof parm);
  139. parm.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  140. ret = ioctl(dev, VIDIOC_G_PARM, &parm);
  141. if (ret < 0) {
  142. TestAp_Printf(TESTAP_DBG_ERR, "Unable to get frame rate: %d.\n", errno);
  143. return ret;
  144. }
  145. TestAp_Printf(TESTAP_DBG_FLOW, "Current frame rate: %u/%u\n",
  146. parm.parm.capture.timeperframe.numerator,
  147. parm.parm.capture.timeperframe.denominator);
  148. parm.parm.capture.timeperframe.numerator = 1;
  149. parm.parm.capture.timeperframe.denominator = framerate;
  150. ret = ioctl(dev, VIDIOC_S_PARM, &parm);
  151. if (ret < 0) {
  152. TestAp_Printf(TESTAP_DBG_ERR, "Unable to set frame rate: %d.\n", errno);
  153. return ret;
  154. }
  155. //yiling: get MaxPayloadTransferSize from sonix driver
  156. if(MaxPayloadTransferSize)
  157. *MaxPayloadTransferSize = parm.parm.capture.reserved[0];
  158. ret = ioctl(dev, VIDIOC_G_PARM, &parm);
  159. if (ret < 0) {
  160. TestAp_Printf(TESTAP_DBG_ERR, "Unable to get frame rate: %d.\n", errno);
  161. return ret;
  162. }
  163. TestAp_Printf(TESTAP_DBG_FLOW, "Frame rate set: %u/%u\n",
  164. parm.parm.capture.timeperframe.numerator,
  165. parm.parm.capture.timeperframe.denominator);
  166. return 0;
  167. }
  168. static int video_req_still_buf(int dev)
  169. {
  170. struct v4l2_requestbuffers rb;
  171. int ret;
  172. memset(&rb, 0, sizeof rb);
  173. rb.count = 1;
  174. rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  175. rb.memory = V4L2_MEMORY_MMAP;
  176. if(GetKernelVersion()> KERNEL_VERSION (3, 0, 36))
  177. ret = ioctl(dev, UVCIOC_STILL_REQBUF_KNL3, &rb);
  178. else
  179. ret = ioctl(dev, UVCIOC_STILL_REQBUF_KNL2, &rb);
  180. if (ret < 0) {
  181. TestAp_Printf(TESTAP_DBG_ERR, "Unable to allocate still buffers: %d.\n", errno);
  182. return ret;
  183. }
  184. TestAp_Printf(TESTAP_DBG_FLOW, "still buffers allocated.\n");
  185. return rb.count;
  186. }
  187. static int video_enable(int dev, int enable)
  188. {
  189. int type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  190. int ret;
  191. ret = ioctl(dev, enable ? VIDIOC_STREAMON : VIDIOC_STREAMOFF, &type);
  192. if (ret < 0) {
  193. TestAp_Printf(TESTAP_DBG_ERR, "Unable to %s capture: %d.\n",
  194. enable ? "start" : "stop", errno);
  195. return ret;
  196. }
  197. return 0;
  198. }
  199. int get_still_image(int dev, unsigned int w, unsigned int h, unsigned int format)
  200. {
  201. char filename[30];
  202. struct v4l2_buffer buf;
  203. FILE *file = NULL;
  204. int ret = 0, repeat_setting = 0;
  205. void *mem;
  206. static int counter = 0;
  207. static int still_dev = 0, still_width = 0, still_height = 0, still_format = 0;
  208. TestAp_Printf(TESTAP_DBG_FLOW, "%s ============>\n",__FUNCTION__);
  209. if(still_dev == dev && still_width == w && still_height == h && still_format == format)
  210. repeat_setting = 1;
  211. //set file name
  212. if(format == V4L2_PIX_FMT_MJPEG)
  213. sprintf(filename, "still_img-%02u.jpg", counter);
  214. else if(format == V4L2_PIX_FMT_YUYV)
  215. sprintf(filename, "still_img-%02u.yuyv", counter);
  216. TestAp_Printf(TESTAP_DBG_FLOW, "repeat_setting = %d, fname = %s\n",repeat_setting, filename);
  217. if(!repeat_setting)
  218. {
  219. //set format
  220. video_set_still_format(dev, w, h, format);
  221. //request still buffer
  222. ret = video_req_still_buf(dev);
  223. if (ret < 0) {
  224. TestAp_Printf(TESTAP_DBG_ERR, "Unable to request still buffer(%d).\n", errno);
  225. return ret;
  226. }
  227. }
  228. //mmap
  229. memset(&buf, 0, sizeof buf);
  230. buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  231. buf.memory = V4L2_MEMORY_MMAP;
  232. if(GetKernelVersion()> KERNEL_VERSION (3, 0, 36))
  233. ret = ioctl(dev, UVCIOC_STILL_QUERYBUF_KNL3, &buf);
  234. else
  235. ret = ioctl(dev, UVCIOC_STILL_QUERYBUF_KNL2, &buf);
  236. if (ret < 0) {
  237. TestAp_Printf(TESTAP_DBG_ERR, "Unable to query still buffer(%d).\n", errno);
  238. return ret;
  239. }
  240. TestAp_Printf(TESTAP_DBG_FLOW, "length: %u offset: %10u -- ", buf.length, buf.m.offset);
  241. mem = mmap(0, buf.length, PROT_READ, MAP_SHARED, dev, buf.m.offset);
  242. if (mem == MAP_FAILED) {
  243. TestAp_Printf(TESTAP_DBG_ERR, "Unable to map still buffer(%d)\n", errno);
  244. return -1;
  245. }
  246. TestAp_Printf(TESTAP_DBG_FLOW, "still Buffer mapped at address %p.\n", mem);
  247. //get data
  248. if(GetKernelVersion()> KERNEL_VERSION (3, 0, 36))
  249. ret = ioctl(dev, UVCIOC_STILL_GET_FRAME_KNL3, &buf);
  250. else
  251. ret = ioctl(dev, UVCIOC_STILL_GET_FRAME_KNL2, &buf);
  252. if (ret < 0) {
  253. TestAp_Printf(TESTAP_DBG_ERR, "Unable to get still image(%d).\n", errno);
  254. return ret;
  255. }
  256. TestAp_Printf(TESTAP_DBG_FLOW, "buf.bytesused = %d\n", buf.bytesused);
  257. file = fopen(filename, "wb");
  258. if (file != NULL)
  259. fwrite(mem, buf.bytesused, 1, file);
  260. fclose(file);
  261. munmap(mem, buf.length);
  262. counter ++;
  263. TestAp_Printf(TESTAP_DBG_FLOW, "%s <============\n",__FUNCTION__);
  264. still_dev = dev;
  265. still_width = w;
  266. still_height = h;
  267. still_format = format;
  268. return 0;
  269. }
  270. static int GetFreeRam(int* freeram)
  271. {
  272. FILE *meminfo = fopen("/proc/meminfo", "r");
  273. char line[256];
  274. if(meminfo == NULL)
  275. {
  276. TestAp_Printf(TESTAP_DBG_ERR, "/proc/meminfo can't open\n");
  277. return 0;
  278. }
  279. while(fgets(line, sizeof(line), meminfo))
  280. {
  281. if(sscanf(line, "MemFree: %d kB", freeram) == 1)
  282. {
  283. *freeram <<= 10;
  284. fclose(meminfo);
  285. return 1;
  286. }
  287. }
  288. fclose(meminfo);
  289. return 0;
  290. }
  291. static int video_reqbufs(int dev, int nbufs)
  292. {
  293. struct v4l2_requestbuffers rb;
  294. int ret;
  295. memset(&rb, 0, sizeof rb);
  296. rb.count = nbufs;
  297. rb.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  298. rb.memory = V4L2_MEMORY_MMAP;
  299. ret = ioctl(dev, VIDIOC_REQBUFS, &rb);
  300. if (ret < 0) {
  301. TestAp_Printf(TESTAP_DBG_ERR, "Unable to allocate buffers: %d.\n", errno);
  302. return ret;
  303. }
  304. TestAp_Printf(TESTAP_DBG_FLOW, "%u buffers allocated.\n", rb.count);
  305. return rb.count;
  306. }
  307. int test(const char * strdevname)
  308. {
  309. char filename[] = "quickcam-0000.jpg";
  310. char rec_filename[30] = "RecordH264.h264"; /*"H264.ts"*/
  311. char rec_filename1[30] = "RecordH264HD.h264"; /*"H264.ts"*/
  312. char rec_filename2[30] = "RecordH264QVGA.h264"; /*"H264.ts"*/
  313. char rec_filename3[30] = "RecordH264QQVGA.h264"; /*"H264.ts"*/
  314. char rec_filename4[30] = "RecordH264VGA.h264"; /*"H264.ts"*/
  315. int dev, ret;
  316. int fake_dev; // chris
  317. int freeram;
  318. /* Options parsings */
  319. char do_save = 0, do_enum_inputs = 0, do_capture = 0, do_get_still_image = 0;
  320. char do_list_controls = 0, do_set_input = 0;
  321. char *endptr;
  322. int c;
  323. int framerate = 30;
  324. int bit_num = 0, tmp = 0;
  325. /* Video buffers */
  326. void *mem0[V4L_BUFFERS_MAX];
  327. void *mem1[V4L_BUFFERS_MAX];
  328. unsigned int pixelformat = V4L2_PIX_FMT_MJPEG;
  329. unsigned int width = 1280;
  330. unsigned int height = 720;
  331. unsigned int nbufs = V4L_BUFFERS_DEFAULT;
  332. unsigned int input = 0;
  333. unsigned int skip = 0;
  334. /* Capture loop */
  335. struct timeval start, end, ts;
  336. unsigned int delay = 0, nframes = (unsigned int)-1;
  337. FILE *file = NULL;
  338. FILE *rec_fp1 = NULL;
  339. FILE *rec_fp2 = NULL;
  340. FILE *rec_fp3 = NULL;
  341. FILE *rec_fp4 = NULL;
  342. double fps;
  343. struct v4l2_buffer buf0;
  344. struct v4l2_buffer buf1;
  345. unsigned int i;
  346. char do_record = 0;
  347. /* Houston 2010/11/23 XU Ctrls */
  348. char do_add_xu_ctrl = 0;
  349. char do_xu_get_chip = 0;
  350. char do_xu_get_fmt = 0;
  351. char do_xu_set_fmt = 0;
  352. char do_xu_get_qp = 0;
  353. char do_xu_set_qp = 0;
  354. char do_xu_get_br = 0;
  355. char do_xu_set_br = 0;
  356. char do_enum_MaxPayloadTransSize = 0;
  357. int m_QP_Val = 0;
  358. double m_BitRate = 0.0;
  359. struct Cur_H264Format cur_H264fmt;
  360. char do_xu_get = 0;
  361. char do_xu_set = 0;
  362. unsigned char GetXU_ID = 0;
  363. unsigned char SetXU_ID = 0;
  364. unsigned char GetCS = 0;
  365. unsigned char SetCS = 0;
  366. unsigned char GetCmdDataNum = 0;
  367. unsigned char SetCmdDataNum = 0;
  368. __u8 GetData[11] = {0};
  369. __u8 SetData[11] = {0};
  370. char do_vendor_version_get = 0;
  371. char do_bri_set = 0;
  372. char do_bri_get = 0;
  373. int m_bri_val = 0;
  374. char do_shrp_set = 0;
  375. char do_shrp_get = 0;
  376. int m_shrp_val = 0;
  377. char do_asic_r = 0;
  378. char do_asic_w = 0;
  379. unsigned int rAsicAddr = 0x0;
  380. unsigned char rAsicData = 0x0;
  381. unsigned int wAsicAddr = 0x0;
  382. unsigned char wAsicData = 0x0;
  383. // chris +
  384. /* multi-stream */
  385. unsigned char multi_stream_format = 0;
  386. unsigned char multi_stream_enable = 0;
  387. unsigned int multi_stream_width = 0;//1280;
  388. unsigned int multi_stream_height = 0;//720;
  389. unsigned int multi_stream_resolution = 0;//(multi_stream_width << 16) | (multi_stream_height);
  390. unsigned int MS_bitrate = 0;
  391. unsigned int MS_qp = 0;
  392. unsigned int MS_H264_mode = 0;
  393. unsigned int MS_sub_fr = 0;
  394. unsigned int MS_sub_gop = 0;
  395. unsigned int streamID_set = 0;
  396. unsigned int streamID_get = 0;
  397. char do_multi_stream_set_bitrate = 0;
  398. char do_multi_stream_get_bitrate = 0;
  399. char do_multi_stream_set_qp = 0;
  400. char do_multi_stream_get_qp = 0;
  401. char do_multi_stream_set_H264Mode = 0;
  402. char do_multi_stream_get_H264Mode = 0;
  403. char do_multi_stream_set_sub_fr = 0;
  404. char do_multi_stream_get_sub_fr = 0;
  405. char do_multi_stream_set_sub_gop = 0;
  406. char do_multi_stream_get_sub_gop = 0;
  407. // chris -
  408. //cjc +
  409. char do_multi_stream_set_type = 0;
  410. struct Multistream_Info TestInfo;
  411. char do_multi_stream_get_status = 0;
  412. char do_multi_stream_get_info = 0;
  413. char do_multi_stream_set_enable = 0;
  414. char do_multi_stream_get_enable = 0;
  415. char do_osd_timer_ctrl_set = 0;
  416. char do_osd_rtc_set = 0;
  417. char do_osd_rtc_get = 0;
  418. char do_osd_size_set = 0;
  419. char do_osd_size_get = 0;
  420. char do_osd_color_set = 0;
  421. char do_osd_color_get = 0;
  422. char do_osd_show_set = 0;
  423. char do_osd_show_get = 0;
  424. char do_osd_autoscale_set = 0;
  425. char do_osd_autoscale_get = 0;
  426. char do_osd_ms_size_set = 0;
  427. char do_osd_ms_size_get = 0;
  428. char do_osd_position_set = 0;
  429. char do_osd_position_get = 0;
  430. char do_osd_ms_position_set = 0;
  431. char do_osd_ms_position_get = 0;
  432. char do_md_mode_set = 0;
  433. char do_md_mode_get = 0;
  434. char do_md_threshold_set = 0;
  435. char do_md_threshold_get = 0;
  436. char do_md_mask_set = 0;
  437. char do_md_mask_get = 0;
  438. char do_md_result_set = 0;
  439. char do_md_result_get = 0;
  440. char do_mjpg_bitrate_set = 0;
  441. char do_mjpg_bitrate_get = 0;
  442. char do_h264_iframe_set = 0;
  443. char do_h264_sei_set = 0;
  444. char do_h264_sei_get = 0;
  445. char do_h264_gop_set = 0;
  446. char do_h264_gop_get = 0;
  447. char do_h264_mode_get = 0;
  448. char do_h264_mode_set = 0;
  449. char do_img_mirror_set = 0;
  450. char do_img_mirror_get = 0;
  451. char do_img_flip_set = 0;
  452. char do_img_flip_get = 0;
  453. char do_img_color_set = 0;
  454. char do_img_color_get = 0;
  455. char do_osd_string_set = 0;
  456. char do_osd_string_get = 0;
  457. char do_osd_carcam_set = 0;
  458. char do_osd_carcam_get = 0;
  459. char do_osd_speed_set = 0;
  460. char do_osd_speed_get = 0;
  461. char do_osd_coordinate_set = 0;
  462. char do_osd_coordinate_get = 0;
  463. char do_gpio_ctrl_set = 0;
  464. char do_gpio_ctrl_get = 0;
  465. char do_frame_drop_en_set = 0;
  466. char do_frame_drop_en_get = 0;
  467. char do_frame_drop_ctrl_set = 0;
  468. char do_frame_drop_ctrl_get = 0;
  469. unsigned char osd_timer_count = 0;
  470. unsigned int osd_rtc_year = 0;
  471. unsigned char osd_rtc_month = 0;
  472. unsigned char osd_rtc_day = 0;
  473. unsigned char osd_rtc_hour = 0;
  474. unsigned char osd_rtc_minute = 0;
  475. unsigned char osd_rtc_second = 0;
  476. unsigned char osd_size_line = 0;
  477. unsigned char osd_size_block = 0;
  478. unsigned char osd_color_font = 0;
  479. unsigned char osd_color_border = 0;
  480. unsigned char osd_show_line = 0;
  481. unsigned char osd_show_block = 0;
  482. unsigned char osd_autoscale_line = 0;
  483. unsigned char osd_autoscale_block = 0;
  484. unsigned char osd_ms_size_stream0 = 0;
  485. unsigned char osd_ms_size_stream1 = 0;
  486. unsigned char osd_ms_size_stream2 = 0;
  487. unsigned char osd_type = 0;
  488. unsigned int osd_start_row = 0;
  489. unsigned int osd_start_col = 0;
  490. unsigned char osd_ms_position_streamid = 0;
  491. unsigned char osd_ms_start_row = 0;
  492. unsigned char osd_ms_start_col = 0;
  493. unsigned char osd_ms_s0_start_row = 0;
  494. unsigned char osd_ms_s0_start_col = 0;
  495. unsigned char osd_ms_s1_start_row = 0;
  496. unsigned char osd_ms_s1_start_col = 0;
  497. unsigned char osd_ms_s2_start_row = 0;
  498. unsigned char osd_ms_s2_start_col = 0;
  499. unsigned int osd_line_start_row = 0;
  500. unsigned int osd_line_start_col = 0;
  501. unsigned int osd_block_start_row = 0;
  502. unsigned int osd_block_start_col = 0;
  503. unsigned char md_mode = 0;
  504. unsigned int md_threshold = 0;
  505. unsigned char md_mask[24] = {0};
  506. unsigned char md_result[24] = {0};
  507. unsigned int mjpg_bitrate = 0;
  508. unsigned char h264_sei_en = 0;
  509. unsigned int h264_gop = 0;
  510. unsigned int h264_mode = 0;
  511. unsigned char img_mirror = 0;
  512. unsigned char img_flip = 0;
  513. unsigned char img_color = 0;
  514. unsigned char h264_iframe_reset = 0;
  515. unsigned char osd_2nd_string_group = 0;
  516. unsigned char osd_speed_en = 0;
  517. unsigned char osd_coordinate_en = 0;
  518. unsigned char osd_coordinate_ctrl = 0;
  519. unsigned int osd_speed = 0;
  520. unsigned char osd_coordinate_direction = 0;
  521. unsigned char osd_direction_value[6] = {0};
  522. unsigned char osd_direction_value1 = 0;
  523. unsigned long osd_direction_value2 = 0;
  524. unsigned char osd_direction_value3 = 0;
  525. unsigned long osd_direction_value4 = 0;
  526. unsigned char gpio_ctrl_en = 0;
  527. unsigned char gpio_ctrl_output_value = 0;
  528. unsigned char gpio_ctrl_input_value = 0;
  529. unsigned char stream1_frame_drop_en = 0;
  530. unsigned char stream2_frame_drop_en = 0;
  531. unsigned char stream1_frame_drop_ctrl = 0;
  532. unsigned char stream2_frame_drop_ctrl = 0;
  533. char osd_string[12] = {"0"};
  534. pthread_t thread_capture_id;
  535. do_xu_get_chip = 1;
  536. do_capture = 1;
  537. do_xu_get_br = 1;
  538. do_xu_set_br = 1;
  539. do_vendor_version_get = 1;
  540. dev = video_open(strdevname);
  541. if (dev < 0)
  542. {
  543. printf("fail open device.\n");
  544. return -1;
  545. }
  546. if(do_vendor_version_get)
  547. {
  548. char vendor_version[12];
  549. get_vendor_verson(dev, vendor_version);
  550. TestAp_Printf(TESTAP_DBG_FLOW, "Vendor Version : %s\n",vendor_version);
  551. }
  552. // cjc +
  553. ret = XU_Ctrl_ReadChipID(dev);
  554. if(ret<0)
  555. TestAp_Printf(TESTAP_DBG_ERR, "SONiX_UVC_TestAP @main : XU_Ctrl_ReadChipID Failed\n");
  556. // cjc -
  557. if(do_xu_get_br)
  558. {
  559. XU_H264_Get_BitRate(dev, &m_BitRate);
  560. if(m_BitRate < 0 )
  561. TestAp_Printf(TESTAP_DBG_ERR, "SONiX_UVC_TestAP @main : XU_H264_Get_BitRate Failed\n");
  562. TestAp_Printf(TESTAP_DBG_FLOW, "Current bit rate: %.2f Kbps\n",m_BitRate);
  563. }
  564. m_BitRate = 10000000;
  565. if(do_xu_set_br)
  566. {
  567. if(XU_H264_Set_BitRate(dev, m_BitRate) < 0 )
  568. TestAp_Printf(TESTAP_DBG_ERR, "SONiX_UVC_TestAP @main : XU_H264_Set_BitRate Failed\n");
  569. }
  570. width = 1920;
  571. height = 1080;
  572. framerate = 30;
  573. if (video_set_format(dev, width, height, pixelformat) < 0) {
  574. // cjc +
  575. if(pixelformat == V4L2_PIX_FMT_H264) {
  576. TestAp_Printf(TESTAP_DBG_ERR, " === Set Format Failed : skip for H264 === \n");
  577. }
  578. else {
  579. // cjc -
  580. close(dev);
  581. return 1;
  582. }
  583. }
  584. /* Set the frame rate. */
  585. if (video_set_framerate(dev, framerate, NULL) < 0) {
  586. close(dev);
  587. return -2;
  588. }
  589. if(GetFreeRam(&freeram) && freeram<1843200*nbufs+4194304)
  590. {
  591. TestAp_Printf(TESTAP_DBG_ERR, "free memory isn't enough(%d)\n",freeram);
  592. return 1;
  593. }
  594. /* Allocate buffers. */
  595. if ((int)(nbufs = video_reqbufs(dev, nbufs)) < 0) {
  596. close(dev);
  597. }
  598. /* Map the buffers. */
  599. for (i = 0; i < nbufs; ++i) {
  600. memset(&buf0, 0, sizeof buf0);
  601. buf0.index = i;
  602. buf0.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  603. buf0.memory = V4L2_MEMORY_MMAP;
  604. ret = ioctl(dev, VIDIOC_QUERYBUF, &buf0);
  605. if (ret < 0) {
  606. TestAp_Printf(TESTAP_DBG_ERR, "Unable to query buffer %u (%d).\n", i, errno);
  607. close(dev);
  608. return 1;
  609. }
  610. TestAp_Printf(TESTAP_DBG_FLOW, "length: %u offset: %10u -- ", buf0.length, buf0.m.offset);
  611. mem0[i] = mmap(0, buf0.length, PROT_READ, MAP_SHARED, dev, buf0.m.offset);
  612. if (mem0[i] == MAP_FAILED) {
  613. TestAp_Printf(TESTAP_DBG_ERR, "Unable to map buffer %u (%d)\n", i, errno);
  614. close(dev);
  615. return 1;
  616. }
  617. TestAp_Printf(TESTAP_DBG_FLOW, "Buffer %u mapped at address %p.\n", i, mem0[i]);
  618. }
  619. /* Queue the buffers. */
  620. for (i = 0; i < nbufs; ++i) {
  621. memset(&buf0, 0, sizeof buf0);
  622. buf0.index = i;
  623. buf0.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  624. buf0.memory = V4L2_MEMORY_MMAP;
  625. ret = ioctl(dev, VIDIOC_QBUF, &buf0);
  626. if (ret < 0) {
  627. TestAp_Printf(TESTAP_DBG_ERR, "Unable to queue buffer0(%d).\n", errno);
  628. close(dev);
  629. return 1;
  630. }
  631. }
  632. /* Start streaming. */
  633. video_enable(dev, 1);
  634. for (i = 0; i < nframes; ++i) {
  635. /* Dequeue a buffer. */
  636. memset(&buf0, 0, sizeof buf0);
  637. buf0.type = V4L2_BUF_TYPE_VIDEO_CAPTURE;
  638. buf0.memory = V4L2_MEMORY_MMAP;
  639. ret = ioctl(dev, VIDIOC_DQBUF, &buf0);
  640. if (ret < 0) {
  641. TestAp_Printf(TESTAP_DBG_ERR, "Unable to dequeue buffer0 (%d).\n", errno);
  642. close(dev);
  643. if(multi_stream_enable)
  644. close(fake_dev);
  645. return 1;
  646. }
  647. gettimeofday(&ts, NULL);
  648. TestAp_Printf(TESTAP_DBG_FRAME, "Frame[%4u] %u bytes %ld.%06ld %ld.%06ld\n ", i, buf0.bytesused, buf0.timestamp.tv_sec, buf0.timestamp.tv_usec, ts.tv_sec, ts.tv_usec);
  649. if (i == 0)
  650. start = ts;
  651. ret = ioctl(dev, VIDIOC_QBUF, &buf0);
  652. if (ret < 0) {
  653. TestAp_Printf(TESTAP_DBG_ERR, "Unable to requeue buffer0 (%d).\n", errno);
  654. close(dev);
  655. if(multi_stream_enable)
  656. close(fake_dev);
  657. return 1;
  658. }
  659. fflush(stdout);
  660. }
  661. return 0;
  662. }