V4L2摄像头测试(一)

1.得到和设置曝光模式。V4L2_CID_EXPOSURE_AUTO
2.得到和设置曝光档次。V4L2_CID_EXPOSURE
struct v4l2_control ctrl;
struct v4l2_control
{
__u32 id;
__s32 value;
};
以曝光模式,曝光,和增益为例;
曝光模式:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
ctrl.value 则由Driver填写。告知当前曝光模式。
有以下几个选择:
enum v4l2_exposure_auto_type {
V4L2_EXPOSURE_AUTO = 0,
V4L2_EXPOSURE_MANUAL = 1,
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
V4L2_EXPOSURE_APERTURE_PRIORITY = 3
};
exposure_auto (menu) : min=0 max=3 default=3 value=3
V4L2_CID_EXPOSURE_AUTO enum v4l2_exposure_auto_type
Enables automatic adjustments of the exposure time and/or iris aperture. The effect of manual changes of the exposure time or iris aperture while these features are enabled is undefined, drivers should ignore such requests. Possible values are:
V4L2_EXPOSURE_AUTO Automatic exposure time, automatic iris aperture.
V4L2_EXPOSURE_MANUAL Manual exposure time, manual iris.
V4L2_EXPOSURE_SHUTTER_PRIORITY Manual exposure time, auto iris.
V4L2_EXPOSURE_APERTURE_PRIORITY Auto exposure time, manual iris.
4. 利用VIDIOC_G_CTRL得到一些设置:
一些具体的设置,如曝光模式(Exposure Type),曝光值(Exposure),增益(Gain),白平衡(WHITE_BALANCE),亮度(BRIGHTNESS),饱和度(SATURATION),对比度(CONTRAST)等信息。可以通过VIDIOC_G_CTRL得到当前值。
用法:APP 填写结构体中的id. 通过调用VIDIOC_G_CTRL,driver 会填写结构体中value项。

注意: Sam测试发现,在Linux下,V4L2_EXPOSURE_ATUO并不被Firmware认可,要设置自动曝光,需要设置为:V4L2_EXPOSURE_APERTURE_PRIORITY
曝光:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为曝光值。
增益:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为增益。
5. 利用VIDIOC_QUERYCTRL 得到设置具体信息:
在很多情况下,我们并不知道如何设置一些信息,例如,曝光应该设置为多少?Driver能够接受的范围是多少?最大,最小值是多少?步长是多少?缺省值为多少?
可以通过VIDIOC_QUERYCTRL得到。
咱们还是以增益为例:
struct v4l2_queryctrl Setting;
Setting.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_QUERYCTRL, &Setting);
Driver就会填写结构体中所有信息。
struct v4l2_queryctrl
{
__u32 id; //用户设置。指定查找的是哪个ID。
enum v4l2_ctrl_type type;
__u8 name[32]; //ID对应的名字。
__s32 minimum;
__s32 maximum;
__s32 step; //步长
__s32 default_value;
__u32 flags;
__u32 reserved[2];
};
这样,就知道设置什么值是合法的了。那么,下一步就是设置了。
6. 利用VIDIOC_S_CTRL来设置:
很简单,设置id和value.调用ioctl就好。
还是以增益为例:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ctrl.value = Gain;
ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl);

struct v4l2_control { __u32 id; __s32 value; };
注释: 曝光模式:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_AUTO;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
ctrl.value 则由Driver填写。告知当前曝光模式。
有以下几个选择:
enum v4l2_exposure_auto_type
{
V4L2_EXPOSURE_AUTO = 0,
V4L2_EXPOSURE_MANUAL = 1,
V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
V4L2_EXPOSURE_APERTURE_PRIORITY = 3 };
曝光:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为曝光值。
增益:
struct v4l2_control ctrl;
ctrl.id = V4L2_CID_GAIN;
ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
同样,driver填写ctrl.value. 内容为增益。

