遇到问题:在read()数据时一直卡住,只打印log vbidata_process_frame 1-1,却不能打印vbidata_process_frame 1-2 log ,导致主线程卡住,无法更新画面,经过排查,发现vbi->filename这个文件是null的,如果不是已O_NONBLOCK模式open 节点vbi->filename,则在read读取时不满frame_size个字节会阻塞等待,直到读取到frame_size个字节,代码如下。
static void vbidata_open_device(vbidata_t *vbi) {
struct v4l2_format vfmt;
double frame_rate;
int result;
vbi->fd = open(vbi->filename, O_RDONLY);
if (vbi->fd < 0) {
LOGE("vbidata: Can't open %s: %s\n",
vbi->filename, strerror(errno));
} else {
vbi->open = 1;
}
卡住代码如下:
void vbidata_process_frame(vbidata_t *vbi, int printdebug) {
int scanline;
if (vbi->open) {
LOGD("vbidata_process_frame 1-1 fd=%d",vbi->fd );
int res=read(vbi->fd, vbi->buf, vbi->frame_size);
LOGD("vbidata_process_frame 1-2 fd=%d, res=%d, framesize=%d",vbi->fd ,res,vbi->frame_size);
if (res< vbi->frame_size) {
if (vbi->verbose) {
LOGE("vbidata: Can't read vbi data: %s\n",
strerror(errno));
}
} else {
/* Find line 21 based the lines we are receiving */
if ((vbi->startline > 21) ||
(vbi->startline + vbi->numlines < 21)) {
/* We don't have the required line */
LOGE("vbidata: Not receiving line 21 in VBI\n");
}
scanline = 21 - vbi->startline;
所以解决办法,在打开文件节点时以非阻塞模式打开,open函数设置O_NONBLOCK参数即可。
vbi->fd = open(vbi->filename, O_RDONLY|O_NONBLOCK);