summaryrefslogtreecommitdiff
path: root/src/input/read_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/input/read_cache.c')
-rw-r--r--src/input/read_cache.c298
1 files changed, 0 insertions, 298 deletions
diff --git a/src/input/read_cache.c b/src/input/read_cache.c
deleted file mode 100644
index fb9b27a13..000000000
--- a/src/input/read_cache.c
+++ /dev/null
@@ -1,298 +0,0 @@
-/*
- * Copyright (C) 2000-2001 the xine project
- *
- * This file is part of xine, a unix video player.
- *
- * xine 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 of the License, or
- * (at your option) any later version.
- *
- * xine 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 this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA
- *
- * $Id: read_cache.c,v 1.8 2001/11/19 22:31:35 miguelfreitas Exp $
- */
-
-#include <sys/types.h>
-#include <unistd.h>
-#include <stdlib.h>
-#include <string.h>
-#include <errno.h>
-
-#include "xineutils.h"
-
-#include "read_cache.h"
-
-#define NUM_BUFFERS 512
-#define NUM_MACRO_BUFFERS 32
-
-typedef struct macro_buf_s macro_buf_t;
-
-struct macro_buf_s {
-
- macro_buf_t *next;
-
- int ref;
- off_t adr;
-
- uint8_t *data;
- int size_valid; /* amount of valid data bytes in 'data' */
- read_cache_t *source;
-};
-
-struct read_cache_s {
-
- int fd;
-
- macro_buf_t *mbuf_pool_top;
- char *multi_base;
- buf_element_t *buf_pool_top;
-
- macro_buf_t *cur_mbuf;
-
- pthread_mutex_t lock;
- pthread_cond_t buf_pool_not_empty;
- pthread_cond_t mbuf_pool_not_empty;
-};
-
-/*
- * helper function to release buffer pool lock
- * in case demux thread is cancelled
- */
-
-static void cache_release_lock (void *arg) {
-
- pthread_mutex_t *mutex = (pthread_mutex_t *) arg;
-
- /* printf ("pool release lock\n"); */
-
- pthread_mutex_unlock (mutex);
-
-}
-
-static void buf_free (buf_element_t *buf) {
-
- macro_buf_t *mbuf = (macro_buf_t *) buf->source;
- read_cache_t *this = mbuf->source;
-
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
-
- pthread_cleanup_push( cache_release_lock, &this->lock);
-
- pthread_mutex_lock (&this->lock);
-
- /* free buffer */
-
- buf->next = this->buf_pool_top;
- this->buf_pool_top = buf;
-
- pthread_cond_signal (&this->buf_pool_not_empty);
-
- /* maybe free mbuf too */
-
- mbuf->ref--;
-
- if (!mbuf->ref && (mbuf != this->cur_mbuf)) {
-
- mbuf->next = this->mbuf_pool_top;
- this->mbuf_pool_top = mbuf;
-
- pthread_cond_signal (&this->mbuf_pool_not_empty);
- }
-
- pthread_cleanup_pop (0);
- pthread_mutex_unlock (&this->lock);
- /* needed because cancellation points defined by POSIX
- (eg. 'read') would leak allocated buffers */
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
-}
-
-read_cache_t *read_cache_new () {
-
- read_cache_t *this;
- int i;
- char *multi_buffer = NULL;
- int buf_size;
-
- this = (read_cache_t *) xine_xmalloc (sizeof (read_cache_t));
-
- pthread_mutex_init (&this->lock, NULL);
- pthread_cond_init (&this->buf_pool_not_empty, NULL);
- pthread_cond_init (&this->mbuf_pool_not_empty, NULL);
-
- /* init buffer pool */
-
- this->buf_pool_top = NULL;
- for (i = 0; i<NUM_BUFFERS; i++) {
- buf_element_t *buf;
-
- buf = xine_xmalloc (sizeof (buf_element_t));
-
- buf->max_size = 2048;
- buf->free_buffer = buf_free;
-
- buf->next = this->buf_pool_top;
- this->buf_pool_top = buf;
- }
-
- /* init macro buffer pool */
-
- buf_size = NUM_MACRO_BUFFERS * 2048 * 16;
- buf_size += 2048; /* alignment space */
- this->multi_base = xine_xmalloc (buf_size);
- multi_buffer = this->multi_base;
- while ((int) multi_buffer % 2048)
- multi_buffer++;
-
- this->mbuf_pool_top = NULL;
- for (i = 0; i<NUM_MACRO_BUFFERS; i++) {
- macro_buf_t *mbuf;
-
- mbuf = xine_xmalloc (sizeof (macro_buf_t));
-
- mbuf->data = (uint8_t *)multi_buffer;
- multi_buffer += 2048*16;
- mbuf->source = this;
-
- mbuf->next = this->mbuf_pool_top;
- this->mbuf_pool_top = mbuf;
- }
-
- return this;
-}
-
-void read_cache_set_fd (read_cache_t *this, int fd) {
- this->fd = fd;
-}
-
-
-buf_element_t *read_cache_read_block (read_cache_t *this,
- off_t pos) {
-
- macro_buf_t *mbuf;
- buf_element_t *buf;
- off_t madr;
- int badr;
- int bytes_read;
-
- pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
-
- pthread_cleanup_push( cache_release_lock, &this->lock);
-
- pthread_mutex_lock (&this->lock);
-
- /* address calculations */
-
- madr = pos & (~ (off_t) 0x7FFF);
- badr = pos & ((off_t) 0x7FFF);
-
- /* find or create macroblock that contains this block */
-
- if ( !this->cur_mbuf || (this->cur_mbuf->adr != madr) ||
- (this->cur_mbuf->size_valid <= badr) ) {
-
- if (this->cur_mbuf && (!this->cur_mbuf->ref)) {
-
- mbuf = this->cur_mbuf;
-
- } else {
-
- this->cur_mbuf = NULL;
-
- while (this->mbuf_pool_top==NULL) {
- pthread_cond_wait (&this->mbuf_pool_not_empty, &this->lock);
- }
-
- mbuf = this->mbuf_pool_top;
-
- this->mbuf_pool_top = this->mbuf_pool_top->next;
- }
-
- mbuf->adr = madr;
- mbuf->ref = 0;
- mbuf->size_valid = 0;
-
- this->cur_mbuf = mbuf;
-
- if (lseek (this->fd, madr, SEEK_SET) < 0) {
- fprintf(stderr, "read_cache: can't seek to offset %lld (%s)\n",
- (long long)madr, strerror (errno));
- } else {
- pthread_testcancel();
- if ((bytes_read = read (this->fd, mbuf->data, 2048*16)) != 2048*16) {
- if (bytes_read < 0) /* reading encrypted dvd without authentication? */
- fprintf(stderr, "read_cache: read error (%s)\n", strerror (errno));
- else
- fprintf(stderr, "read_cache: short read (%d != %d)\n", bytes_read, 2048*16);
- }
- mbuf->size_valid = bytes_read;
- }
-
- } else {
- mbuf = this->cur_mbuf;
- }
-
- /* check for read errors */
- if ( badr > mbuf->size_valid ) {
-
- buf = NULL;
-
- } else {
-
- /* create buf */
-
- while (this->buf_pool_top==NULL) {
- pthread_cond_wait (&this->buf_pool_not_empty, &this->lock);
- }
-
- buf = this->buf_pool_top;
-
- this->buf_pool_top = this->buf_pool_top->next;
-
- buf->mem = mbuf->data + badr;
- buf->content = buf->mem;
- buf->source = mbuf;
-
- mbuf->ref++;
- }
-
- pthread_cleanup_pop (0);
- pthread_mutex_unlock (&this->lock);
- pthread_setcancelstate(PTHREAD_CANCEL_DISABLE,NULL);
-
- return buf;
-}
-
-void read_cache_free (read_cache_t *this) {
-
- buf_element_t *buf;
- macro_buf_t *mbuf;
-
- buf = this->buf_pool_top;
- while (buf) {
- buf_element_t *next = buf->next;
-
- free(buf);
- buf = next;
- }
-
- mbuf = this->mbuf_pool_top;
- while (mbuf) {
- macro_buf_t *mnext = mbuf->next;
-
- free (mbuf);
- mbuf = mnext;
- }
-
- free (this->multi_base);
-
- free (this);
-}
-