summaryrefslogtreecommitdiffstats
path: root/debian/transcode/transcode-1.1.7/tools/buffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'debian/transcode/transcode-1.1.7/tools/buffer.c')
-rw-r--r--debian/transcode/transcode-1.1.7/tools/buffer.c158
1 files changed, 158 insertions, 0 deletions
diff --git a/debian/transcode/transcode-1.1.7/tools/buffer.c b/debian/transcode/transcode-1.1.7/tools/buffer.c
new file mode 100644
index 00000000..2f513357
--- /dev/null
+++ b/debian/transcode/transcode-1.1.7/tools/buffer.c
@@ -0,0 +1,158 @@
+/*
+ * buffer.c
+ *
+ * Copyright (C) Thomas Oestreich - June 2001
+ *
+ * This file is part of transcode, a video stream processing tool
+ *
+ * transcode is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * transcode is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Make; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include "buffer.h"
+
+#include <stdlib.h>
+#include <unistd.h>
+
+buffer_list_t *buffer_list_head;
+buffer_list_t *buffer_list_tail;
+
+buffer_list_t *buffer_register(int id)
+
+{
+
+ /* objectives:
+ ===========
+
+ register new buffer
+
+ allocate space for new buffer and establish backward reference
+
+
+ */
+
+ buffer_list_t *ptr;
+
+ // retrive a valid pointer from the pool
+
+ if((ptr = malloc(sizeof(buffer_list_t))) == NULL) return(NULL);
+
+ if((ptr->data = (char *) malloc(MAX_PCM_BUFFER)) == NULL) return(NULL);
+
+ ptr->status = BUFFER_EMPTY;
+
+ ptr->next = NULL;
+ ptr->prev = NULL;
+
+ ptr->id = id;
+
+ if(buffer_list_tail != NULL)
+ {
+ buffer_list_tail->next = ptr;
+ ptr->prev = buffer_list_tail;
+ }
+
+ buffer_list_tail = ptr;
+
+ /* first buffer registered must set buffer_list_head */
+
+ if(buffer_list_head == NULL) buffer_list_head = ptr;
+
+ return(ptr);
+
+}
+
+
+/* ------------------------------------------------------------------ */
+
+
+void buffer_remove(buffer_list_t *ptr)
+
+{
+
+ /* objectives:
+ ===========
+
+ remove buffer from chained list
+
+ */
+
+
+ if(ptr == NULL) return; // do nothing if null pointer
+
+ if(ptr->prev != NULL) (ptr->prev)->next = ptr->next;
+ if(ptr->next != NULL) (ptr->next)->prev = ptr->prev;
+
+ if(ptr == buffer_list_tail) buffer_list_tail = ptr->prev;
+ if(ptr == buffer_list_head) buffer_list_head = ptr->next;
+
+ // release valid pointer to pool
+ ptr->status = BUFFER_EMPTY;
+
+ free(ptr->data);
+ free(ptr);
+ ptr=NULL;
+
+}
+
+
+/* ------------------------------------------------------------------ */
+
+
+buffer_list_t *buffer_retrieve()
+
+{
+
+ /* objectives:
+ ===========
+
+ get pointer to next full buffer
+
+ */
+
+ buffer_list_t *ptr;
+
+ ptr = buffer_list_head;
+
+ /* move along the chain and check for status */
+
+ while(ptr != NULL)
+ {
+ if(ptr->status == BUFFER_READY)
+ {
+
+ return(ptr);
+ }
+ ptr = ptr->next;
+ }
+
+ return(NULL);
+}
+
+/*************************************************************************/
+
+/*
+ * Local variables:
+ * c-file-style: "stroustrup"
+ * c-file-offsets: ((case-label . *) (statement-case-intro . *))
+ * indent-tabs-mode: nil
+ * End:
+ *
+ * vim: expandtab shiftwidth=4:
+ */