/* unvideoport.c - simulated infinite-bandwidth uncompressed video */ #include "videoport.h" /* buffer management calls ----------------------------------------------- */ #define SPEW(x) x /* see the comment in struct _videoport in videoport.h * for info on these calls */ void _videoport_open(videoport me) { int i; me->nlocs = -1; me->q = NULL; me->vhead = -1; me->uhead = -1; me->tail = -1; me->expected_fmsc = -1; me->maxbuffered = -1; } void _videoport_close(videoport me) { } int videoport_max_VL_buffers_used(videoport me) { return 1; } int videoport_available_field_count(videoport me) { /* always available ! */ return INT_MAX; } videofield *videoport_get_one_field(videoport me) { /* suuuure, no problem ! */ return &me->bogusfield; } void videoport_put_one_field(videoport me, videofield *field) { /* uh huh yeah I can do that */ } /* other API calls ---------------------------------------------------- */ videoport videoport_open(int direction, int buf_fields, int flags) { videoport me = malloc(sizeof(struct _videoport)); if (!me) { setoserror(VIDEOPORT_MALLOC_FAILED); return NULL; } me->buf_fields = buf_fields; me->direction = direction; me->svr = NULL; me->src = NULL; me->drn = NULL; me->path = NULL; me->vid = NULL; me->mem = NULL; me->bytes_per_pixel = 2; me->xsize = 720; me->ysize = 243; printf("\"video\" field size is %dx%d\n", me->xsize, me->ysize); me->ust_per_msc = 1.E9 * 1001.0/60000.0; me->vl_xfrsize = me->xsize*me->ysize*me->bytes_per_pixel; me->max_valid_bytes_per_field = roundup(me->vl_xfrsize, getpagesize()); printf("\"video\" max valid bytes per field is %d\n", me->max_valid_bytes_per_field); me->buffer = NULL; me->bogusfield.ust = -1; me->bogusfield.msc = -1; me->bogusfield.fieldtype = -1; me->bogusfield.info = NULL; me->bogusfield.idx = -1; me->bogusfield.pixels = memalign(getpagesize(), me->max_valid_bytes_per_field); if (!me->bogusfield.pixels) { setoserror(VIDEOPORT_MALLOC_FAILED); free(me); return NULL; } if (mpin(me->bogusfield.pixels, me->max_valid_bytes_per_field) < 0) printf("\"video\" mpin failed\n"); if (flags & VIDEOPORT_ADVISE_NOACCESS) { if (cachectl(me->bogusfield.pixels, me->max_valid_bytes_per_field, UNCACHEABLE) < 0) printf("\"video\" cachectl failed\n"); } me->event_fd = -1; me->buffer_fd = -1; me->current_field_type = -1; _videoport_open(me); return me; } void videoport_close(videoport me) { free(me->bogusfield.pixels); free(me); } void videoport_setfillpoint(videoport me, int fillpoint) { me->fillpoint = fillpoint; } void videoport_setfdset(videoport me, fd_set *readset, fd_set *writeset, fd_set *exceptset, stamp_t *wakeust) { /* unblock immediately! */ *wakeust = 0; } void videoport_checkfdset(videoport me, fd_set *readset, fd_set *writeset, fd_set *exceptset) { } void videoport_wait_for_space_or_data(videoport me) { /* data always available ! */ }