V4L2文档翻译(四)

扩展控制

介绍

控制机制原本是用于用户设置(如亮度,饱和度等)。但无论如何,它恰恰证明了对于复杂驱动他是个非常有用的模型,如每个驱动包含一个大型API的子模块。
MPEG编码API就是在这样的设计理念下:MPEG标准十分庞大,当前支持MPEG编码的硬件只是声明了这个标准的一小部分。另外,许多关系到怎样将视频编码到MPEG流的参数是定义在MPEG编码芯片中,因为MPEG标准只定义了最终MPEG流的格式,并没有规定视频如何成为MPEG格式。

不幸的是,原始的控制API缺少一些新环境下需要的特性,所以这里也就应运而生了扩展控制API。

MPEG编码API是第一个使用扩展API的,如今也有了其他类型的扩展控制,如相机控制、FM传输控制等。下边就描述一下所有类型的扩展控制API。

扩展控制API

这里有三个新的ioctl:VIDIOC_G_EXT_CTRLS,VIDIOC_S_EXT_CTRLS,VIDIOC_TRY_EXT_CTRLS。这写ioctl作用于多个控制(这与VIDIOC_G_CTRL和VIDIOC_S_CTRL相反,他们是作用与一个控制)。这是因为他们经常被用来一次修改多个控制。

每一个新的ioctl都需要一个struct v4l2_ext_controls类型指针。这个类型结构体包含了一个控制集合指针,一个集合中的成员数以及控制类型。一组相似的控制为一个控制类。比如,控制类型V4L2_CTRL_CLASS_USER包含所有的用户操作(可以使用VIDIOC_S_CTRL进行设置)。V4L2_CTRL_CLASSS_MPEG包含了所有MPEG编码相关控制。

在控制集合中的所有控制必须依附于一个特定控制类,如果不是的话,将返回错误。

可以通过空的控制集合(count=0集合成员数为0)来检测这个特定的控制类型是否能够支持。

struct v4l2_ext_controls与struct v4l2_control十分相似,除了支持64位值和指针。

考虑到控制的灵活性,检查其是否被驱动支持以及其值的有效范围尤其重要。使用VIDIOC_QUERYCTRL和VIDIOC_QUERYMENU进行检查。同时,要注意控制的菜单索引可能不支持V4L2_CTRL_TYPE_MENU类型(VIDIOC_QUERYMENU会返回错误)。一个很好的例子是MPEG支持的声音波特率。一些驱动只支持一个或两个波特率,其他则支持更宽的范围。

所有控制按机器字节顺序排列。

列举扩展控制

推荐使用VIDIOC_QUERYCTRL与V4L2_CTRL_FLAG_NEXT_CTRL标志组合来列举扩展控制:

struct v4l2_queryctrl qctrl;

qctrl.id = V4L2_CTRL_FLAG_NEXT_CTRL;
while (0 == ioctl (fd, VIDIOC_QUERYCTRL, &qctrl)) {
    /* ... */
    qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
}

初始控制ID为0,带有V4L2_CTRL_FLAG_NEXT_CTRL标签。VIDIOC_QUERYCTRL会返回第一个比规定的ID高的那个ID,如果没有找到则返回错误。

如果你想要获取规定控制类的全部控制,你可以通过初始化qctrl.id的值为特定控制类,并外加一个检测:

qctrl.id = V4L2_CTRL_CLASS_MPEG | V4L2_CTRL_FLAG_NEXT_CTRL;
while (0 == ioctl (fd, VIDIOC_QUERYCTRL, &qctrl)) {
    if (V4L2_CTRL_ID2CLASS (qctrl.id) != V4L2_CTRL_CLASS_MPEG)
        break;
        /* ... */
        qctrl.id |= V4L2_CTRL_FLAG_NEXT_CTRL;
    }

qutrl.id为32位的值,有三个位区域:最高4位为标签保留位,并不是ID的一部分。其余的28位是控制ID的格式,高12位定义控制类,低16位是此类型中的控制标识符。这样保证了最后16位都是非0值。0x1000的范围被保留为驱动特许控制,V4L2_CTRL_ID2CLASS宏返回的是基于控制ID的控制类ID。

若驱动不支持扩展控制,VIDIOC_QUERYCTRL在带V4L2_CTRL_FLAG_NEXT_CTRL的请求将会失败。这时,列举控制应该使用老方法(如例1.8),但如果支持的话,它可以将所有的控制都列举出来,包括驱动私有控制。

创建控制盘

可以为图形用户接口创建控制盘,用户可以通过它选择多种控制。基本上,你不得不使用上边的方法来一次次的处理所有控制。每个控制类都以类型V4L2_CTRL_TYPE_CTRL_CLASS开始,VIDIOC_QUERYCTRL将会返回控制表盘中标签页的名字对应的控制类名称。

struct v4l2_queryctrl结构体中的flags成员同样包含了控制的行为。VIDIOC_QUERYCTRL的文档包含了更多的细节。

编码控制参考
  • 一般编码控制
  • MFC 5.1 MPEG控制
  • CX2341x MPEG控制
  • VPX 控制参考

由于项目过多,不一一列举,包含了编码、相机控制、视频控制、FM传输控制、闪光灯控制等。详见http://linuxtv.org/downloads/v4l-dvb-apis/extended-controls.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值