摄像头镜像的问题经常碰到 一直只是测试没有深入去研究 最近看了下 找到了v4l2下面的相关定义 首先上代码 这个是qt4上面用到的 其它的步骤这里就不贴代码了
struct v4l2_control vc;这里直接设置成FLIP_Y_AXIS即垂直方向翻转 不同的内核版本这里的vc设置有可能不一样 我这里用的是2.6.38的版本
vc.id = V4L2_CID_VFLIP;
vc.value = 0;
/* Set up for mirror */
if (ioctl(fd, VIDIOC_S_CTRL, &vc) < 0) {
emit display_error(tr("VIDIOC_S_CTRL").arg(QString(strerror(errno))));
return -1;
}
还有水平方向翻转V4L2_CID_HFLIP
在videodev2.h中定义了这两个宏
#define V4L2_CID_HFLIP (V4L2_CID_BASE+20)
#define V4L2_CID_VFLIP (V4L2_CID_BASE+21)
对应驱动
drivers/media/video/samsung/fimc/s3c_fimc_v4l2.c 函数s3c_fimc_v4l2_s_ctrl中
case V4L2_CID_HFLIP:在函数s3c_fimc_change_rotate中最张会去设置6410中的CAMIF中的CICOTRGFMT寄存器的第14-15位
frame->flip = FLIP_X_AXIS;
ctrl->rot90 = 0;
s3c_fimc_change_rotate(ctrl);
break;
case V4L2_CID_VFLIP:
frame->flip = FLIP_Y_AXIS;
ctrl->rot90 = 0;
s3c_fimc_change_rotate(ctrl);
break;
void s3c_fimc_change_rotate(struct s3c_fimc_control *ctrl)
{
u32 cfg;
if (ctrl->rot90)
s3c_fimc_set_rot90(ctrl);
if (ctrl->out_type == PATH_OUT_DMA) {
cfg = readl(ctrl->regs + S3C_CIPRTRGFMT);
cfg &= ~S3C_CIPRTRGFMT_FLIP_MASK;
cfg |= (ctrl->out_frame.flip << S3C_CIPRTRGFMT_FLIP_SHIFT);
writel(cfg, ctrl->regs + S3C_CIPRTRGFMT);
}
}
重新编译应用程序问题解决