int DemuxOpen( vlc_object_t *obj ) { demux_t *demux = (demux_t *)obj; demux_sys_t *sys = malloc (sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; demux->p_sys = sys; ParseMRL( obj, demux->psz_location ); char *path = var_InheritString (obj, CFG_PREFIX"dev"); if (unlikely(path == NULL)) goto error; /* probably OOM */ msg_Dbg (obj, "opening device '%s'", path); int rawfd = vlc_open (path, O_RDWR); if (rawfd == -1) { msg_Err (obj, "cannot open device '%s': %m", path); free (path); goto error; } free (path); int fd = v4l2_fd_open (rawfd, 0); if (fd == -1) { msg_Warn (obj, "cannot initialize user-space library: %m"); /* fallback to direct kernel mode anyway */ fd = rawfd; } sys->fd = fd; if (InitVideo (demux, fd)) { v4l2_close (fd); goto error; } sys->controls = ControlsInit (VLC_OBJECT(demux), fd); demux->pf_demux = NULL; demux->pf_control = DemuxControl; demux->info.i_update = 0; demux->info.i_title = 0; demux->info.i_seekpoint = 0; return VLC_SUCCESS; error: free (sys); return VLC_EGENERIC; }
int DemuxOpen( vlc_object_t *obj ) { demux_t *demux = (demux_t *)obj; demux_sys_t *sys = malloc (sizeof (*sys)); if (unlikely(sys == NULL)) return VLC_ENOMEM; demux->p_sys = sys; #ifdef ZVBI_COMPILED sys->vbi = NULL; #endif ParseMRL( obj, demux->psz_location ); char *path = var_InheritString (obj, CFG_PREFIX"dev"); if (unlikely(path == NULL)) goto error; /* probably OOM */ uint32_t caps; int fd = OpenDevice (obj, path, &caps); free (path); if (fd == -1) goto error; sys->fd = fd; if (InitVideo (demux, fd, caps)) { v4l2_close (fd); goto error; } sys->controls = ControlsInit (VLC_OBJECT(demux), fd); sys->start = mdate (); demux->pf_demux = NULL; demux->pf_control = DemuxControl; demux->info.i_update = 0; demux->info.i_title = 0; demux->info.i_seekpoint = 0; return VLC_SUCCESS; error: free (sys); return VLC_EGENERIC; }
int AccessOpen( vlc_object_t *obj ) { access_t *access = (access_t *)obj; access_InitFields( access ); access_sys_t *sys = calloc (1, sizeof (*sys)); if( unlikely(sys == NULL) ) return VLC_ENOMEM; access->p_sys = sys; ParseMRL( obj, access->psz_location ); char *path = var_InheritString (obj, CFG_PREFIX"dev"); if (unlikely(path == NULL)) goto error; /* probably OOM */ uint32_t caps; int fd = OpenDevice (obj, path, &caps); free (path); if (fd == -1) goto error; sys->fd = fd; if (InitVideo (access, fd, caps)) { v4l2_close (fd); goto error; } sys->controls = ControlsInit (VLC_OBJECT(access), fd); access->pf_seek = NULL; access->pf_control = AccessControl; return VLC_SUCCESS; error: free (sys); return VLC_EGENERIC; }
int InitVideo (access_t *access, int fd, uint32_t caps) { access_sys_t *sys = access->p_sys; if (!(caps & V4L2_CAP_VIDEO_CAPTURE)) { msg_Err (access, "not a video capture device"); return -1; } if (SetupInput (VLC_OBJECT(access), fd)) return -1; sys->controls = ControlsInit (VLC_OBJECT(access), fd); /* Try and find default resolution if not specified */ struct v4l2_format fmt = { .type = V4L2_BUF_TYPE_VIDEO_CAPTURE }; if (v4l2_ioctl (fd, VIDIOC_G_FMT, &fmt) < 0) { msg_Err (access, "cannot get default format: %m"); return -1; } /* Print extra info */ msg_Dbg (access, "%d bytes maximum for complete image", fmt.fmt.pix.sizeimage ); /* Check interlacing */ switch (fmt.fmt.pix.field) { case V4L2_FIELD_INTERLACED: msg_Dbg (access, "Interlacing setting: interleaved"); /*if (NTSC) sys->block_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST; else*/ sys->block_flags = BLOCK_FLAG_TOP_FIELD_FIRST; break; case V4L2_FIELD_INTERLACED_TB: msg_Dbg (access, "Interlacing setting: interleaved top bottom" ); sys->block_flags = BLOCK_FLAG_TOP_FIELD_FIRST; break; case V4L2_FIELD_INTERLACED_BT: msg_Dbg (access, "Interlacing setting: interleaved bottom top" ); sys->block_flags = BLOCK_FLAG_BOTTOM_FIELD_FIRST; break; default: break; } /* Init I/O method */ if (caps & V4L2_CAP_STREAMING) { sys->bufc = 4; sys->bufv = StartMmap (VLC_OBJECT(access), fd, &sys->bufc); if (sys->bufv == NULL) return -1; access->pf_block = AccessRead; } else if (caps & V4L2_CAP_READWRITE) { sys->blocksize = fmt.fmt.pix.sizeimage; sys->bufv = NULL; access->pf_read = AccessReadStream; } else { msg_Err (access, "no supported I/O method"); return -1; } return 0; }