Linux--V4L2应用程序开发(二)改变亮度

一、思路流程

创建一个新线程用来控制亮度,线程通过读取用户输入来增加或减少亮度值,并使用 ioctl 函数将新亮度值设置到视频设备。

二、代码

/*创建线程来控制亮度*/
pthread_t thread;
pthread_create(&thread, NULL, thread_brightness_contrl,(void*)fd);



static void*thread_brightness_contrl(void* args)
{
    int fd = (int)args;
    unsigned char c;
    int brightness;
    int delta;

    struct v4l2_queryctrl qctrl;
    memset(&qctrl,0,sizeof(qctrl));
    qctrl.id = V4L2_CID_BRIGHTNESS;
    if(0 != ioctl(fd,VIDIOC_QUERYCTRL,&qctrl))
    {
        printf("can not query brightness\n");
        return NULL;
    }
    printf("brightness min = %d,max = %d\n",qctrl.minimum,qctrl.maximum);

    struct v4l2_control ctl;
    ctl.id = V4L2_CID_BRIGHTNESS;
    ioctl(fd, VIDIOC_G_CTRL,&ctl);

    while(1)
    {
        c= getchar();
        if (c=='u'||c=='U')
        {
            ctl.value += delta;
        }
        else if(c =='D'||c=='d')
        {
            ctl.value -=delta;
        }
        if(ctl.value >= qctrl.maximum) ctl.value = qctrl.maximum;
        if(ctl.value <= qctrl.minimum) ctl.value = qctrl.minimum;

        ioctl(fd,VIDIOC_S_CTRL,&ctl);
    }


    return NULL;
};

三、知识点补充

while循环关键点

  1. 阻塞等待 :当执行 c = getchar(); 时,如果没有输入,程序会在这里阻塞。这意味着线程会在此暂停,直到用户输入一个字符。

  2. 循环继续 :一旦用户输入一个字符,getchar() 返回字符并继续执行循环的剩余部分。循环并未终止,它只是被阻塞等待输入。

  3. 线程挂起 :由于 getchar() 阻塞等待输入,线程会被挂起,等待输入字符。挂起状态并不意味着 while 循环终止,而是线程暂停在 getchar() 这行代码。

相关推荐
dntktop2 小时前
内嵌编辑器+AI助手,Wave Terminal打造终端新体验
运维
Peter_chq3 小时前
【计算机网络】多路转接之select
linux·c语言·开发语言·网络·c++·后端·select
太阳风暴3 小时前
Ubuntu-修改左Alt和Win键位置关系
linux·ubuntu·修改键盘·键盘映射
kaiyuanheshang4 小时前
docker 中的entrypoint和cmd指令
运维·docker·容器·cmd·entrypoint
wanhengwangluo4 小时前
裸金属服务器能够帮助企业解决哪些问题?
运维·服务器
Python私教5 小时前
除了 Docker,还有哪些类似的容器技术?
运维·docker·容器
titxixYY5 小时前
SElinux
linux·运维·服务器
聚名网6 小时前
手机无法连接服务器1302什么意思?
运维·服务器·智能手机
香吧香6 小时前
getent使用小结
linux
代码欢乐豆7 小时前
软件工程第13章小测
服务器·前端·数据库·软件工程