第二部分:

  1. 利用VIDIOC_G_CTRL得到一些设置:
    一些具体的设置,如曝光模式(Exposure Type),曝光值(Exposure),增益(Gain),白平衡(WHITE_BALANCE),亮度(BRIGHTNESS),饱和度(SATURATION),对比度(CONTRAST)等信息。可以通过VIDIOC_G_CTRL得到当前值。
    用法:APP 填写结构体中的id. 通过调用VIDIOC_G_CTRL,driver 会填写结构体中value项。
    struct v4l2_control ctrl;
    struct v4l2_control
    {
    __u32 id;
    __s32 value;
    };
    以曝光模式,曝光,和增益为例;
    曝光模式:
    struct v4l2_control ctrl;
    ctrl.id = V4L2_CID_EXPOSURE_AUTO;
    ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
    ctrl.value 则由Driver填写。告知当前曝光模式。
    有以下几个选择:
    enum v4l2_exposure_auto_type {
    V4L2_EXPOSURE_AUTO = 0,
    V4L2_EXPOSURE_MANUAL = 1,
    V4L2_EXPOSURE_SHUTTER_PRIORITY = 2,
    V4L2_EXPOSURE_APERTURE_PRIORITY = 3
    };
    曝光:
    struct v4l2_control ctrl;
    ctrl.id = V4L2_CID_EXPOSURE_ABSOLUTE;
    ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
    同样,driver填写ctrl.value. 内容为曝光值。
    增益:
    struct v4l2_control ctrl;
    ctrl.id = V4L2_CID_GAIN;
    ret = ioctl(Handle, VIDIOC_G_CTRL, &ctrl);
    同样,driver填写ctrl.value. 内容为增益。
  2. 利用VIDIOC_QUERYCTRL 得到设置具体信息:
    在很多情况下,我们并不知道如何设置一些信息,例如,曝光应该设置为多少?Driver能够接受的范围是多少?最大,最小值是多少?步长是多少?缺省值为多少?
    可以通过VIDIOC_QUERYCTRL得到。
    咱们还是以增益为例:
    struct v4l2_queryctrl Setting;
    Setting.id = V4L2_CID_GAIN;
    ret = ioctl(Handle, VIDIOC_QUERYCTRL, &Setting);
    Driver就会填写结构体中所有信息。
    struct v4l2_queryctrl
    {
    __u32 id; //用户设置。指定查找的是哪个ID。
    enum v4l2_ctrl_type type;
    __u8 name[32]; //ID对应的名字。
    __s32 minimum;
    __s32 maximum;
    __s32 step; //步长
    __s32 default_value;
    __u32 flags;
    __u32 reserved[2];
    };
    这样,就知道设置什么值是合法的了。那么,下一步就是设置了。
  3. 利用VIDIOC_S_CTRL来设置:
    很简单,设置id和value.调用ioctl就好。
    还是以增益为例:
    struct v4l2_control ctrl;
    ctrl.id = V4L2_CID_GAIN;
    ctrl.value = Gain;
    ret = ioctl(Handle, VIDIOC_S_CTRL, &ctrl);
    有时候,硬件设置很奇怪,可以设置某个信息,却无法得到如何设置的信息。例如:HD-500可以设置增益。却无法得到该如何设置。
  4. 利用扩展Ctrl设置:
    焦距(FOUCE);
    注1:enum v4l2_field field; 详解:
    5.设定分辨率:
    struct v4l2_control control;
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_AUTO_WHITE_BALANCE;
    control.value = 1;
    if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0)
    {
    printf(“Couldn’t set auto white balance!\n”);
    //return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_EXPOSURE_AUTO;
    control.value = 1;
    if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0)
    {
    printf(“Couldn’t set auto exposure!\n”);
    //return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_HFLIP;
    control.value = 1;
    if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0)
    {
    printf(“Couldn’t set h flip!\n”);
    //return -1;
    }
    memset(&control, 0, sizeof(control));
    control.id = V4L2_CID_VFLIP;
    control.value = 1;
    if (ioctl(fd, VIDIOC_S_CTRL, &control) < 0)
    {
    printf(“Couldn’t set v flip!\n”);
    //return -1;
    }

你可能感兴趣的:(linux流媒体)