list_devices.c 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208
  1. #include "device.h"
  2. #include <assert.h>
  3. #include <linux/limits.h>
  4. #include <linux/media.h>
  5. #include <stdio.h>
  6. const char *
  7. entity_type_str(uint32_t type)
  8. {
  9. switch (type) {
  10. case MEDIA_ENT_F_UNKNOWN:
  11. return "UNKNOWN";
  12. case MEDIA_ENT_F_V4L2_SUBDEV_UNKNOWN:
  13. return "V4L2_SUBDEV_UNKNOWN";
  14. case MEDIA_ENT_F_IO_V4L:
  15. return "IO_V4L";
  16. case MEDIA_ENT_F_IO_VBI:
  17. return "IO_VBI";
  18. case MEDIA_ENT_F_IO_SWRADIO:
  19. return "IO_SWRADIO";
  20. case MEDIA_ENT_F_IO_DTV:
  21. return "IO_DTV";
  22. case MEDIA_ENT_F_DTV_DEMOD:
  23. return "DTV_DEMOD";
  24. case MEDIA_ENT_F_TS_DEMUX:
  25. return "TS_DEMUX";
  26. case MEDIA_ENT_F_DTV_CA:
  27. return "DTV_CA";
  28. case MEDIA_ENT_F_DTV_NET_DECAP:
  29. return "DTV_NET_DECAP";
  30. case MEDIA_ENT_F_CAM_SENSOR:
  31. return "CAM_SENSOR";
  32. case MEDIA_ENT_F_FLASH:
  33. return "FLASH";
  34. case MEDIA_ENT_F_LENS:
  35. return "LENS";
  36. case MEDIA_ENT_F_ATV_DECODER:
  37. return "ATV_DECODER";
  38. case MEDIA_ENT_F_TUNER:
  39. return "TUNER";
  40. case MEDIA_ENT_F_IF_VID_DECODER:
  41. return "IF_VID_DECODER";
  42. case MEDIA_ENT_F_IF_AUD_DECODER:
  43. return "IF_AUD_DECODER";
  44. case MEDIA_ENT_F_AUDIO_CAPTURE:
  45. return "AUDIO_CAPTURE";
  46. case MEDIA_ENT_F_AUDIO_PLAYBACK:
  47. return "AUDIO_PLAYBACK";
  48. case MEDIA_ENT_F_AUDIO_MIXER:
  49. return "AUDIO_MIXER";
  50. case MEDIA_ENT_F_PROC_VIDEO_COMPOSER:
  51. return "PROC_VIDEO_COMPOSER";
  52. case MEDIA_ENT_F_PROC_VIDEO_PIXEL_FORMATTER:
  53. return "PROC_VIDEO_PIXEL_FORMATTER";
  54. case MEDIA_ENT_F_PROC_VIDEO_PIXEL_ENC_CONV:
  55. return "PROC_VIDEO_PIXEL_ENC_CONV";
  56. case MEDIA_ENT_F_PROC_VIDEO_LUT:
  57. return "PROC_VIDEO_LUT";
  58. case MEDIA_ENT_F_PROC_VIDEO_SCALER:
  59. return "PROC_VIDEO_SCALER";
  60. case MEDIA_ENT_F_PROC_VIDEO_STATISTICS:
  61. return "PROC_VIDEO_STATISTICS";
  62. default:
  63. return "invalid type";
  64. }
  65. }
  66. const char *
  67. intf_type_str(uint32_t type)
  68. {
  69. switch (type) {
  70. case MEDIA_INTF_T_DVB_FE:
  71. return "DVB_FE";
  72. case MEDIA_INTF_T_DVB_DEMUX:
  73. return "DVB_DEMUX";
  74. case MEDIA_INTF_T_DVB_DVR:
  75. return "DVB_DVR";
  76. case MEDIA_INTF_T_DVB_CA:
  77. return "DVB_CA";
  78. case MEDIA_INTF_T_DVB_NET:
  79. return "DVB_NET";
  80. case MEDIA_INTF_T_V4L_VIDEO:
  81. return "V4L_VIDEO";
  82. case MEDIA_INTF_T_V4L_VBI:
  83. return "V4L_VBI";
  84. case MEDIA_INTF_T_V4L_RADIO:
  85. return "V4L_RADIO";
  86. case MEDIA_INTF_T_V4L_SUBDEV:
  87. return "V4L_SUBDEV";
  88. case MEDIA_INTF_T_V4L_SWRADIO:
  89. return "V4L_SWRADIO";
  90. case MEDIA_INTF_T_V4L_TOUCH:
  91. return "V4L_TOUCH";
  92. case MEDIA_INTF_T_ALSA_PCM_CAPTURE:
  93. return "ALSA_PCM_CAPTURE";
  94. case MEDIA_INTF_T_ALSA_PCM_PLAYBACK:
  95. return "ALSA_PCM_PLAYBACK";
  96. case MEDIA_INTF_T_ALSA_CONTROL:
  97. return "ALSA_CONTROL";
  98. case MEDIA_INTF_T_ALSA_COMPRESS:
  99. return "ALSA_COMPRESS";
  100. case MEDIA_INTF_T_ALSA_RAWMIDI:
  101. return "ALSA_RAWMIDI";
  102. case MEDIA_INTF_T_ALSA_HWDEP:
  103. return "ALSA_HWDEP";
  104. case MEDIA_INTF_T_ALSA_SEQUENCER:
  105. return "ALSA_SEQUENCER";
  106. case MEDIA_INTF_T_ALSA_TIMER:
  107. return "ALSA_TIMER";
  108. default:
  109. return "invalid type";
  110. }
  111. }
  112. int
  113. main(int argc, char *argv[])
  114. {
  115. MPDeviceList *list = mp_device_list_new();
  116. while (list) {
  117. MPDevice *device = mp_device_list_get(list);
  118. const struct media_device_info *info = mp_device_get_info(device);
  119. printf("%s (%s) %s\n", info->model, info->driver, info->serial);
  120. printf(" Path: %s\n", mp_device_list_get_path(list));
  121. printf(" Bus Info: %s\n", info->bus_info);
  122. printf(" Media Version: %d\n", info->media_version);
  123. printf(" HW Revision: %d\n", info->hw_revision);
  124. printf(" Driver Version: %d\n", info->driver_version);
  125. const struct media_v2_entity *entities =
  126. mp_device_get_entities(device);
  127. size_t num = mp_device_get_num_entities(device);
  128. printf(" Entities (%ld):\n", num);
  129. for (int i = 0; i < num; ++i) {
  130. printf(" %d %s (%s)\n",
  131. entities[i].id,
  132. entities[i].name,
  133. entity_type_str(entities[i].function));
  134. }
  135. const struct media_v2_interface *interfaces =
  136. mp_device_get_interfaces(device);
  137. num = mp_device_get_num_interfaces(device);
  138. printf(" Interfaces (%ld):\n", num);
  139. for (int i = 0; i < num; ++i) {
  140. // Unused
  141. assert(interfaces[i].flags == 0);
  142. char buf[PATH_MAX];
  143. buf[0] = '\0';
  144. mp_find_device_path(interfaces[i].devnode, buf, PATH_MAX);
  145. printf(" %d (%s) devnode %d:%d %s\n",
  146. interfaces[i].id,
  147. intf_type_str(interfaces[i].intf_type),
  148. interfaces[i].devnode.major,
  149. interfaces[i].devnode.minor,
  150. buf);
  151. }
  152. const struct media_v2_pad *pads = mp_device_get_pads(device);
  153. num = mp_device_get_num_pads(device);
  154. printf(" Pads (%ld):\n", num);
  155. for (int i = 0; i < num; ++i) {
  156. printf(" %d for device:%d (",
  157. pads[i].id,
  158. pads[i].entity_id);
  159. if (pads[i].flags & MEDIA_PAD_FL_SINK)
  160. printf("SINK ");
  161. if (pads[i].flags & MEDIA_PAD_FL_SOURCE)
  162. printf("SOURCE ");
  163. if (pads[i].flags & MEDIA_PAD_FL_MUST_CONNECT)
  164. printf("MUST_CONNECT ");
  165. printf(")\n");
  166. }
  167. const struct media_v2_link *links = mp_device_get_links(device);
  168. num = mp_device_get_num_links(device);
  169. printf(" Links (%ld):\n", num);
  170. for (int i = 0; i < num; ++i) {
  171. printf(" %d from:%d to:%d (",
  172. links[i].id,
  173. links[i].source_id,
  174. links[i].sink_id);
  175. if (links[i].flags & MEDIA_LNK_FL_ENABLED)
  176. printf("ENABLED ");
  177. if (links[i].flags & MEDIA_LNK_FL_IMMUTABLE)
  178. printf("IMMUTABLE ");
  179. if (links[i].flags & MEDIA_LNK_FL_DYNAMIC)
  180. printf("DYNAMIC ");
  181. uint32_t type = links[i].flags & MEDIA_LNK_FL_LINK_TYPE;
  182. if (type == MEDIA_LNK_FL_INTERFACE_LINK) {
  183. printf("INTERFACE)\n");
  184. } else {
  185. assert(type == MEDIA_LNK_FL_DATA_LINK);
  186. printf("DATA)\n");
  187. }
  188. }
  189. list = mp_device_list_next(list);
  190. }
  191. mp_device_list_free(list);
  192. }