Fixed the queue length (fixed length 5 for now). fixed mpeg1 video rate control.

Original commit message from CVS:
Fixed the queue length (fixed length 5 for now).
fixed mpeg1 video rate control.
AlienSong segfaults sometimes. My other movies don't....
This commit is contained in:
Wim Taymans 2000-02-13 13:43:32 +00:00
parent d224516279
commit f3f3a99f1e
4 changed files with 82 additions and 22 deletions

View file

@ -100,12 +100,16 @@ static void gst_queue_init(GstQueue *queue) {
queue->queue = NULL; queue->queue = NULL;
queue->tail = NULL; queue->tail = NULL;
queue->level_buffers = 0; queue->level_buffers = 0;
queue->max_buffers = 5;
queue->level_bytes = 0; queue->level_bytes = 0;
queue->size_buffers = 0; queue->size_buffers = 0;
queue->size_bytes = 0; queue->size_bytes = 0;
queue->waiterlock = g_mutex_new(); queue->emptylock = g_mutex_new();
queue->waitercond = g_cond_new(); queue->emptycond = g_cond_new();
queue->fulllock = g_mutex_new();
queue->fullcond = g_cond_new();
} }
GstElement *gst_queue_new(gchar *name) { GstElement *gst_queue_new(gchar *name) {
@ -125,8 +129,21 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) {
queue = GST_QUEUE(pad->parent); queue = GST_QUEUE(pad->parent);
/* we have to lock the queue since we span threads */ /* we have to lock the queue since we span threads */
GST_LOCK(queue); GST_LOCK(queue);
if (queue->level_buffers >= queue->max_buffers) {
GST_UNLOCK(queue);
while (queue->level_buffers >= queue->max_buffers) {
g_mutex_lock(queue->fulllock);
// g_print("0");
g_cond_wait(queue->fullcond,queue->fulllock);
g_mutex_unlock(queue->fulllock);
}
GST_LOCK(queue);
}
/* put the buffer on the head of the list */ /* put the buffer on the head of the list */
/* if the queue is NULL, start a new list and make this the tail */ /* if the queue is NULL, start a new list and make this the tail */
if (!queue->queue) { if (!queue->queue) {
@ -147,9 +164,9 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) {
GST_UNLOCK(queue); GST_UNLOCK(queue);
if (tosignal) { if (tosignal) {
g_mutex_lock(queue->waiterlock); g_mutex_lock(queue->emptylock);
g_cond_signal(queue->waitercond); g_cond_signal(queue->emptycond);
g_mutex_unlock(queue->waiterlock); g_mutex_unlock(queue->emptylock);
// g_print(">"); // g_print(">");
} }
} }
@ -158,6 +175,7 @@ void gst_queue_push(GstConnection *connection) {
GstQueue *queue = GST_QUEUE(connection); GstQueue *queue = GST_QUEUE(connection);
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
GList *front; GList *front;
gboolean tosignal = FALSE;
/* have to lock for thread-safety */ /* have to lock for thread-safety */
GST_LOCK(queue); GST_LOCK(queue);
@ -165,10 +183,10 @@ void gst_queue_push(GstConnection *connection) {
if (!queue->level_buffers) { if (!queue->level_buffers) {
GST_UNLOCK(queue); GST_UNLOCK(queue);
while (!queue->level_buffers) { while (!queue->level_buffers) {
g_mutex_lock(queue->waiterlock); g_mutex_lock(queue->emptylock);
// g_print("0"); // g_print("0");
g_cond_wait(queue->waitercond,queue->waiterlock); g_cond_wait(queue->emptycond,queue->emptylock);
g_mutex_unlock(queue->waiterlock); g_mutex_unlock(queue->emptylock);
} }
GST_LOCK(queue); GST_LOCK(queue);
} }
@ -180,8 +198,17 @@ void gst_queue_push(GstConnection *connection) {
queue->level_buffers--; queue->level_buffers--;
// g_print("-"); // g_print("-");
/* unlock now */ tosignal = queue->level_buffers < queue->max_buffers;
GST_UNLOCK(queue); GST_UNLOCK(queue);
if (tosignal) {
g_mutex_lock(queue->fulllock);
g_cond_signal(queue->fullcond);
g_mutex_unlock(queue->fulllock);
}
/* unlock now */
} }

View file

@ -59,12 +59,15 @@ struct _GstQueue {
GList *tail; /* have to keep track of this myself */ GList *tail; /* have to keep track of this myself */
gint level_buffers; /* number of buffers queued here */ gint level_buffers; /* number of buffers queued here */
gint max_buffers; /* maximum number of buffers queued here */
gint level_bytes; /* number of bytes queued here */ gint level_bytes; /* number of bytes queued here */
gint size_buffers; /* size of queue in buffers */ gint size_buffers; /* size of queue in buffers */
gint size_bytes; /* size of queue in bytes */ gint size_bytes; /* size of queue in bytes */
GMutex *waiterlock; /* used when the queue is empty */ GMutex *emptylock; /* used when the queue is empty */
GCond *waitercond; GCond *emptycond;
GMutex *fulllock; /* used when the queue is full */
GCond *fullcond;
}; };
struct _GstQueueClass { struct _GstQueueClass {

View file

@ -100,12 +100,16 @@ static void gst_queue_init(GstQueue *queue) {
queue->queue = NULL; queue->queue = NULL;
queue->tail = NULL; queue->tail = NULL;
queue->level_buffers = 0; queue->level_buffers = 0;
queue->max_buffers = 5;
queue->level_bytes = 0; queue->level_bytes = 0;
queue->size_buffers = 0; queue->size_buffers = 0;
queue->size_bytes = 0; queue->size_bytes = 0;
queue->waiterlock = g_mutex_new(); queue->emptylock = g_mutex_new();
queue->waitercond = g_cond_new(); queue->emptycond = g_cond_new();
queue->fulllock = g_mutex_new();
queue->fullcond = g_cond_new();
} }
GstElement *gst_queue_new(gchar *name) { GstElement *gst_queue_new(gchar *name) {
@ -125,8 +129,21 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) {
queue = GST_QUEUE(pad->parent); queue = GST_QUEUE(pad->parent);
/* we have to lock the queue since we span threads */ /* we have to lock the queue since we span threads */
GST_LOCK(queue); GST_LOCK(queue);
if (queue->level_buffers >= queue->max_buffers) {
GST_UNLOCK(queue);
while (queue->level_buffers >= queue->max_buffers) {
g_mutex_lock(queue->fulllock);
// g_print("0");
g_cond_wait(queue->fullcond,queue->fulllock);
g_mutex_unlock(queue->fulllock);
}
GST_LOCK(queue);
}
/* put the buffer on the head of the list */ /* put the buffer on the head of the list */
/* if the queue is NULL, start a new list and make this the tail */ /* if the queue is NULL, start a new list and make this the tail */
if (!queue->queue) { if (!queue->queue) {
@ -147,9 +164,9 @@ void gst_queue_chain(GstPad *pad,GstBuffer *buf) {
GST_UNLOCK(queue); GST_UNLOCK(queue);
if (tosignal) { if (tosignal) {
g_mutex_lock(queue->waiterlock); g_mutex_lock(queue->emptylock);
g_cond_signal(queue->waitercond); g_cond_signal(queue->emptycond);
g_mutex_unlock(queue->waiterlock); g_mutex_unlock(queue->emptylock);
// g_print(">"); // g_print(">");
} }
} }
@ -158,6 +175,7 @@ void gst_queue_push(GstConnection *connection) {
GstQueue *queue = GST_QUEUE(connection); GstQueue *queue = GST_QUEUE(connection);
GstBuffer *buf = NULL; GstBuffer *buf = NULL;
GList *front; GList *front;
gboolean tosignal = FALSE;
/* have to lock for thread-safety */ /* have to lock for thread-safety */
GST_LOCK(queue); GST_LOCK(queue);
@ -165,10 +183,10 @@ void gst_queue_push(GstConnection *connection) {
if (!queue->level_buffers) { if (!queue->level_buffers) {
GST_UNLOCK(queue); GST_UNLOCK(queue);
while (!queue->level_buffers) { while (!queue->level_buffers) {
g_mutex_lock(queue->waiterlock); g_mutex_lock(queue->emptylock);
// g_print("0"); // g_print("0");
g_cond_wait(queue->waitercond,queue->waiterlock); g_cond_wait(queue->emptycond,queue->emptylock);
g_mutex_unlock(queue->waiterlock); g_mutex_unlock(queue->emptylock);
} }
GST_LOCK(queue); GST_LOCK(queue);
} }
@ -180,8 +198,17 @@ void gst_queue_push(GstConnection *connection) {
queue->level_buffers--; queue->level_buffers--;
// g_print("-"); // g_print("-");
/* unlock now */ tosignal = queue->level_buffers < queue->max_buffers;
GST_UNLOCK(queue); GST_UNLOCK(queue);
if (tosignal) {
g_mutex_lock(queue->fulllock);
g_cond_signal(queue->fullcond);
g_mutex_unlock(queue->fulllock);
}
/* unlock now */
} }

View file

@ -59,12 +59,15 @@ struct _GstQueue {
GList *tail; /* have to keep track of this myself */ GList *tail; /* have to keep track of this myself */
gint level_buffers; /* number of buffers queued here */ gint level_buffers; /* number of buffers queued here */
gint max_buffers; /* maximum number of buffers queued here */
gint level_bytes; /* number of bytes queued here */ gint level_bytes; /* number of bytes queued here */
gint size_buffers; /* size of queue in buffers */ gint size_buffers; /* size of queue in buffers */
gint size_bytes; /* size of queue in bytes */ gint size_bytes; /* size of queue in bytes */
GMutex *waiterlock; /* used when the queue is empty */ GMutex *emptylock; /* used when the queue is empty */
GCond *waitercond; GCond *emptycond;
GMutex *fulllock; /* used when the queue is full */
GCond *fullcond;
}; };
struct _GstQueueClass { struct _GstQueueClass {