void AccessClose( vlc_object_t *obj ) { access_t *access = (access_t *)obj; demux_sys_t *sys = (demux_sys_t *)access->p_sys; ControlsDeinit( obj, sys->controls ); v4l2_close( sys->i_fd ); free( sys ); }
void AccessClose( vlc_object_t *obj ) { access_t *access = (access_t *)obj; access_sys_t *sys = access->p_sys; if (sys->bufv != NULL) StopMmap (sys->fd, sys->bufv, sys->bufc); ControlsDeinit( obj, sys->controls ); v4l2_close (sys->fd); free( sys ); }
void DemuxClose( vlc_object_t *obj ) { demux_t *demux = (demux_t *)obj; demux_sys_t *sys = demux->p_sys; int fd = sys->i_fd; /* Stop video capture */ switch( sys->io ) { case IO_METHOD_READ: /* Nothing to do */ break; case IO_METHOD_MMAP: case IO_METHOD_USERPTR: { /* NOTE: Some buggy drivers hang if buffers are not unmapped before * streamoff */ for( unsigned i = 0; i < sys->i_nbuffers; i++ ) { struct v4l2_buffer buf = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE, .memory = ( sys->io == IO_METHOD_USERPTR ) ? V4L2_MEMORY_USERPTR : V4L2_MEMORY_MMAP, }; v4l2_ioctl( fd, VIDIOC_DQBUF, &buf ); } enum v4l2_buf_type buf_type = V4L2_BUF_TYPE_VIDEO_CAPTURE; v4l2_ioctl( sys->i_fd, VIDIOC_STREAMOFF, &buf_type ); break; } } /* Free Video Buffers */ if( sys->p_buffers ) { switch( sys->io ) { case IO_METHOD_READ: free( sys->p_buffers[0].start ); break; case IO_METHOD_MMAP: for( unsigned i = 0; i < sys->i_nbuffers; ++i ) v4l2_munmap( sys->p_buffers[i].start, sys->p_buffers[i].length ); break; case IO_METHOD_USERPTR: for( unsigned i = 0; i < sys->i_nbuffers; ++i ) free( sys->p_buffers[i].start ); break; } free( sys->p_buffers ); } ControlsDeinit( obj, sys->controls ); v4l2_close( fd ); free( sys ); } static int DemuxControl( demux_t *demux, int query, va_list args ) { switch( query ) { /* Special for access_demux */ case DEMUX_CAN_PAUSE: case DEMUX_CAN_SEEK: case DEMUX_CAN_CONTROL_PACE: *va_arg( args, bool * ) = false; return VLC_SUCCESS; case DEMUX_GET_PTS_DELAY: *va_arg(args,int64_t *) = INT64_C(1000) * var_InheritInteger( demux, "live-caching" ); return VLC_SUCCESS; case DEMUX_GET_TIME: *va_arg( args, int64_t * ) = mdate(); return VLC_SUCCESS; /* TODO implement others */ default: return VLC_EGENERIC; } return VLC_EGENERIC; } /** Gets a frame in read/write mode */ static block_t *BlockRead( vlc_object_t *obj, int fd, size_t size ) { block_t *block = block_Alloc( size ); if( unlikely(block == NULL) ) return NULL; ssize_t val = v4l2_read( fd, block->p_buffer, size ); if( val == -1 ) { block_Release( block ); switch( errno ) { case EAGAIN: return NULL; case EIO: /* could be ignored per specification */ /* fall through */ default: msg_Err( obj, "cannot read frame: %m" ); return NULL; } } block->i_buffer = val; return block; }