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; }