#include "buffer.hh" #include /****************************************************************** * 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; }