vidpanel.c
上传用户:aoeyumen
上传日期:2007-01-06
资源大小:3329k
文件大小:11k
源码类别:

DVD

开发平台:

Unix_Linux

  1. /* X Window Video for Linux Two Control Panel Tool
  2.  *
  3.  * For testing a Video for Linux Two driver
  4.  *
  5.  * This program was written by Bill Dirks.
  6.  * This program is in the public domain.
  7.  *
  8.  * gcc -o vidpanel -L/usr/X11R6/lib/ -lXt -lXaw -Wall vidpanel.c
  9.  */
  10. /*  Set these according to your set-up */
  11. #define MY_DEVICE "/dev/video0"
  12. #include <sys/time.h>
  13. #include <sys/types.h>
  14. #include <sys/stat.h>
  15. #include <sys/ioctl.h>
  16. #include <fcntl.h>
  17. #include <unistd.h>
  18. #include <stdlib.h>
  19. #include <stdio.h>
  20. #include <sys/mman.h>
  21. #include <errno.h>
  22. /* These are needed to use the V4L2 driver */
  23. #include <linux/fs.h>
  24. #include <linux/kernel.h>
  25. #include <linux/videodev2.h>  /* Video for Linux Two */
  26. #include <X11/StringDefs.h>
  27. #include <X11/Intrinsic.h>
  28. #include <X11/Xaw/Command.h>
  29. #include <X11/Xaw/Box.h>
  30. #include <X11/Xaw/Scrollbar.h>
  31. #include <X11/Xaw/MenuButton.h>
  32. #include <X11/Xaw/SimpleMenu.h>
  33. #include <X11/Xaw/SmeBSB.h>
  34. #include <X11/Xaw/Toggle.h>
  35. typedef struct
  36. {
  37. int index;
  38. int ctrl_id;
  39. Widget menuitem;
  40. } MenuEntry;
  41. #define MAXMENU 12
  42. typedef struct
  43. {
  44. struct v4l2_queryctrl qc;
  45. Widget box;
  46. Widget label;
  47. Widget widget;
  48. Widget menu;
  49. MenuEntry menuentry[MAXMENU];
  50. } GuiCtrl;
  51. typedef struct
  52. {
  53. XtAppContext xtapp;
  54. Widget w_toplevel;
  55. Widget w_mainbox;
  56. Widget w_menubox;
  57. Widget w_videobox;
  58. Widget w_inputmb;
  59. Widget w_inputmenu;
  60. Widget w_quit;
  61. Widget w_videodefault;
  62. Widget w_device;
  63. } PanelApp;
  64. int vid;
  65. GuiCtrl ctrl[12];
  66. PanelApp app;
  67. #define SLIDERLEN 160
  68. void init_all_controls();
  69. void quit(Widget w, XtPointer client, XtPointer call)
  70. {
  71. exit(0);
  72. }
  73. /*
  74.  *  Scrollbar-type widgets for V4L2 INTEGER controls
  75.  */
  76. void
  77. scroll_jump_proc(Widget w, XtPointer client, XtPointer call)
  78. {
  79. struct v4l2_control vc;
  80. GuiCtrl *ctrl = (GuiCtrl *)client;
  81. float percent = *(float *)call;
  82. vc.id = ctrl->qc.id;
  83. vc.value = ctrl->qc.minimum
  84.  + (int)(percent * (ctrl->qc.maximum - ctrl->qc.minimum + 1));
  85. if (vc.value > ctrl->qc.maximum)
  86. vc.value = ctrl->qc.maximum;
  87. ioctl(vid, VIDIOC_S_CTRL, &vc);
  88. }
  89. void
  90. scroll_proc(Widget w, XtPointer client, XtPointer call)
  91. {
  92. Arg arg[1];
  93. XtArgVal *p;
  94. int d = (int)call;
  95. static float f;
  96. XtVaGetValues(w, XtNtopOfThumb, &f, NULL);
  97. f += (float)d / (float)SLIDERLEN;
  98. if (f < 0) f = 0;
  99. if (f > 1) f = 1;
  100. p = (XtArgVal *)&f;
  101. if (sizeof(float) > sizeof(XtArgVal))
  102. XtSetArg(arg[0], XtNtopOfThumb, &f);
  103. else
  104. XtSetArg(arg[0], XtNtopOfThumb, *p);
  105. XtSetValues(w, arg, 1);
  106. scroll_jump_proc(w, client, &f);/* to change the control */
  107. }
  108. void
  109. init_scroll_control(GuiCtrl *ctrl)
  110. {
  111. struct v4l2_control vc;
  112. int d;
  113. static float f;
  114. Arg arg[1];
  115. XtArgVal *p;
  116. /*  Initialize the thumb position  */
  117. vc.id = ctrl->qc.id;
  118. if (ioctl(vid, VIDIOC_G_CTRL, &vc))
  119. return;
  120. d = (SLIDERLEN * (vc.value - ctrl->qc.minimum)
  121.      + ((ctrl->qc.maximum - ctrl->qc.minimum) >> 1))
  122. / (ctrl->qc.maximum - ctrl->qc.minimum);
  123. f = 0;
  124. p = (XtArgVal *)&f;
  125. if (sizeof(float) > sizeof(XtArgVal))
  126. XtSetArg(arg[0], XtNtopOfThumb, &f);
  127. else
  128. XtSetArg(arg[0], XtNtopOfThumb, *p);
  129. XtSetValues(ctrl->widget, arg, 1);
  130. scroll_proc(ctrl->widget, ctrl, (XtPointer)d);
  131. }
  132. void
  133. add_scroll_control(GuiCtrl *ctrl)
  134. {
  135. ctrl->widget =
  136. XtVaCreateManagedWidget("scroll",
  137. scrollbarWidgetClass,
  138. ctrl->box,
  139. XtNorientation, XtorientHorizontal,
  140. XtNlength, SLIDERLEN,
  141. XtNminimumThumb, 14,
  142. XtNthickness, 18,
  143. NULL);
  144. ctrl->label = 
  145. XtVaCreateManagedWidget("label",
  146. labelWidgetClass, ctrl->box,
  147. XtNlabel, ctrl->qc.name,
  148. XtNborderWidth, 0,
  149. NULL);
  150. XtAddCallback(ctrl->widget, XtNscrollProc, scroll_proc, ctrl);
  151. XtAddCallback(ctrl->widget, XtNjumpProc, scroll_jump_proc, ctrl);
  152. }
  153. /*
  154.  *  Toggle-type widgets for V4L2 BOOLEAN controls
  155.  */
  156. void
  157. boolproc(Widget w, XtPointer client, XtPointer call)
  158. {
  159. GuiCtrl *ctrl = (GuiCtrl *)client;
  160. int d = (int)call;
  161. struct v4l2_control vc;
  162. vc.id = ctrl->qc.id;
  163. vc.value = d;
  164. ioctl(vid, VIDIOC_S_CTRL, &vc);
  165. }
  166. void
  167. init_bool_control(GuiCtrl *ctrl)
  168. {
  169. struct v4l2_control vc;
  170. Arg arg[1];
  171. vc.id = ctrl->qc.id;
  172. if (ioctl(vid, VIDIOC_G_CTRL, &vc))
  173. return;
  174. XtSetArg(arg[0], XtNstate, vc.value);
  175. XtSetValues(ctrl->widget, arg, 1);
  176. }
  177. void
  178. add_bool_control(GuiCtrl *ctrl)
  179. {
  180. ctrl->widget =
  181. XtVaCreateManagedWidget("bool",
  182. toggleWidgetClass,
  183. ctrl->box,
  184. XtNlabel, ctrl->qc.name,
  185. XtNorientation, XtorientHorizontal,
  186. XtNwidth, SLIDERLEN,
  187. NULL);
  188. XtAddCallback(ctrl->widget, XtNcallback, boolproc, ctrl);
  189. }
  190. /*
  191.  *  Menu-type widgets for V4L2 MENU controls
  192.  */
  193. #define VIDIN_ID 1010
  194. void
  195. menu_proc(Widget w, XtPointer client, XtPointer call)
  196. {
  197. MenuEntry *menuentry = (MenuEntry *)client;
  198. struct v4l2_control vc;
  199. if (menuentry->ctrl_id == VIDIN_ID)
  200. {
  201. ioctl(vid, VIDIOC_S_INPUT, menuentry->index);
  202. init_all_controls();
  203. return;
  204. }
  205. vc.id = menuentry->ctrl_id;
  206. vc.value = menuentry->index;
  207. ioctl(vid, VIDIOC_S_CTRL, &vc);
  208. }
  209. void
  210. add_menu_control(GuiCtrl *ctrl)
  211. {
  212. int i, n;
  213. struct v4l2_querymenu qm;
  214. struct v4l2_input vi;
  215. char itemlabel[40];
  216. char menulabel[40];
  217. strcpy(menulabel, ctrl->qc.name);
  218. strcat(menulabel, "...");
  219. ctrl->widget = XtVaCreateManagedWidget(
  220. "menubutton",
  221. menuButtonWidgetClass, ctrl->box,
  222. XtNlabel, menulabel,
  223. XtNmenuName, ctrl->qc.name,
  224. XtNborderWidth, 1,
  225. XtNorientation, XtorientHorizontal,
  226. XtNwidth, SLIDERLEN,
  227. NULL);
  228. ctrl->menu = XtVaCreatePopupShell(
  229. ctrl->qc.name,
  230. simpleMenuWidgetClass, ctrl->widget,
  231. NULL);
  232. for (i = n = 0; i < MAXMENU && i <= ctrl->qc.maximum; ++i)
  233. {
  234. if (ctrl->qc.id == VIDIN_ID)
  235. {
  236. vi.index = i;
  237. if (ioctl(vid, VIDIOC_ENUMINPUT, &vi) != 0)
  238. continue;
  239. strcpy(itemlabel, vi.name);
  240. }
  241. else
  242. {
  243. qm.id = ctrl->qc.id;
  244. qm.index = i;
  245. if (ioctl(vid, VIDIOC_QUERYMENU, &qm) != 0)
  246. break;
  247. strcpy(itemlabel, qm.name);
  248. }
  249. ctrl->menuentry[n].index = i;
  250. ctrl->menuentry[n].ctrl_id = ctrl->qc.id;
  251. ctrl->menuentry[n].menuitem = XtVaCreateManagedWidget(
  252. "item",
  253. smeBSBObjectClass, ctrl->menu,
  254. XtNlabel, itemlabel,
  255. XtNwidth, SLIDERLEN,
  256. NULL);
  257. XtAddCallback(ctrl->menuentry[n].menuitem, 
  258.       XtNcallback, menu_proc, &ctrl->menuentry[n]);
  259. ++n;
  260. }
  261. }
  262. /*
  263.  *  Action Button-type widgets for V4L2 BUTTON controls
  264.  */
  265. void
  266. button_proc(Widget w, XtPointer client, XtPointer call)
  267. {
  268. GuiCtrl *ctrl = (GuiCtrl *)client;
  269. struct v4l2_control vc;
  270. vc.id = ctrl->qc.id;
  271. vc.value = 0;
  272. ioctl(vid, VIDIOC_S_CTRL, &vc);
  273. }
  274. void
  275. add_button_control(GuiCtrl *ctrl)
  276. {
  277. ctrl->widget = XtVaCreateManagedWidget(
  278. ctrl->qc.name,
  279. commandWidgetClass, ctrl->box,
  280. XtNborderWidth, 2,
  281. XtNorientation, XtorientHorizontal,
  282. XtNwidth, SLIDERLEN,
  283. NULL);
  284. XtAddCallback(ctrl->widget, XtNcallback, button_proc, ctrl);
  285. }
  286. /*
  287.  *  Top-level control-handling functions
  288.  */
  289. void
  290. init_control(GuiCtrl *ctrl)
  291. {
  292. if (ctrl->widget == 0)
  293. return;
  294. if (ctrl->qc.type == V4L2_CTRL_TYPE_INTEGER)
  295. init_scroll_control(ctrl);
  296. if (ctrl->qc.type == V4L2_CTRL_TYPE_BOOLEAN)
  297. init_bool_control(ctrl);
  298. }
  299. void
  300. add_control(GuiCtrl *ctrl, Widget parent)
  301. {
  302. ctrl->box =
  303. XtVaCreateManagedWidget("ctrlbox",
  304. boxWidgetClass, parent,
  305. XtNorientation, XtorientHorizontal,
  306. XtNhSpace, 2,
  307. XtNvSpace, 2,
  308. XtNborderWidth, 0,
  309. NULL);
  310. if (ctrl->qc.type == V4L2_CTRL_TYPE_INTEGER)
  311. add_scroll_control(ctrl);
  312. if (ctrl->qc.type == V4L2_CTRL_TYPE_BOOLEAN)
  313. add_bool_control(ctrl);
  314. if (ctrl->qc.type == V4L2_CTRL_TYPE_MENU)
  315. add_menu_control(ctrl);
  316. if (ctrl->qc.type == V4L2_CTRL_TYPE_BUTTON)
  317. add_button_control(ctrl);
  318. init_control(ctrl);
  319. }
  320. void
  321. init_all_controls()
  322. {
  323. int i;
  324. for (i = 0; i < sizeof(ctrl)/sizeof(ctrl[0]); ++i)
  325. init_control(&ctrl[i]);
  326. }
  327. void
  328. default_all_controls()
  329. {
  330. struct v4l2_control vc;
  331. int i;
  332. for (i = 0; i < sizeof(ctrl)/sizeof(ctrl[0]); ++i)
  333. {
  334. if (ctrl[i].widget == 0)
  335. continue;
  336. if (ctrl[i].qc.type == V4L2_CTRL_TYPE_BUTTON)
  337. continue;
  338. vc.id = ctrl[i].qc.id;
  339. vc.value = ctrl[i].qc.default_value;
  340. ioctl(vid, VIDIOC_S_CTRL, &vc);
  341. }
  342. init_all_controls();
  343. }
  344. void
  345. create_video_controls(Widget parent)
  346. {
  347. int i, id, err;
  348. app.w_videobox = XtVaCreateManagedWidget(
  349. "Video Controls",
  350. boxWidgetClass, parent,
  351. XtNorientation, XtorientVertical,
  352. XtNvSpace, 5,
  353. XtNborderWidth, 0,
  354. NULL);
  355. i = 0;
  356. /*  Video Input menu first (handled special)  */
  357. ctrl[i].qc.id = VIDIN_ID;
  358. ctrl[i].qc.type = V4L2_CTRL_TYPE_MENU;
  359. ctrl[i].qc.minimum = 0;
  360. ctrl[i].qc.maximum = 10;
  361. strcpy(ctrl[i].qc.name, "Video Input");
  362. add_control(&ctrl[i], app.w_videobox);
  363. ++i;
  364. for (id = 0; id < 100; ++id)
  365. {
  366. ctrl[i].qc.id = V4L2_CID_BASE + id;
  367. err = ioctl(vid, VIDIOC_QUERYCTRL, &ctrl[i].qc);
  368. if (err && errno == EDOM)
  369. break;
  370. if (err == 0 && ctrl[i].qc.category == V4L2_CTRL_CAT_VIDEO)
  371. {
  372. add_control(&ctrl[i], app.w_videobox);
  373. ++i;
  374. }
  375. }
  376. for (id = 0; id < 100; ++id)
  377. {
  378. ctrl[i].qc.id = V4L2_CID_PRIVATE_BASE + id;
  379. err = ioctl(vid, VIDIOC_QUERYCTRL, &ctrl[i].qc);
  380. if (err && errno == EDOM)
  381. break;
  382. if (err == 0 && ctrl[i].qc.category == V4L2_CTRL_CAT_VIDEO)
  383. {
  384. add_control(&ctrl[i], app.w_videobox);
  385. ++i;
  386. }
  387. }
  388. app.w_videodefault = XtVaCreateManagedWidget(
  389. "Default All Controls",
  390. commandWidgetClass, app.w_videobox,
  391. XtNborderWidth, 2,
  392. XtNorientation, XtorientHorizontal,
  393. XtNwidth, SLIDERLEN,
  394. NULL);
  395. XtAddCallback(app.w_videodefault, 
  396.       XtNcallback, default_all_controls, 
  397.       NULL);
  398. }
  399. /*
  400.  *  Main
  401.  */
  402. int
  403. main(int argc, char *argv[])
  404. {
  405. char my_device[64];
  406. struct v4l2_capability caps;
  407. char device_label[96];
  408. /*-> Put in the device node name */
  409. strcpy(my_device, MY_DEVICE);
  410. if (argc >= 2)
  411. strcpy(my_device, argv[1]);
  412. vid = open(my_device, O_NONCAP);
  413. if (vid < 0)
  414. {
  415. printf("No video device "%s"n", my_device);
  416. return 1;
  417. }
  418. ioctl(vid, VIDIOC_QUERYCAP, &caps);
  419. app.w_toplevel = XtAppInitialize(
  420. &app.xtapp, "V4L2 Control Panel", NULL, 0,
  421. &argc, argv, NULL, NULL, 0);
  422. app.w_mainbox = XtVaCreateManagedWidget(
  423. "mainbox",
  424. boxWidgetClass, app.w_toplevel,
  425. XtNorientation, XtorientVertical,
  426. XtNhSpace, 0,
  427. XtNvSpace, 0,
  428. NULL);
  429. sprintf(device_label, "%s: %s", my_device, caps.name);
  430. app.w_device = XtVaCreateManagedWidget(
  431. "device",
  432. labelWidgetClass, app.w_mainbox,
  433. XtNlabel, device_label,
  434. XtNborderWidth, 0,
  435. NULL);
  436. app.w_menubox = XtVaCreateManagedWidget(
  437. "menubox",
  438. boxWidgetClass, app.w_mainbox,
  439. XtNorientation, XtorientHorizontal,
  440. XtNhSpace, 7,
  441. XtNvSpace, 2,
  442. XtNborderWidth, 0,
  443. NULL);
  444. app.w_quit = XtVaCreateManagedWidget(
  445. "Quit!",
  446. commandWidgetClass, app.w_menubox,
  447. XtNborderWidth, 2,
  448. NULL);
  449. XtAddCallback(app.w_quit, XtNcallback, quit, NULL);
  450. create_video_controls(app.w_mainbox);
  451. XtRealizeWidget(app.w_toplevel);
  452. XtAppMainLoop(app.xtapp);
  453. return 0;
  454. }