#ifndef _PACKETBUFFER_H
#define _PACKETBUFFER_H

#include <pthread.h>

typedef struct packetbuffer      packetbuffer_t;

typedef struct packetbufferitem  packetbufferitem_t;
typedef struct packetbufferstate packetbufferstate_t;

struct packetbufferitem
{
  char *packet;    // the packet itself
  int  packetlen;
  long seqno;      // which packet is this? (<0 if invalid)
};

struct packetbuffer
{
  long nextseqno;

  int                maxbuffersize;

  int                maxitems; // how many packets to buffer?
  int                nextitem; // what is the index in our circular buffer?
  packetbufferitem_t *item;    // our circular buffer

  pthread_mutex_t    mutex;
  pthread_cond_t     cond;
};

// what were theses values the last time we asked for data?
struct packetbufferstate
{
  int                nextitem;
  long               nextseqno;
};

packetbuffer_t *packetbuffer_create(int maxitems, int buffersize);
packetbufferstate_t *packetbuffer_createstate(packetbuffer_t *pb);
void packetbuffer_deletestate(packetbuffer_t *pb, packetbufferstate_t *pbs);
void packetbuffer_addpacket(packetbuffer_t *pb, void *buf, int packetlen);
void packetbuffer_getpacket(packetbuffer_t *pb, packetbufferstate_t *pbs, void *buf, int *packetlen);

#endif
