int main(int argc, char ** argv){ long start_time, end_time ; double diff_time ; struct timespec cpu_time ; unsigned short vsync1, vsync2 ; FILE * rgb_fd, * yuv_fd ; int i,j, res, inc = 0; unsigned int nbFrames = 1 ; unsigned int pos = 0 ; unsigned char * image_buffer, * start_buffer, * end_ptr; //yuv frame buffer unsigned char * rgb_buffer ; unsigned short fifo_state, fifo_data ; float y, u, v ; float r, g, b ; if(argc > 1){ nbFrames = atoi(argv[1]); } if(fifo_open(1) < 0 || image_buffer == 0){ printf("Error opening fifo 0 \n"); return -1 ; } image_buffer = (unsigned char *) malloc(IMAGE_WIDTH*IMAGE_HEIGHT*3); for(inc = 0 ; inc < nbFrames ; ){ sprintf(yuv_file_name, "./grabbed_frame%04d.jpg", inc); yuv_fd = fopen(yuv_file_name, "w"); if(yuv_fd == NULL){ perror("Error opening output file"); exit(EXIT_FAILURE); } //fifo_reset(1); clock_gettime(CLOCK_REALTIME, &cpu_time); start_time = cpu_time.tv_nsec ; fifo_reset(1); fifo_read(1, image_buffer, IMAGE_WIDTH*IMAGE_HEIGHT*3); clock_gettime(CLOCK_REALTIME, &cpu_time); end_time = cpu_time.tv_nsec ; diff_time = end_time - start_time ; diff_time = diff_time/1000000000 ; printf("transffered %d bytes in %f s : %f B/s \n", (IMAGE_WIDTH * IMAGE_HEIGHT*3), diff_time, (IMAGE_WIDTH * IMAGE_HEIGHT*3)/diff_time); start_buffer = image_buffer ; end_ptr = &image_buffer[IMAGE_WIDTH*IMAGE_HEIGHT*3]; vsync1 = *((unsigned short *) start_buffer) ; vsync2 = *((unsigned short *) &start_buffer[(IMAGE_WIDTH*IMAGE_HEIGHT)+2]) ; while(vsync1 != 0x55AA && vsync2 != 0x55AA && start_buffer < end_ptr){ start_buffer+=2 ; vsync1 = *((unsigned short *) start_buffer) ; vsync2 = *((unsigned short *) &start_buffer[(IMAGE_WIDTH*IMAGE_HEIGHT)+2]) ; //printf("vsync2 : %x \n", vsync2); } if(vsync1 == 0x55AA && vsync2 == 0x55AA){ inc ++ ; printf("frame found !\n"); }else{ //fclose(yuv_fd); //continue ; start_buffer = image_buffer ; inc ++ ; } start_buffer += 2 ; printf("frame captures \n"); write_jpegfile(start_buffer, IMAGE_WIDTH, IMAGE_HEIGHT, 1, yuv_fd, 100); fclose(yuv_fd); } fifo_close(1); return 0 ; }
int grab_frame(void){ unsigned short cmd_buffer[8] ; unsigned short vsync1, vsync2 ; FILE * yuv_fd, * jpeg_fd ; int i,j, res, inc ; unsigned int nbFrames = 1 ; unsigned int pos = 0 ; unsigned int nb = 0 ; unsigned char * image_buffer, * start_buffer, * end_ptr; //yuv frame buffer unsigned char *y_buffer ; unsigned short fifo_state, fifo_data ; unsigned int retry_counter = 0 ; unsigned int retry_pixel = 0 ; image_buffer = (unsigned char *) malloc((IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN*4)/8+32);// 32 are the frame start, frame end indicators y_buffer = (unsigned char *) malloc(IMAGE_WIDTH*IMAGE_HEIGHT); if(image_buffer == NULL || y_buffer == NULL){ printf("allocation error ! \n"); return -1 ; } for(inc = 0 ; inc < (nbFrames && retry_counter < 5) ; ){ sprintf(jpeg_file_name, "./grabbed_frame%04d.jpg", inc); jpeg_fd = fopen(jpeg_file_name, "wb"); if(jpeg_fd == NULL){ printf("Error opening output file \n"); exit(EXIT_FAILURE); } sprintf(yuv_file_name, "./grabbed_frame%04d.yuv", inc); yuv_fd = fopen(yuv_file_name, "wb"); if(yuv_fd == NULL){ printf("Error opening output file \n"); exit(EXIT_FAILURE); } printf("issuing reset to fifo \n"); cmd_buffer[0] = 0 ; cmd_buffer[1] = 0 ; cmd_buffer[2] = 0 ; logi_write((unsigned char *) cmd_buffer, 6, FIFO_ADDR+FIFO_CMD_OFFSET); logi_read((unsigned char *) cmd_buffer, 6, FIFO_ADDR+FIFO_CMD_OFFSET); printf("fifo size : %d, free : %d, available : %d \n", cmd_buffer[0], cmd_buffer[1], cmd_buffer[2]); // reading and printing fifo states nb = 0 ; retry_pixel = 0 ; while(nb < (((IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN)/8)*3)){ logi_read((unsigned char *) cmd_buffer, 6, FIFO_ADDR+FIFO_CMD_OFFSET); while(cmd_buffer[2] < 512){ logi_read((unsigned char *) cmd_buffer, 6, FIFO_ADDR+FIFO_CMD_OFFSET); //printf("%u\n", cmd_buffer[2]); } logi_read(&image_buffer[nb], 1024, FIFO_ADDR); nb += 1024 ; } if(retry_pixel == 10000){ printf("no camera detected !\n"); fclose(jpeg_fd); return -1 ; } printf("nb : %u \n", nb); start_buffer = image_buffer ; end_ptr = &image_buffer[((IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN)/8)*3]; vsync1 = *((unsigned short *) start_buffer) ; vsync2 = *((unsigned short *) &start_buffer[((IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN)/8)+2]) ; while(vsync1 != 0x55AA && vsync2 != 0x55AA && start_buffer < end_ptr){ start_buffer+=2 ; vsync1 = *((unsigned short *) start_buffer) ; vsync2 = *((unsigned short *) &start_buffer[((IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN)/8)+2]) ; } if(vsync1 == 0x55AA && vsync2 == 0x55AA){ inc ++ ; printf("frame found !\n"); }else{ printf("sync not found !\n"); /*fclose(rgb_fd);*/ fclose(yuv_fd); fclose(jpeg_fd); retry_counter ++ ; continue ; } start_buffer += 2 ; bin_to_gray(start_buffer, y_buffer); fwrite(y_buffer, 1, IMAGE_WIDTH*IMAGE_HEIGHT*NB_CHAN, yuv_fd); write_jpegfile(y_buffer, IMAGE_WIDTH, IMAGE_HEIGHT, 1, jpeg_fd, 100); fclose(yuv_fd); fclose(jpeg_fd); } if(retry_counter == 5){ return -1 ; } return 0 ; }
int main(int argc, char ** argv){ int fd; long start_time, end_time ; double diff_time ; struct timespec cpu_time ; FILE * jpeg_fd ; FILE * raw_file ; int i, hsync_count = 0 ; ; unsigned short testVsync = 0 ; unsigned char vsyncFound = 0 ; unsigned char hsyncFound = 0 ; unsigned int pos = 0 ; unsigned char reception_buffer[GRAB_SIZE] ; unsigned char image_buffer[(320*240)] ; //monochrome frame buffer fd = open("/dev/logibone0", O_RDWR | O_SYNC); jpeg_fd = fopen("./grabbed_frame.jpg", "w"); //raw_fd = fopen("./raw_data.txt", "w"); if(fd == -1 || jpeg_fd == NULL){ perror("Error opening file"); printf("error opening /dev/LOGIBONE0 \n"); exit(EXIT_FAILURE); } printf("issuing reset to fifo \n"); //ioctl(fd, LOGIBONE_FIFO_RESET); clock_gettime(CLOCK_REALTIME, &cpu_time); start_time = cpu_time.tv_nsec ; //while(pos < GRAB_SIZE){ i = read(fd, &reception_buffer[pos], GRAB_SIZE); //if(i > 0){ // pos += i; //} //} pos = i ; if(i < 0){ printf("error in grabing \n"); } clock_gettime(CLOCK_REALTIME, &cpu_time); end_time = cpu_time.tv_nsec ; diff_time = end_time - start_time ; diff_time = diff_time/1000000000 ; printf("transffered %d bytes in %f s : %f B/s \n", GRAB_SIZE, diff_time, GRAB_SIZE/diff_time); pos = 0 ; vsyncFound = 0 ; i = 0 ; while(!vsyncFound && i < GRAB_SIZE){ unsigned short * shortVal ; shortVal = (unsigned short *) &reception_buffer[i]; if(*shortVal == 0xAA55){ vsyncFound = 1 ; printf("vsync found ! \n"); memcpy(image_buffer, &reception_buffer[i+2], 320*240 ); } i ++ ; } write_jpegfile(image_buffer, 320, 240, jpeg_fd, 100); close(fd); fclose(jpeg_fd); return 0 ; }