| #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; |
| } |