diff options
Diffstat (limited to 'gst-libs/ext/mplex/buffer.cc')
-rw-r--r-- | gst-libs/ext/mplex/buffer.cc | 118 |
1 files changed, 118 insertions, 0 deletions
diff --git a/gst-libs/ext/mplex/buffer.cc b/gst-libs/ext/mplex/buffer.cc new file mode 100644 index 00000000..2b291802 --- /dev/null +++ b/gst-libs/ext/mplex/buffer.cc @@ -0,0 +1,118 @@ +#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; +} |