コード例 #1
0
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 ;
}
コード例 #2
0
ファイル: grab.c プロジェクト: Volcano95/logi-projects
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 ;
}
コード例 #3
0
ファイル: grab_frame.c プロジェクト: AshirogiMaxx/fpga-cam
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 ;
}