#ifdef HAVE_CONFIG_H
#include "config.h"
#endif

#include "buffer.hh"
#include <stdlib.h>

/******************************************************************
 *	Remove entries from FIFO buffer list, if their DTS is less than
 *	actual SCR. These packet data have been already decoded and have
 *	been removed from the system target decoder's elementary stream
 *	buffer.
 *****************************************************************/

void
BufferModel::Cleaned (clockticks SCR)
{
  BufferQueue *pointer;

  while ((first != NULL) && first->DTS < SCR) {
    pointer = first;
    first = first->next;
    delete pointer;
  }
}

/******************************************************************
 * Return the SCR when there will next be some change in the
 * buffer.
 * If the buffer is empty return a zero timestamp.
 *****************************************************************/

clockticks
BufferModel::NextChange ()
{
  if (first == NULL)
    return static_cast < clockticks > (0);
  else
    return first->DTS;
}


/******************************************************************
 *
 *	Remove all entries from FIFO buffer list, if their DTS is less
 *	than actual SCR. These packet data have been already decoded and
 *	have been removed from the system target decoder's elementary
 *	stream buffer.
 *****************************************************************/

void
BufferModel::Flushed ()
{
  BufferQueue *pointer;

  while (first != NULL) {
    pointer = first;
    first = first->next;
    delete pointer;
  }
}

/******************************************************************
	BufferModel::Space

	returns free space in the buffer
******************************************************************/

unsigned int
BufferModel::Space ()
{
  unsigned int used_bytes;
  BufferQueue *pointer;

  pointer = first;
  used_bytes = 0;

  while (pointer != NULL) {
    used_bytes += pointer->size;
    pointer = pointer->next;
  }

  return (max_size - used_bytes);

}

/******************************************************************
	Queue_Buffer

	adds entry into the buffer FIFO queue
******************************************************************/

void
BufferModel::Queued (unsigned int bytes, clockticks TS)
{
  BufferQueue *pointer;

  pointer = first;
  if (pointer == NULL) {
    first = new BufferQueue;
    first->size = bytes;
    first->next = NULL;
    first->DTS = TS;
  } else {
    while ((pointer->next) != NULL) {
      pointer = pointer->next;
    }

    pointer->next = (BufferQueue *) malloc (sizeof (BufferQueue));
    pointer->next->size = bytes;
    pointer->next->next = NULL;
    pointer->next->DTS = TS;
  }
}


void
BufferModel::Init (unsigned int size)
{
  max_size = size;
  first = 0;
}
