コード例 #1
0
ファイル: dobj_util.c プロジェクト: jbmulligan/quip
int auto_shape_flags(Shape_Info *shpp)
{
	return set_shape_flags(shpp,AUTO_SHAPE);
}
コード例 #2
0
ファイル: ezstream.c プロジェクト: E-LLP/QuIP
void v4l2_stream_record(QSP_ARG_DECL  Image_File *ifp,long n_frames,int n_cameras, Video_Device **vd_tbl)
{
#ifdef HAVE_RAWVOL
	int fd_arr[MAX_DISKS];
	int ndisks, which_disk;
	uint32_t blocks_per_frame;
	Shape_Info shp1;
	Shape_Info *shpp=(&shp1);
	RV_Inode *inp;
	struct v4l2_buffer *bufp;
	int i;

	if( record_state != NOT_RECORDING ){
		sprintf(ERROR_STRING,
	"v4l2_stream_record:  can't record file %s until previous record completes",
			ifp->if_name);
		WARN(ERROR_STRING);
		return;
	}

/* grabber dependent? */
	blocks_per_frame = get_blocks_per_frame();

	n_to_write = blocks_per_frame * BLOCK_SIZE;
//n_to_write>>=2;		/* write quarter for testing */


	if( FT_CODE(IF_TYPE(ifp)) != IFT_RV ){
		sprintf(ERROR_STRING,
	"stream record:  image file %s (type %s) should be type %s",
			ifp->if_name,
			FT_NAME(IF_TYPE(ifp)),
			FT_NAME(FILETYPE_FOR_CODE(IFT_RV)) );
		WARN(ERROR_STRING);
		return;
	}


	inp = (RV_Inode *) ifp->if_hdr_p;
	ndisks = queue_rv_file(QSP_ARG  inp,fd_arr);

#ifdef CAUTIOUS
	if( ndisks < 1 ){
		sprintf(ERROR_STRING,
			"Bad number (%d) of raw volume disks",ndisks);
		WARN(ERROR_STRING);
		return;
	}
#endif /* CAUTIOUS */


	/* meteor_get_geometry(&_geo); */
	SET_SHP_FLAGS(shpp, 0);
	SET_SHP_ROWS(shpp, 480);	/* BUG don't hard code */
	SET_SHP_COLS(shpp, 640); /* BUG don't hard code */
	/* should get bytes per pixel from _geo... */
	SET_SHP_COMPS(shpp,  DEFAULT_BYTES_PER_PIXEL);
	SET_SHP_FRAMES(shpp, n_frames);
	SET_SHP_SEQS(shpp, 1);
	SET_SHP_PREC_PTR(shpp, PREC_FOR_CODE(PREC_UBY) );
	set_shape_flags(shpp,NO_OBJ,AUTO_SHAPE);

	rv_set_shape(QSP_ARG  ifp->if_name,shpp);


	/* We write an entire frame to each disk in turn... */

#ifdef RECORD_TIMESTAMPS
	if( stamping ) init_stamps(n_frames);
#endif /* RECORD_TIMESTAMPS */

	record_state = RECORDING;

	/* stuff from video_reader */

	for(i=0;i<n_cameras;i++)
		start_capturing(QSP_ARG  vd_tbl[i]);

	n_so_far = 0;
	which_disk=0;

	bufp=next_frame(QSP_ARG  n_cameras,vd_tbl);
	while( bufp != NULL ){
		int n_written;

		/* write the frame to disk */
if( really_writing ){
		if( (n_written = write(fd_arr[which_disk],vd_tbl[which_device]->vd_buf_tbl[ bufp->index ].mb_start,n_to_write))
			!= n_to_write ){
			sprintf(ERROR_STRING,"write (frm %ld, fd=%d)",n_so_far,ifp->if_fd);
			perror(ERROR_STRING);
			sprintf(ERROR_STRING,
				"%ld requested, %d written",
				n_to_write,n_written);
			WARN(ERROR_STRING);
			return;
		}

		which_disk = (which_disk+1) % ndisks;
}
		n_so_far++;

		/* QBUG releases this buffer to be used again */
		if( xioctl(vd_tbl[which_device]->vd_fd, VIDIOC_QBUF, bufp) < 0 )
			ERRNO_WARN ("v4l2_stream_record:  error queueing frame");

		if( n_so_far >= n_frames )
			bufp = NULL;
		else
			bufp=next_frame(QSP_ARG  n_cameras,vd_tbl);
	}
	if( bufp != NULL ){
		if( xioctl(vd_tbl[which_device]->vd_fd, VIDIOC_QBUF, bufp) < 0 )
			ERRNO_WARN ("v4l2_stream_record:  error queueing frame");
	}

	for(i=0;i<n_cameras;i++)
		stop_capturing(QSP_ARG  vd_tbl[i]);

	rv_sync(SINGLE_QSP_ARG);

	/* we used to disable real-time scheduling here, but
	 * when video_reader executes as a separate thread there
	 * is no point, because it won't affect the main process!
	 */

	recording_in_process = 0;
	record_state=NOT_RECORDING;

#ifdef RECORD_TIMESTAMPS
	n_stored_times = n_so_far;
#endif

#ifdef CAUTIOUS
	if( ifp == NO_IMAGE_FILE ){
		WARN("CAUTIOUS:  v4l2_stream_record:  ifp is NULL!?");
		return;
	}
#endif /* CAUTIOUS */

	v4l2_finish_recording( QSP_ARG  ifp );

	/* Because the disk writers don't use the fileio library,
	 * the ifp doesn't know how many frames have been written.
	 */

	ifp->if_nfrms = n_frames;	/* BUG? is this really what happened? */
#else // ! HAVE_RAWVOL
	WARN("v4l2_stream_record:  Program not compiled with raw volume support, can't record!?");
#endif // ! HAVE_RAWVOL
} /* end v4l2_stream_record */