static int Demux( demux_t *demux ) { demux_sys_t *sys = demux->p_sys; struct pollfd ufd; ufd.fd = sys->i_fd; ufd.events = POLLIN|POLLPRI; /* Wait for data */ /* FIXME: remove timeout */ while( poll( &ufd, 1, 500 ) == -1 ) if( errno != EINTR ) { msg_Err( demux, "poll error: %m" ); return -1; } if( ufd.revents == 0 ) return 1; block_t *block; if( sys->io == IO_METHOD_READ ) block = BlockRead( VLC_OBJECT(demux), ufd.fd, sys->blocksize ); else block = GrabVideo( VLC_OBJECT(demux), sys ); if( block == NULL ) return 1; block->i_pts = block->i_dts = mdate(); block->i_flags |= sys->i_block_flags; es_out_Control( demux->out, ES_OUT_SET_PCR, block->i_pts ); es_out_Send( demux->out, sys->p_es, block ); return 1; }
static int Demux( demux_t *p_demux ) { demux_sys_t *p_sys = p_demux->p_sys; block_t *p_blocka = NULL; block_t *p_blockv = NULL; /* Try grabbing audio frames first */ if( p_sys->fd_audio >= 0 ) p_blocka = GrabAudio( p_demux ); /* Try grabbing video frame */ p_blockv = GrabVideo( p_demux ); if( !p_blocka && !p_blockv ) { /* Sleep so we do not consume all the cpu, 10ms seems * like a good value (100fps) */ msleep( 10000 ); return 1; } if( p_blocka ) { es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_blocka->i_pts ); es_out_Send( p_demux->out, p_sys->p_es_audio, p_blocka ); } if( p_blockv ) { es_out_Control( p_demux->out, ES_OUT_SET_PCR, p_blockv->i_pts ); es_out_Send( p_demux->out, p_sys->p_es_video, p_blockv ); } return 1; }
static block_t *MMapBlock (access_t *access) { access_sys_t *sys = access->p_sys; if (AccessPoll (access)) return NULL; block_t *block = GrabVideo (VLC_OBJECT(access), sys->fd, sys->bufv); if( block != NULL ) { block->i_pts = block->i_dts = mdate(); block->i_flags |= sys->block_flags; } return block; }
static block_t *AccessRead( access_t *access ) { demux_sys_t *sys = (demux_sys_t *)access->p_sys; struct pollfd fd; fd.fd = sys->i_fd; fd.events = POLLIN|POLLPRI; fd.revents = 0; /* Wait for data */ /* FIXME: kill timeout */ if( poll( &fd, 1, 500 ) <= 0 ) return NULL; block_t *block = GrabVideo( VLC_OBJECT(access), sys ); if( block != NULL ) { block->i_pts = block->i_dts = mdate(); block->i_flags |= sys->i_block_flags; } return block; }