static GstFlowReturn gst_vbisrc_create(GstPushSrc *psrc, GstBuffer **buf) { Gstvbisrc *vbisrc = GST_VBISRC_CAST(psrc); GstFlowReturn ret; GstMapInfo info; fd_set rd; int res; struct timeval timeout; int vbi_fd=vbi_capture_fd(vbisrc->pVbiCapt); vbi_capture_buffer *pVbiBuf; vbi_sliced *pVbiData; GstBuffer *outbuf; uint lineCount; uint line; FD_ZERO(&rd); FD_SET(vbi_fd,&rd); select(vbi_fd +1 ,&rd , NULL, NULL, NULL); if (FD_ISSET(vbi_fd,&rd)) { timeout.tv_sec = 0; timeout.tv_usec = 1000; res = vbi_capture_pull_sliced(vbisrc->pVbiCapt,&pVbiBuf,&timeout); if (res>0 && pVbiBuf !=NULL) { lineCount = ((unsigned int)pVbiBuf->size)/sizeof(vbi_sliced); pVbiData = pVbiBuf->data; GST_LOG_OBJECT(vbisrc,"Having %d lines in buffer",lineCount); for (line=0; line<lineCount; line++ ) { if((pVbiData[line].id & (VBI_SLICED_TELETEXT_B))!=0) { GST_LOG_OBJECT(vbisrc,"SLICED_TELETEXT found in line %d",pVbiData[line].line); } } ret=GST_BASE_SRC_CLASS(parent_class) -> alloc (GST_BASE_SRC_CAST(vbisrc), -1,pVbiBuf->size,&outbuf); gst_buffer_map(outbuf,&info,GST_MAP_WRITE); memcpy(info.data,(guint8*)pVbiBuf->data,pVbiBuf->size); gst_buffer_unmap(outbuf,&info); *buf=GST_BUFFER_CAST(outbuf); GST_LOG_OBJECT (vbisrc,"Buffer pushed with size: %d", pVbiBuf->size); return ret; } } return GST_FLOW_ERROR; }
int GetFdVBI (vlc_v4l2_vbi_t *vbi) { return vbi_capture_fd(vbi->cap); }
void CloseVBI (vlc_v4l2_vbi_t *vbi) { close (vbi_capture_fd (vbi->cap)); vbi_capture_delete (vbi->cap); free (vbi); }