summaryrefslogtreecommitdiffstats
path: root/TOOLS
diff options
context:
space:
mode:
authorarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-06-03 19:09:17 +0000
committerarpi_esp <arpi_esp@b3059339-0415-0410-9bf9-f77b7e298cf2>2001-06-03 19:09:17 +0000
commit19bcce624f2199d9acbc5be3b8835497609e9b98 (patch)
tree03c30a82cdb2546d7ba7d91dbf9556c8c58c150c /TOOLS
parentac2afeb46f21372fba01fc648d3ab07e66147d1f (diff)
downloadmpv-19bcce624f2199d9acbc5be3b8835497609e9b98.tar.bz2
mpv-19bcce624f2199d9acbc5be3b8835497609e9b98.tar.xz
ring buffering example
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@969 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'TOOLS')
-rw-r--r--TOOLS/buffer.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/TOOLS/buffer.c b/TOOLS/buffer.c
new file mode 100644
index 0000000000..bc568902a7
--- /dev/null
+++ b/TOOLS/buffer.c
@@ -0,0 +1,73 @@
+
+// General purpose Ring-buffering routines
+
+#define BUFFSIZE (1024)
+#define NUM_BUFS (64)
+
+static unsigned char *buffer[NUM_BUFS];
+
+static unsigned int buf_read=0;
+static unsigned int buf_write=0;
+static unsigned int buf_read_pos=0;
+static unsigned int buf_write_pos=0;
+
+static int full_buffers=0;
+static int buffered_bytes=0;
+
+static int write_buffer(unsigned char* data,int len){
+ int len2=0;
+ int x;
+ while(len>0){
+ if(full_buffers==NUM_BUFS) break;
+ x=BUFFSIZE-buf_write_pos;
+ if(x>len) x=len;
+ memcpy(buffer[buf_write]+buf_write_pos,data+len2,x);
+ len2+=x; len-=x;
+ buffered_bytes+=x; buf_write_pos+=x;
+ if(buf_write_pos>=BUFFSIZE){
+ // block is full, find next!
+ buf_write=(buf_write+1)%NUM_BUFS;
+ ++full_buffers;
+ buf_write_pos=0;
+ }
+ }
+ return len2;
+}
+
+static int read_buffer(unsigned char* data,int len){
+ int len2=0;
+ int x;
+ while(len>0){
+ if(full_buffers==0) break; // no more data buffered!
+ x=BUFFSIZE-buf_read_pos;
+ if(x>len) x=len;
+ memcpy(data+len2,buffer[buf_read]+buf_read_pos,x);
+ len2+=x; len-=x;
+ buffered_bytes-=x; buf_read_pos+=x;
+ if(buf_read_pos>=BUFFSIZE){
+ // block is empty, find next!
+ buf_read=(buf_read+1)%NUM_BUFS;
+ --full_buffers;
+ buf_read_pos=0;
+ }
+ }
+ return len2;
+}
+
+static int get_space(){
+ return (NUM_BUFS-full_buffers)*BUFFSIZE - buf_write_pos;
+}
+
+static int get_delay(){
+ return buffered_bytes;
+}
+
+int main(int argc,char* argv[]){
+
+ int i;
+
+ for(i=0;i<NUM_BUFS;i++) buffer[i]=malloc(BUFFSIZE);
+
+return 0;
+}
+