mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-24 09:10:36 +00:00
119 lines
2.6 KiB
C++
119 lines
2.6 KiB
C++
|
#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;
|
||
|
}
|