0007-add-list-controls-and-properties.patch 9.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. From 5e558d4454fa476cc9e0670a30d631a1174b55a2 Mon Sep 17 00:00:00 2001
  2. From: sw.multimedia <sw.multimedia@starfivetech.com>
  3. Date: Tue, 23 Nov 2021 10:44:04 +0800
  4. Subject: [PATCH 07/10] add list controls and properties
  5. ---
  6. src/libcamera/pipeline/starfive/starfive.cpp | 219 ++++++++++++++-----
  7. 1 file changed, 165 insertions(+), 54 deletions(-)
  8. diff --git a/src/libcamera/pipeline/starfive/starfive.cpp b/src/libcamera/pipeline/starfive/starfive.cpp
  9. index 58e1f55a..b91a85a4 100644
  10. --- a/src/libcamera/pipeline/starfive/starfive.cpp
  11. +++ b/src/libcamera/pipeline/starfive/starfive.cpp
  12. @@ -185,7 +185,9 @@ public:
  13. delete ispSubDev_;
  14. }
  15. - int init();
  16. + int init(MediaDevice *media);
  17. + void addControl(uint32_t cid, const ControlInfo &v4l2Info,
  18. + ControlInfoMap::Map *ctrls);
  19. void bufferReady(FrameBuffer *buffer);
  20. bool haveRaw() const { return haveRaw_; }
  21. bool rawActive() const { return rawActive_; }
  22. @@ -298,7 +300,7 @@ private:
  23. StarFiveCameraData *data_;
  24. };
  25. -int StarFiveCameraData::init()
  26. +int StarFiveCameraData::init(MediaDevice *media)
  27. {
  28. int ret;
  29. @@ -353,7 +355,38 @@ int StarFiveCameraData::init()
  30. &StarFiveCameraData::bufferReady);
  31. }
  32. }
  33. -
  34. +
  35. + // properties_.set(properties::Location, properties::CameraLocationExternal);
  36. + properties_.set(properties::Model, utils::toAscii(media->model()));
  37. +
  38. + /*
  39. + * Get the current format in order to initialize the sensor array
  40. + * properties.
  41. + */
  42. + Size resolution;
  43. + for (const auto &it : video_->formats()) {
  44. + const std::vector<SizeRange> &sizeRanges = it.second;
  45. + for (const SizeRange &sizeRange : sizeRanges) {
  46. + if (sizeRange.max > resolution)
  47. + resolution = sizeRange.max;
  48. + }
  49. + }
  50. +
  51. + properties_.set(properties::PixelArraySize, resolution);
  52. + properties_.set(properties::PixelArrayActiveAreas, { Rectangle(resolution) });
  53. +
  54. + /* Initialise the supported controls. */
  55. + ControlInfoMap::Map ctrls;
  56. +
  57. + for (const auto &ctrl : sensor_->controls()) {
  58. + uint32_t cid = ctrl.first->id();
  59. + const ControlInfo &info = ctrl.second;
  60. +
  61. + addControl(cid, info, &ctrls);
  62. + }
  63. +
  64. + controlInfo_ = ControlInfoMap(std::move(ctrls), controls::controls);
  65. +
  66. return 0;
  67. }
  68. @@ -734,97 +767,89 @@ int PipelineHandlerStarFive::processControls(StarFiveCameraData *data, const Con
  69. for (auto it : controls) {
  70. unsigned int id = it.first;
  71. - unsigned int offset = 0;
  72. uint32_t cid = 0;
  73. int32_t value = 0;
  74. switch (id) {
  75. case controls::BRIGHTNESS:
  76. cid = V4L2_CID_BRIGHTNESS;
  77. - offset = 128;
  78. - value = lroundf(it.second.get<float>() * 128 + offset);
  79. - LOG(STARFIVE, Debug) << "Brightness controls: " << id
  80. - << ", value: " << value;
  81. break;
  82. case controls::CONTRAST:
  83. cid = V4L2_CID_CONTRAST;
  84. - offset = 0;
  85. - value = lroundf(it.second.get<float>() * 128 + offset);
  86. - LOG(STARFIVE, Debug) << "Contrast controls: " << id
  87. - << ", value: " << value;
  88. break;
  89. case controls::SATURATION:
  90. cid = V4L2_CID_SATURATION;
  91. - offset = 0;
  92. - value = lroundf(it.second.get<float>() * 128 + offset);
  93. - LOG(STARFIVE, Debug) << "Saturation controls: " << id
  94. - << ", value: " << value;
  95. break;
  96. case controls::SHARPNESS:
  97. cid = V4L2_CID_SHARPNESS;
  98. - offset = 0;
  99. - value = lroundf(it.second.get<float>() * 128 + offset);
  100. - LOG(STARFIVE, Debug) << "Sharpness controls: " << id
  101. - << ", value: " << value;
  102. break;
  103. case controls::COLOUR_GAINS:
  104. cid = V4L2_CID_RED_BALANCE;
  105. - offset = 0;
  106. - value = lroundf(it.second.get<Span<const float>>()[0]);
  107. - LOG(STARFIVE, Debug) << "ColourGains controls: " << id
  108. - << ", COLOUR_GAINS RED value: " << value;
  109. - if (SensorControlsInfoMap.find(cid) != SensorControlsInfoMap.end())
  110. - SensorControls.set(cid, value);
  111. - else
  112. - LOG(STARFIVE, Debug)
  113. - << "SensorControls not supported controls: " << id;
  114. - cid = V4L2_CID_BLUE_BALANCE;
  115. - value = lroundf(it.second.get<Span<const float>>()[1]);
  116. - LOG(STARFIVE, Debug) << "COLOUR_GAINS BLUE value: " << value;
  117. break;
  118. case controls::AWB_ENABLE:
  119. cid = V4L2_CID_AUTO_WHITE_BALANCE;
  120. - value = it.second.get<bool>();
  121. - LOG(STARFIVE, Debug) << "AwbMode controls: " << id
  122. - << ", value: " << value;
  123. break;
  124. case controls::EXPOSURE_VALUE:
  125. cid = V4L2_CID_EXPOSURE;
  126. - offset = 0;
  127. - value = lroundf(it.second.get<float>());
  128. - LOG(STARFIVE, Debug) << "ExposureValue controls: " << id
  129. - << ", value: " << value;
  130. break;
  131. case controls::AE_ENABLE:
  132. cid = V4L2_CID_EXPOSURE_AUTO;
  133. - value = it.second.get<bool>();
  134. - LOG(STARFIVE, Debug) << "AeExposureMode controls: " << id
  135. - << ", value: " << value;
  136. break;
  137. case controls::ANALOGUE_GAIN:
  138. cid = V4L2_CID_ANALOGUE_GAIN;
  139. - offset = 0;
  140. - value = lroundf(it.second.get<float>());
  141. - LOG(STARFIVE, Debug) << "AnalogueGain controls: " << id
  142. - << ", value: " << value;
  143. break;
  144. case controls::DIGITAL_GAIN:
  145. - cid = V4L2_CID_GAIN;
  146. - offset = 0;
  147. - value = lroundf(it.second.get<float>());
  148. - LOG(STARFIVE, Debug) << "AnalogueGain controls: " << id
  149. - << ", value: " << value;
  150. + cid = V4L2_CID_DIGITAL_GAIN;
  151. break;
  152. default:
  153. - LOG(STARFIVE, Debug) << "default controls: " << id;
  154. + continue;
  155. + }
  156. +
  157. + if (SensorControlsInfoMap.find(cid) == SensorControlsInfoMap.end()) {
  158. + LOG(STARFIVE, Debug) << "SensorControls not supported controls: " << id;
  159. + continue;
  160. + }
  161. +
  162. + const ControlInfo &v4l2Info = SensorControlsInfoMap.at(cid);
  163. + int32_t min = v4l2Info.min().get<int32_t>();
  164. + int32_t def = v4l2Info.def().get<int32_t>();
  165. + int32_t max = v4l2Info.max().get<int32_t>();
  166. +
  167. + switch (id) {
  168. + case controls::SATURATION:
  169. + case controls::SHARPNESS:
  170. + case controls::CONTRAST:
  171. + case controls::EXPOSURE_VALUE:
  172. + case controls::ANALOGUE_GAIN:
  173. + case controls::DIGITAL_GAIN:
  174. + case controls::BRIGHTNESS: {
  175. + value = static_cast<int32_t>(lroundf(it.second.get<float>()));
  176. + break;
  177. + }
  178. + case controls::COLOUR_GAINS: {
  179. + value = static_cast<int32_t>(lroundf(it.second.get<float>()));
  180. + LOG(STARFIVE, Debug) << "ColourGains controls: " << id
  181. + << ", COLOUR_GAINS RED value: " << value;
  182. + SensorControls.set(cid, value);
  183. + cid = V4L2_CID_BLUE_BALANCE;
  184. + value = static_cast<int32_t>(lroundf(it.second.get<float>()));
  185. + LOG(STARFIVE, Debug) << "COLOUR_GAINS BLUE value: " << value;
  186. + break;
  187. + }
  188. + case controls::AWB_ENABLE:
  189. + case controls::AE_ENABLE:
  190. + value = it.second.get<bool>();
  191. break;
  192. + default:
  193. + LOG(STARFIVE, Debug) << "default controls: " << id;
  194. + continue;
  195. }
  196. + LOG(STARFIVE, Debug) << "controls: " << id << ", value: " << value;
  197. if (SensorControlsInfoMap.find(cid) != SensorControlsInfoMap.end())
  198. SensorControls.set(cid, value);
  199. else
  200. LOG(STARFIVE, Debug) << "SensorControls not supported controls: " << id;
  201. -
  202. }
  203. for (const auto &ctrl : SensorControls)
  204. @@ -965,7 +990,7 @@ int PipelineHandlerStarFive::registerCameras()
  205. videoEntiryName, sensorEntityName);
  206. /* Locate and open the capture video node. */
  207. - if (data->init())
  208. + if (data->init(starFiveMediaDev_))
  209. continue;
  210. /*create ipa module*/
  211. @@ -1075,6 +1100,92 @@ void StarFiveCameraData::bufferReady(FrameBuffer *buffer)
  212. pipe->completeRequest(request);
  213. }
  214. +void StarFiveCameraData::addControl(uint32_t cid, const ControlInfo &v4l2Info,
  215. + ControlInfoMap::Map *ctrls)
  216. +{
  217. + const ControlId *id;
  218. + ControlInfo info;
  219. +
  220. + LOG(STARFIVE, Debug) << __func__ << " cid: " << utils::hex(cid);
  221. + /* Map the control ID. */
  222. + switch (cid) {
  223. + case V4L2_CID_BRIGHTNESS:
  224. + id = &controls::Brightness;
  225. + break;
  226. + case V4L2_CID_CONTRAST:
  227. + id = &controls::Contrast;
  228. + break;
  229. + case V4L2_CID_SATURATION:
  230. + id = &controls::Saturation;
  231. + break;
  232. + case V4L2_CID_SHARPNESS:
  233. + id = &controls::Sharpness;
  234. + break;
  235. + case V4L2_CID_RED_BALANCE:
  236. + case V4L2_CID_BLUE_BALANCE:
  237. + id = &controls::ColourGains;
  238. + break;
  239. + case V4L2_CID_AUTO_WHITE_BALANCE:
  240. + id = &controls::AwbMode;
  241. + break;
  242. + case V4L2_CID_EXPOSURE:
  243. + id = &controls::ExposureValue;
  244. + break;
  245. + case V4L2_CID_EXPOSURE_AUTO:
  246. + id = &controls::AeExposureMode;
  247. + break;
  248. + case V4L2_CID_ANALOGUE_GAIN:
  249. + id = &controls::AnalogueGain;
  250. + break;
  251. + case V4L2_CID_DIGITAL_GAIN:
  252. + id = &controls::DigitalGain;
  253. + break;
  254. + default:
  255. + LOG(STARFIVE, Debug) << __func__ << " unsupport cid: " << utils::hex(cid);
  256. + return;
  257. + }
  258. +
  259. + /* Map the control info. */
  260. + int32_t min = v4l2Info.min().get<int32_t>();
  261. + int32_t max = v4l2Info.max().get<int32_t>();
  262. + int32_t def = v4l2Info.def().get<int32_t>();
  263. +
  264. + switch (cid) {
  265. + case V4L2_CID_SATURATION:
  266. + case V4L2_CID_SHARPNESS:
  267. + case V4L2_CID_CONTRAST:
  268. + case V4L2_CID_EXPOSURE:
  269. + case V4L2_CID_ANALOGUE_GAIN:
  270. + case V4L2_CID_DIGITAL_GAIN:
  271. + case V4L2_CID_BRIGHTNESS: {
  272. + info = ControlInfo{
  273. + { static_cast<float>(min) },
  274. + { static_cast<float>(max) },
  275. + { static_cast<float>(def) },
  276. + };
  277. + break;
  278. + }
  279. +
  280. + case V4L2_CID_EXPOSURE_AUTO:
  281. + info = ControlInfo{ false, true, true };
  282. + break;
  283. +
  284. + case V4L2_CID_EXPOSURE_ABSOLUTE:
  285. + info = ControlInfo{
  286. + { min * 100 },
  287. + { max * 100 },
  288. + { def * 100 }
  289. + };
  290. + break;
  291. +
  292. + default:
  293. + info = v4l2Info;
  294. + break;
  295. + }
  296. +
  297. + ctrls->emplace(id, info);
  298. +}
  299. +
  300. REGISTER_PIPELINE_HANDLER(PipelineHandlerStarFive)
  301. } /* namespace libcamera */
  302. --
  303. 2.25.1