/*
   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 ! */
}

