Files
2023-05-14 11:44:44 +00:00

211 lines
4.9 KiB
C++

#include "camera_device.h"
#ifdef LOG_TAG
#undef LOG_TAG
#endif
#define LOG_TAG "aiqtool"
void device_close(int dev_fd)
{
if (-1 == close(dev_fd)) {
errno_debug("close");
}
dev_fd = -1;
}
int device_open(const char* dev_name)
{
int dev_fd;
struct stat st;
if (-1 == stat(dev_name, &st)) {
LOG_ERROR("Cannot identify '%s': %d, %s\n", dev_name, errno, strerror(errno));
return -1;
}
if (!S_ISCHR(st.st_mode)) {
LOG_ERROR("%s is no devicen", dev_name);
return -1;
}
dev_fd = open(dev_name, O_RDWR /*| O_NONBLOCK*/, 0);
if (-1 == dev_fd) {
LOG_ERROR("Cannot open '%s': %d, %s\n", dev_name, errno, strerror(errno));
return -1;
}
return dev_fd;
}
int device_querycap(int dev_fd, struct v4l2_capability* cap)
{
int ret = xioctl(dev_fd, VIDIOC_QUERYCAP, cap);
if (-1 == ret) {
if (EINVAL == errno) {
errno_debug("VIDIOC_QUERYCAP EINVAL");
} else {
errno_debug("VIDIOC_QUERYCAP");
}
}
return ret;
}
int device_cropcap(int dev_fd, struct v4l2_cropcap* cropcap, struct v4l2_crop* crop)
{
int ret = xioctl(dev_fd, VIDIOC_CROPCAP, cropcap);
// if (0 == ret) {
ret = xioctl(dev_fd, VIDIOC_S_CROP, crop);
if (-1 == ret) {
switch (errno) {
case EINVAL:
LOG_ERROR("Cropping not supported.\n");
break;
default:
/* Errors ignored. */
break;
}
}
//}
return ret;
}
int device_setformat(int dev_fd, struct v4l2_format* fmt)
{
/* Note VIDIOC_S_FMT may change width and height. */
int ret = xioctl(dev_fd, VIDIOC_S_FMT, fmt);
if (-1 == ret) {
errno_debug("VIDIOC_S_FMT");
}
return ret;
}
int device_getformat(int dev_fd, struct v4l2_format* fmt)
{
/* Preserve original settings as set by v4l2-ctl for example */
int ret = xioctl(dev_fd, VIDIOC_G_FMT, fmt);
if (-1 == ret) {
errno_debug("VIDIOC_G_FMT");
}
return ret;
}
int device_getsubdevformat(int dev_fd, struct v4l2_subdev_format* fmt)
{
int ret = xioctl(dev_fd, VIDIOC_SUBDEV_G_FMT, fmt);
if (-1 == ret) {
errno_debug("VIDIOC_SUBDEV_G_FMT");
}
return ret;
}
int device_setsubdevformat(int dev_fd, struct v4l2_subdev_format* fmt)
{
int ret = xioctl(dev_fd, VIDIOC_SUBDEV_S_FMT, fmt);
if (-1 == ret) {
errno_debug("VIDIOC_SUBDEV_G_FMT");
}
return ret;
}
int device_setsubdevcrop(int dev_fd, struct v4l2_subdev_selection* sel)
{
int ret = xioctl(dev_fd, VIDIOC_SUBDEV_S_SELECTION, sel);
if (-1 == ret) {
switch (errno) {
case EINVAL:
LOG_ERROR("Cropping not supported.\n");
break;
default:
/* Errors ignored. */
break;
}
}
return ret;
}
int device_getblank(int dev_fd, struct v4l2_queryctrl* ctrl)
{
int ret = xioctl(dev_fd, VIDIOC_QUERYCTRL, ctrl);
if (-1 == ret) {
errno_debug("VIDIOC_QUERYCTRL");
}
return ret;
}
int device_getsensorfps(int dev_fd, struct v4l2_subdev_frame_interval* finterval)
{
int ret = xioctl(dev_fd, VIDIOC_SUBDEV_G_FRAME_INTERVAL, finterval);
if (-1 == ret) {
errno_debug("VIDIOC_SUBDEV_G_FRAME_INTERVAL");
}
return ret;
}
int device_set3aexposure(int dev_fd, struct v4l2_ext_controls* ctrls)
{
int ret = xioctl(dev_fd, VIDIOC_S_EXT_CTRLS, ctrls);
if (-1 == ret) {
errno_debug("VIDIOC_S_EXT_CTRLS");
}
return ret;
}
int device_queryctrl(int dev_fd, struct v4l2_queryctrl* query)
{
int ret = xioctl(dev_fd, VIDIOC_QUERYCTRL, query);
if (-1 == ret) {
errno_debug("VIDIOC_S_CTRL");
}
return ret;
}
int device_setctrl(int dev_fd, struct v4l2_control* ctrl)
{
int ret = xioctl(dev_fd, VIDIOC_S_CTRL, ctrl);
if (-1 == ret) {
errno_debug("VIDIOC_S_CTRL");
}
return ret;
}
int device_streamon(int dev_fd, enum v4l2_buf_type* type)
{
int ret = xioctl(dev_fd, VIDIOC_STREAMON, type);
if (-1 == ret) {
errno_debug("VIDIOC_STREAMON");
}
return ret;
}
int device_streamoff(int dev_fd, enum v4l2_buf_type* type)
{
int ret = xioctl(dev_fd, VIDIOC_STREAMOFF, type);
if (-1 == ret) {
errno_debug("VIDIOC_STREAMOFF");
}
return ret;
}
int device_qbuf(int dev_fd, struct v4l2_buffer* buf)
{
int ret = xioctl(dev_fd, VIDIOC_QBUF, buf);
if (-1 == ret) {
errno_debug("VIDIOC_QBUF");
}
return ret;
}
int device_dqbuf(int dev_fd, struct v4l2_buffer* buf)
{
assert(buf);
int ret = xioctl(dev_fd, VIDIOC_DQBUF, buf);
if (-1 == ret) {
switch (errno) {
case EAGAIN:
return 0;
case EIO:
/* Could ignore EIO, see spec. */
/* fall through */
default:
errno_debug("VIDIOC_DQBUF");
}
}
return ret;
}