24 #include <sys/types.h>
30 #define ISP_META_WIDTH 272
31 #define ISP_META_HEIGHT 1
39 #ifdef JEVOIS_PLATFORM_A33
47 #ifdef JEVOIS_PLATFORM_PRO
56 while (itsDev.empty() ==
false) itsDev.pop_back();
59 unsigned int capw = m.cw, caph = m.ch;
int preset = -1;
61 std::string pstr;
if (preset != -1) pstr =
" [preset " +
std::to_string(preset) +
']';
62 LINFO(itsSensor <<
": using native video capture size " << capw <<
'x' << caph << pstr <<
" + crop/resize as needed");
67 case jevois::CropType::Scale:
71 if (capw != m.cw || caph != m.ch)
73 LINFO(
"Capture: " << capw <<
'x' << caph <<
", rescale to " << m.cw <<
'x' << m.ch);
76 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, 2,
true));
77 itsDev.back()->setFormat(m.cfmt, capw, caph, m.cfps, m.cw, m.ch, preset);
79 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, 2,
true));
83 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, itsNbufs,
false));
84 itsDev.back()->setFormat(m.cfmt, m.cw, m.ch, 0.0F, m.cw, m.ch);
86 itsFd = itsDev.back()->getFd(); itsDevIdx = itsDev.size() - 1;
87 itsFd2 = -1; itsDev2Idx = -1;
95 if (capw == m.cw && caph == m.ch)
LINFO(
"Capture: " << capw <<
'x' << caph);
96 else LINFO(
"Capture: " << capw <<
'x' << caph <<
", crop to " << m.cw <<
'x' << m.ch);
99 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, itsNbufs,
false));
100 itsDev.back()->setFormat(m.cfmt, capw, caph, m.cfps, m.cw, m.ch, preset);
102 itsFd = itsDev.back()->getFd(); itsDevIdx = itsDev.size() - 1;
103 itsFd2 = -1; itsDev2Idx = -1;
107 case jevois::CropType::CropScale:
109 LINFO(
"Capture: " << capw <<
'x' << caph <<
", plus ISP scaled to " << m.c2w <<
'x' << m.c2h);
112 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, 2,
false));
113 itsDev.back()->setFormat(m.cfmt, capw, caph, m.cfps, m.cw, m.ch, preset);
115 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, 2,
true));
119 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, itsNbufs,
false));
120 itsDev.back()->setFormat(m.c2fmt, m.c2w, m.c2h, m.cfps, m.c2w, m.c2h);
122 itsFd = itsDev.front()->getFd(); itsDevIdx = 0;
123 itsFd2 = itsDev.back()->getFd(); itsDev2Idx = itsDev.size() - 1;
127 default:
LFATAL(
"Invalid crop type: " <<
int(m.crop));
131 #else // JEVOIS_PLATFORM_PRO
140 while (itsDev.empty() ==
false) itsDev.pop_back();
143 itsDev.push_back(std::make_shared<jevois::CameraDevice>(itsDevName, itsNbufs,
false));
144 itsDev.back()->setFormat(m.cfmt, m.cw, m.ch, m.cfps, m.cw, m.ch);
145 itsFd = itsDev.back()->getFd(); itsDevIdx = itsDev.size() - 1;
146 itsFd2 = -1; itsDev2Idx = -1;
148 #endif // JEVOIS_PLATFORM_PRO
194 if (itsDevIdx == -1)
LFATAL(
"Need to call setFormat() first");
195 itsDev[itsDevIdx]->get(img);
201 return (itsDev2Idx != -1);
210 if (itsDev2Idx == -1)
LFATAL(
"No JeVois Pro Platform ISP-scaled image available");
211 itsDev[itsDev2Idx]->get(img);
219 if (itsDevIdx == -1)
LFATAL(
"Need to call setFormat() first");
220 itsDev[itsDevIdx]->done(img);
228 if (itsDev2Idx == -1)
LFATAL(
"No JeVois Pro Platform ISP-scaled image available");
229 itsDev[itsDev2Idx]->done(img);
236 if (itsFd == -1)
LFATAL(
"Not initialized");
237 XIOCTL_QUIET(itsFd, VIDIOC_QUERYCTRL, &qc);
244 if (itsFd == -1)
LFATAL(
"Not initialized");
245 XIOCTL_QUIET(itsFd, VIDIOC_QUERYMENU, &qm);
252 if (itsFd == -1)
LFATAL(
"Not initialized");
253 #ifdef JEVOIS_PLATFORM_A33
254 XIOCTL_QUIET(itsFd, 0xc00c561b , &ctrl);
256 XIOCTL_QUIET(itsFd, VIDIOC_G_CTRL, &ctrl);
264 if (itsFd == -1)
LFATAL(
"Not initialized");
265 #ifdef JEVOIS_PLATFORM_A33
266 XIOCTL_QUIET(itsFd, 0xc00c561c , &ctrl);
268 XIOCTL_QUIET(itsFd, VIDIOC_S_CTRL, &ctrl);
276 if (itsFd == -1)
LFATAL(
"Not initialized");
279 std::ofstream ofs(
"/sys/devices/platform/sensor/sreg");
282 unsigned short data[2] = { reg, val };
283 LDEBUG(
"Writing 0x" << std::hex << val <<
" to 0x" << reg);
284 XIOCTL(itsFd, _IOW(
'V', 192,
int), data);
292 if (itsFd == -1)
LFATAL(
"Not initialized");
295 std::ofstream ofs(
"/sys/devices/platform/sensor/sreg");
298 std::ifstream ifs(
"/sys/devices/platform/sensor/sreg");
299 unsigned short val; ifs >> std::hex >> val;
302 unsigned short data[2] = { reg, 0 };
303 XIOCTL(itsFd, _IOWR(
'V', 193,
int), data);
304 LDEBUG(
"Register 0x" << std::hex << reg <<
" has value 0x" << data[1]);
313 if (itsFd == -1)
LFATAL(
"Not initialized");
326 int fd = open(itsDevName.c_str(), O_RDWR | O_NONBLOCK, 0);
330 try { XIOCTL(fd, _IOWR(
'V', 198,
int), &data); }