FRAME* fg_grab_read( FRAMEGRABBER* fg ) { FRAME* fr = frame_new( fg->window.width, fg->window.height, fg->picture.palette ); read( fg->fd, fr->data, frame_get_size( fr ) ); return fr; }
FRAME* frame_new( int width, int height, int format ) { FRAME* fr = malloc( sizeof( FRAME ) ); fr->width = width; fr->height = height; fr->format = format; fr->size = frame_get_size( fr ); fr->data = malloc( fr->size ); return fr; }
FRAME* fg_grab_frame( FRAMEGRABBER* fg, FRAME* fr ) { int capture_frame = fg->cur_frame + 1; //---------------------- // Very first time only //---------------------- if ( fg->mbuf.frames > 1 && fg->cur_frame == -1 ) { fg->cur_frame = 1; // Set up capture parameters fg->mmap.format = fg->picture.palette; fg->mmap.frame = fg->cur_frame; fg->mmap.width = fg->window.width; fg->mmap.height = fg->window.height; // Start capture if ( ioctl( fg->fd, VIDIOCMCAPTURE, &(fg->mmap) ) < 0 ) { perror( "fg_grab(): failed to capture frame" ); return NULL; } } //---------------------------- // Start capturing next frame //---------------------------- // Wrap counter if ( capture_frame >= fg->mbuf.frames ) { capture_frame = 0; } // Set up capture parameters fg->mmap.format = fg->picture.palette; fg->mmap.frame = capture_frame; fg->mmap.width = fg->window.width; fg->mmap.height = fg->window.height; // Start capture if ( ioctl( fg->fd, VIDIOCMCAPTURE, &(fg->mmap) ) < 0 ) { perror( "fg_grab(): failed to capture frame" ); return NULL; } //-------------------- // Save current frame //-------------------- // Wait for end of frame if ( ioctl( fg->fd, VIDIOCSYNC, &(fg->cur_frame) ) < 0 ) { perror( "fg_grab(): failed to sync frame" ); return NULL; } // Save video buffer into our own memory memcpy( fr->data, fg->mb_map + fg->mbuf.offsets[fg->cur_frame], frame_get_size( fr ) ); // Move along to the next one fg->cur_frame = capture_frame; return fr; }