int main(int argc, char **argv) { int fd_v4l; quitflag = 0; pthread_t sigtid; sigemptyset(&sigset); sigaddset(&sigset, SIGINT); pthread_sigmask(SIG_BLOCK, &sigset, NULL); pthread_create(&sigtid, NULL, (void *)&signal_thread, NULL); if (process_cmdline(argc, argv) < 0) { return -1; } fd_v4l = v4l_capture_setup(); if (g_mem_type == V4L2_MEMORY_USERPTR) if (memalloc(g_frame_size, TEST_BUFFER_NUM) < 0) { close(fd_v4l); } v4l_capture_test(fd_v4l); if (g_mem_type == V4L2_MEMORY_USERPTR) memfree(g_frame_size, TEST_BUFFER_NUM); return 0; }
void* capture_thread(void* arg) { void *shm = NULL; int shmid; shmid = shmget((key_t)123456, g_display_width*g_display_height*3, 0666|IPC_CREAT); if(shmid == -1) { fprintf(stderr, "shmget failed\n"); return NULL; } //将共享内存连接到当前进程的地址空间 shm = shmat(shmid, (void*)0, 0); if(shm == (void*)-1) { fprintf(stderr, "shmat failed\n"); return NULL; } printf("Memory attached at %X\n", (int)shm); shared = (char*)shm; init(); enum v4l2_buf_type type; if ((fd_capture_v4l = open(v4l_capture_dev, O_RDWR, 0)) < 0) { printf("Unable to open %s\n", v4l_capture_dev); return NULL; } if (v4l_capture_setup() < 0) { printf("Setup v4l capture failed.\n"); return NULL; } mxc_v4l_tvin_test(); type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd_capture_v4l, VIDIOC_STREAMOFF, &type); int i; for (i = 0; i < g_capture_num_buffers; i++) { munmap(capture_buffers[i].start, capture_buffers[i].length); } close(fd_capture_v4l); if(shmdt(shm) == -1) fprintf(stderr, "shmdt failed\n"); if(shmctl(shmid, IPC_RMID, 0) == -1) { fprintf(stderr, "shmctl(IPC_RMID) failed\n"); } return NULL; }
int main(int argc, char **argv) { char fb_device[100] = "/dev/fb0"; int fd_fb = 0, i; struct mxcfb_gbl_alpha alpha; enum v4l2_buf_type type; if ((fd_capture_v4l = open(v4l_capture_dev, O_RDWR, 0)) < 0) { printf("Unable to open %s\n", v4l_capture_dev); return TFAIL; } if ((fd_output_v4l = open(v4l_output_dev, O_RDWR, 0)) < 0) { printf("Unable to open %s\n", v4l_output_dev); return TFAIL; } if (v4l_capture_setup() < 0) { printf("Setup v4l capture failed.\n"); return TFAIL; } if (v4l_output_setup() < 0) { printf("Setup v4l output failed.\n"); close(fd_capture_v4l); return TFAIL; } if ((fd_fb = open(fb_device, O_RDWR )) < 0) { printf("Unable to open frame buffer\n"); close(fd_capture_v4l); close(fd_output_v4l); return TFAIL; } /* Overlay setting */ alpha.alpha = 0; alpha.enable = 1; if (ioctl(fd_fb, MXCFB_SET_GBL_ALPHA, &alpha) < 0) { printf("Set global alpha failed\n"); close(fd_fb); close(fd_capture_v4l); close(fd_output_v4l); return TFAIL; } mxc_v4l_tvin_test(); type = V4L2_BUF_TYPE_VIDEO_OUTPUT; ioctl(fd_output_v4l, VIDIOC_STREAMOFF, &type); type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd_capture_v4l, VIDIOC_STREAMOFF, &type); for (i = 0; i < g_output_num_buffers; i++) { munmap(output_buffers[i].start, output_buffers[i].length); } for (i = 0; i < g_capture_num_buffers; i++) { munmap(capture_buffers[i].start, capture_buffers[i].length); } close(fd_capture_v4l); close(fd_output_v4l); close(fd_fb); return 0; }
int mxc_v4l_tvin_test(void) { struct v4l2_buffer capture_buf; v4l2_std_id id; int i, j; enum v4l2_buf_type type; if (start_capturing() < 0) { printf("start_capturing failed\n"); return TFAIL; } for (i = 0; ; i++) { begin: if (ioctl(fd_capture_v4l, VIDIOC_G_STD, &id)) { printf("VIDIOC_G_STD failed.\n"); return TFAIL; } if (id == g_current_std) goto next; else if (id == V4L2_STD_PAL || id == V4L2_STD_NTSC) { type = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(fd_capture_v4l, VIDIOC_STREAMOFF, &type); for (j = 0; j < g_capture_num_buffers; j++) { munmap(capture_buffers[j].start, capture_buffers[j].length); } if (v4l_capture_setup() < 0) { printf("Setup v4l capture failed.\n"); return TFAIL; } if (start_capturing() < 0) { printf("start_capturing failed\n"); return TFAIL; } i = 0; printf("TV standard changed\n"); } else { sleep(1); /* Try again */ if (ioctl(fd_capture_v4l, VIDIOC_G_STD, &id)) { printf("VIDIOC_G_STD failed.\n"); return TFAIL; } if (id != V4L2_STD_ALL) goto begin; printf("Cannot detect TV standard\n"); return 0; } next: waitSem(semSetId,0);//获取一个空间用于存放产品 waitSem(semSetId,2);//占有产品缓冲区 memset(&capture_buf, 0, sizeof(capture_buf)); capture_buf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; capture_buf.memory = V4L2_MEMORY_MMAP; if (ioctl(fd_capture_v4l, VIDIOC_DQBUF, &capture_buf) < 0) { printf("VIDIOC_DQBUF failed.\n"); return TFAIL; } //printf("copy yuyv\n"); memcpy(shared,capture_buffers[capture_buf.index].start,g_in_width*g_in_height*2); //printf("after copy yuyv\n"); sigSem(semSetId,2);//释放产品缓冲区 sigSem(semSetId,1);//告知消费者有产品了 if (ioctl(fd_capture_v4l, VIDIOC_QBUF, &capture_buf) < 0) { printf("VIDIOC_QBUF failed\n"); return TFAIL; } } return 0; }