uvc.c 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. // SPDX-License-Identifier: GPL-2.0-or-later
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. #include <linux/string.h>
  5. #include <linux/types.h>
  6. #include <linux/usb/uvc.h>
  7. #include <linux/videodev2.h>
  8. /* ------------------------------------------------------------------------
  9. * Video formats
  10. */
  11. static const struct uvc_format_desc uvc_fmts[] = {
  12. {
  13. .guid = UVC_GUID_FORMAT_YUY2,
  14. .fcc = V4L2_PIX_FMT_YUYV,
  15. },
  16. {
  17. .guid = UVC_GUID_FORMAT_YUY2_ISIGHT,
  18. .fcc = V4L2_PIX_FMT_YUYV,
  19. },
  20. {
  21. .guid = UVC_GUID_FORMAT_NV12,
  22. .fcc = V4L2_PIX_FMT_NV12,
  23. },
  24. {
  25. .guid = UVC_GUID_FORMAT_MJPEG,
  26. .fcc = V4L2_PIX_FMT_MJPEG,
  27. },
  28. {
  29. .guid = UVC_GUID_FORMAT_YV12,
  30. .fcc = V4L2_PIX_FMT_YVU420,
  31. },
  32. {
  33. .guid = UVC_GUID_FORMAT_I420,
  34. .fcc = V4L2_PIX_FMT_YUV420,
  35. },
  36. {
  37. .guid = UVC_GUID_FORMAT_M420,
  38. .fcc = V4L2_PIX_FMT_M420,
  39. },
  40. {
  41. .guid = UVC_GUID_FORMAT_UYVY,
  42. .fcc = V4L2_PIX_FMT_UYVY,
  43. },
  44. {
  45. .guid = UVC_GUID_FORMAT_Y800,
  46. .fcc = V4L2_PIX_FMT_GREY,
  47. },
  48. {
  49. .guid = UVC_GUID_FORMAT_Y8,
  50. .fcc = V4L2_PIX_FMT_GREY,
  51. },
  52. {
  53. .guid = UVC_GUID_FORMAT_D3DFMT_L8,
  54. .fcc = V4L2_PIX_FMT_GREY,
  55. },
  56. {
  57. .guid = UVC_GUID_FORMAT_KSMEDIA_L8_IR,
  58. .fcc = V4L2_PIX_FMT_GREY,
  59. },
  60. {
  61. .guid = UVC_GUID_FORMAT_Y10,
  62. .fcc = V4L2_PIX_FMT_Y10,
  63. },
  64. {
  65. .guid = UVC_GUID_FORMAT_Y12,
  66. .fcc = V4L2_PIX_FMT_Y12,
  67. },
  68. {
  69. .guid = UVC_GUID_FORMAT_Y16,
  70. .fcc = V4L2_PIX_FMT_Y16,
  71. },
  72. {
  73. .guid = UVC_GUID_FORMAT_BY8,
  74. .fcc = V4L2_PIX_FMT_SBGGR8,
  75. },
  76. {
  77. .guid = UVC_GUID_FORMAT_BA81,
  78. .fcc = V4L2_PIX_FMT_SBGGR8,
  79. },
  80. {
  81. .guid = UVC_GUID_FORMAT_GBRG,
  82. .fcc = V4L2_PIX_FMT_SGBRG8,
  83. },
  84. {
  85. .guid = UVC_GUID_FORMAT_GRBG,
  86. .fcc = V4L2_PIX_FMT_SGRBG8,
  87. },
  88. {
  89. .guid = UVC_GUID_FORMAT_RGGB,
  90. .fcc = V4L2_PIX_FMT_SRGGB8,
  91. },
  92. {
  93. .guid = UVC_GUID_FORMAT_RGBP,
  94. .fcc = V4L2_PIX_FMT_RGB565,
  95. },
  96. {
  97. .guid = UVC_GUID_FORMAT_BGR3,
  98. .fcc = V4L2_PIX_FMT_BGR24,
  99. },
  100. {
  101. .guid = UVC_GUID_FORMAT_BGR4,
  102. .fcc = V4L2_PIX_FMT_XBGR32,
  103. },
  104. {
  105. .guid = UVC_GUID_FORMAT_H264,
  106. .fcc = V4L2_PIX_FMT_H264,
  107. },
  108. {
  109. .guid = UVC_GUID_FORMAT_H265,
  110. .fcc = V4L2_PIX_FMT_HEVC,
  111. },
  112. {
  113. .guid = UVC_GUID_FORMAT_Y8I,
  114. .fcc = V4L2_PIX_FMT_Y8I,
  115. },
  116. {
  117. .guid = UVC_GUID_FORMAT_Y12I,
  118. .fcc = V4L2_PIX_FMT_Y12I,
  119. },
  120. {
  121. .guid = UVC_GUID_FORMAT_Z16,
  122. .fcc = V4L2_PIX_FMT_Z16,
  123. },
  124. {
  125. .guid = UVC_GUID_FORMAT_RW10,
  126. .fcc = V4L2_PIX_FMT_SRGGB10P,
  127. },
  128. {
  129. .guid = UVC_GUID_FORMAT_BG16,
  130. .fcc = V4L2_PIX_FMT_SBGGR16,
  131. },
  132. {
  133. .guid = UVC_GUID_FORMAT_GB16,
  134. .fcc = V4L2_PIX_FMT_SGBRG16,
  135. },
  136. {
  137. .guid = UVC_GUID_FORMAT_RG16,
  138. .fcc = V4L2_PIX_FMT_SRGGB16,
  139. },
  140. {
  141. .guid = UVC_GUID_FORMAT_GR16,
  142. .fcc = V4L2_PIX_FMT_SGRBG16,
  143. },
  144. {
  145. .guid = UVC_GUID_FORMAT_INVZ,
  146. .fcc = V4L2_PIX_FMT_Z16,
  147. },
  148. {
  149. .guid = UVC_GUID_FORMAT_INVI,
  150. .fcc = V4L2_PIX_FMT_Y10,
  151. },
  152. {
  153. .guid = UVC_GUID_FORMAT_INZI,
  154. .fcc = V4L2_PIX_FMT_INZI,
  155. },
  156. {
  157. .guid = UVC_GUID_FORMAT_CNF4,
  158. .fcc = V4L2_PIX_FMT_CNF4,
  159. },
  160. {
  161. .guid = UVC_GUID_FORMAT_HEVC,
  162. .fcc = V4L2_PIX_FMT_HEVC,
  163. },
  164. };
  165. const struct uvc_format_desc *uvc_format_by_guid(const u8 guid[16])
  166. {
  167. unsigned int len = ARRAY_SIZE(uvc_fmts);
  168. unsigned int i;
  169. for (i = 0; i < len; ++i) {
  170. if (memcmp(guid, uvc_fmts[i].guid, 16) == 0)
  171. return &uvc_fmts[i];
  172. }
  173. return NULL;
  174. }
  175. EXPORT_SYMBOL_GPL(uvc_format_by_guid);
  176. MODULE_DESCRIPTION("USB Video Class common code");
  177. MODULE_LICENSE("GPL");