From: <the...@us...> - 2003-06-16 21:21:45
|
Update of /cvsroot/freevo/freevo/WIP/Thomas/mplayer-patches In directory sc8-pr-cvs1:/tmp/cvs-serv2951 Modified Files: mplayer_timeshift2.patch Added Files: mplayer_timeshift3.patch Log Message: --- NEW FILE: mplayer_timeshift3.patch --- diff -Naur ./libmpdemux/Makefile ../main2/libmpdemux/Makefile --- ./libmpdemux/Makefile 2003-06-09 02:24:22.000000000 +0200 +++ ../main2/libmpdemux/Makefile 2003-06-16 23:44:50.000000000 +0200 @@ -31,6 +31,8 @@ endif +SRCS += timeshift.c + OBJS = $(SRCS:.c=.o) OBJS += $(CPLUSPLUSSRCS:.cpp=.o) INCLUDE = -I../loader $(CSS_INC) $(EXTRA_INC) diff -Naur ./libmpdemux/open.c ../main2/libmpdemux/open.c --- ./libmpdemux/open.c 2003-05-17 14:24:01.000000000 +0200 +++ ../main2/libmpdemux/open.c 2003-06-16 23:45:02.000000000 +0200 @@ -75,7 +75,9 @@ #include "dvbin.h" #endif - +#ifdef HAVE_TIMESHIFT +stream_t* timeshift_open(char* url); +#endif // Define function about auth the libsmbclient library // FIXME: I really do not not is this function is properly working @@ -115,7 +117,8 @@ #endif -// Open a new stream (stdin/file/vcd/url) + + // Open a new stream (stdin/file/vcd/url) stream_t* open_stream(char* filename,char** options, int* file_format){ stream_t* stream=NULL; @@ -127,6 +130,9 @@ return NULL; } +if(filename && strncmp("timeshift://",filename,12) == 0) + return timeshift_open(filename+12); + // for opening of vcds in bincue files if(strncmp("cue://",filename,6) == 0){ int ret,ret2; diff -Naur ./libmpdemux/stream.c ../main2/libmpdemux/stream.c --- ./libmpdemux/stream.c 2003-06-16 22:45:17.000000000 +0200 +++ ../main2/libmpdemux/stream.c 2003-06-16 23:44:56.000000000 +0200 @@ -45,6 +45,12 @@ void dvd_close(dvd_priv_t *d); #endif +#ifdef HAVE_TIMESHIFT +int timeshift_read(stream_t *s, void* buffer, int size); +int timeshift_seek(stream_t *s, int offset, int whence); +void timeshift_close(stream_t *s); +#endif + #ifdef LIBSMBCLIENT #include "libsmbclient.h" #endif @@ -169,6 +175,11 @@ int len; if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } switch(s->type){ +#ifdef HAVE_TIMESHIFT + case STREAMTYPE_TIMESHIFT: + len=timeshift_read(s,s->buffer,STREAM_BUFFER_SIZE); + break; +#endif #ifdef LIBSMBCLIENT case STREAMTYPE_SMB: len=smbc_read(s->fd,s->buffer,STREAM_BUFFER_SIZE); @@ -235,6 +246,7 @@ switch(s->type){ case STREAMTYPE_SMB: + case STREAMTYPE_TIMESHIFT: case STREAMTYPE_STREAM: #ifdef _LARGEFILE_SOURCE newpos=pos&(~((long long)STREAM_BUFFER_SIZE-1));break; @@ -273,6 +285,14 @@ if(newpos==0 || newpos!=s->pos){ switch(s->type){ +#ifdef HAVE_TIMESHIFT + case STREAMTYPE_TIMESHIFT: + { + int shiftpos = timeshift_seek(s,newpos,SEEK_SET); + s->pos = shiftpos ; + } + break; +#endif #ifdef LIBSMBCLIENT case STREAMTYPE_SMB: s->pos=newpos; // real seek @@ -411,6 +431,11 @@ } #endif switch(s->type) { +#ifdef HAVE_TIMESHIFT + case STREAMTYPE_TIMESHIFT: + timeshift_close(s); + break; +#endif #ifdef LIBSMBCLIENT case STREAMTYPE_SMB: smbc_close(s->fd); diff -Naur ./libmpdemux/stream.h ../main2/libmpdemux/stream.h --- ./libmpdemux/stream.h 2003-05-17 14:24:01.000000000 +0200 +++ ../main2/libmpdemux/stream.h 2003-06-16 23:44:56.000000000 +0200 @@ -19,6 +19,9 @@ #define STREAMTYPE_SMB 11 // smb:// url, using libsmbclient (samba) #define STREAMTYPE_VCDBINCUE 12 // vcd directly from bin/cue files #define STREAMTYPE_DVB 13 +#define STREAMTYPE_TIMESHIFT 42 // Timeshift for Freevo + +#define HAVE_TIMESHIFT #define STREAM_BUFFER_SIZE 2048 Index: mplayer_timeshift2.patch =================================================================== RCS file: /cvsroot/freevo/freevo/WIP/Thomas/mplayer-patches/mplayer_timeshift2.patch,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** mplayer_timeshift2.patch 9 Jun 2003 21:28:13 -0000 1.1 --- mplayer_timeshift2.patch 16 Jun 2003 21:21:42 -0000 1.2 *************** *** 1,5 **** diff -Naur ./libmpdemux/Makefile ../main2/libmpdemux/Makefile --- ./libmpdemux/Makefile 2003-06-09 02:24:22.000000000 +0200 ! +++ ../main2/libmpdemux/Makefile 2003-06-09 22:57:35.000000000 +0200 @@ -31,6 +31,8 @@ endif --- 1,5 ---- diff -Naur ./libmpdemux/Makefile ../main2/libmpdemux/Makefile --- ./libmpdemux/Makefile 2003-06-09 02:24:22.000000000 +0200 ! +++ ../main2/libmpdemux/Makefile 2003-06-16 23:44:50.000000000 +0200 @@ -31,6 +31,8 @@ endif *************** *** 13,17 **** diff -Naur ./libmpdemux/open.c ../main2/libmpdemux/open.c --- ./libmpdemux/open.c 2003-05-17 14:24:01.000000000 +0200 ! +++ ../main2/libmpdemux/open.c 2003-06-09 22:57:03.000000000 +0200 @@ -75,7 +75,9 @@ #include "dvbin.h" --- 13,17 ---- diff -Naur ./libmpdemux/open.c ../main2/libmpdemux/open.c --- ./libmpdemux/open.c 2003-05-17 14:24:01.000000000 +0200 ! +++ ../main2/libmpdemux/open.c 2003-06-16 23:45:02.000000000 +0200 @@ -75,7 +75,9 @@ #include "dvbin.h" *************** *** 46,52 **** int ret,ret2; diff -Naur ./libmpdemux/stream.c ../main2/libmpdemux/stream.c ! --- ./libmpdemux/stream.c 2003-06-03 19:43:49.000000000 +0200 ! +++ ../main2/libmpdemux/stream.c 2003-06-09 22:57:04.000000000 +0200 ! @@ -38,6 +38,12 @@ void dvd_close(dvd_priv_t *d); #endif --- 46,52 ---- int ret,ret2; diff -Naur ./libmpdemux/stream.c ../main2/libmpdemux/stream.c ! --- ./libmpdemux/stream.c 2003-06-16 22:45:17.000000000 +0200 ! +++ ../main2/libmpdemux/stream.c 2003-06-16 23:44:56.000000000 +0200 ! @@ -45,6 +45,12 @@ void dvd_close(dvd_priv_t *d); #endif *************** *** 61,65 **** #include "libsmbclient.h" #endif ! @@ -162,6 +168,11 @@ int len; if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } --- 61,65 ---- #include "libsmbclient.h" #endif ! @@ -169,6 +175,11 @@ int len; if (/*s->fd == NULL ||*/ s->eof) { s->buf_pos = s->buf_len = 0; return 0; } *************** *** 73,77 **** case STREAMTYPE_SMB: len=smbc_read(s->fd,s->buffer,STREAM_BUFFER_SIZE); ! @@ -228,6 +239,7 @@ switch(s->type){ --- 73,77 ---- case STREAMTYPE_SMB: len=smbc_read(s->fd,s->buffer,STREAM_BUFFER_SIZE); ! @@ -235,6 +246,7 @@ switch(s->type){ *************** *** 81,85 **** #ifdef _LARGEFILE_SOURCE newpos=pos&(~((long long)STREAM_BUFFER_SIZE-1));break; ! @@ -266,6 +278,14 @@ if(newpos==0 || newpos!=s->pos){ --- 81,85 ---- #ifdef _LARGEFILE_SOURCE newpos=pos&(~((long long)STREAM_BUFFER_SIZE-1));break; ! @@ -273,6 +285,14 @@ if(newpos==0 || newpos!=s->pos){ *************** *** 96,100 **** case STREAMTYPE_SMB: s->pos=newpos; // real seek ! @@ -396,6 +416,11 @@ } #endif --- 96,100 ---- case STREAMTYPE_SMB: s->pos=newpos; // real seek ! @@ -411,6 +431,11 @@ } #endif *************** *** 110,114 **** diff -Naur ./libmpdemux/stream.h ../main2/libmpdemux/stream.h --- ./libmpdemux/stream.h 2003-05-17 14:24:01.000000000 +0200 ! +++ ../main2/libmpdemux/stream.h 2003-06-09 22:57:07.000000000 +0200 @@ -19,6 +19,9 @@ #define STREAMTYPE_SMB 11 // smb:// url, using libsmbclient (samba) --- 110,114 ---- diff -Naur ./libmpdemux/stream.h ../main2/libmpdemux/stream.h --- ./libmpdemux/stream.h 2003-05-17 14:24:01.000000000 +0200 ! +++ ../main2/libmpdemux/stream.h 2003-06-16 23:44:56.000000000 +0200 @@ -19,6 +19,9 @@ #define STREAMTYPE_SMB 11 // smb:// url, using libsmbclient (samba) *************** *** 121,309 **** #define STREAM_BUFFER_SIZE 2048 - diff -Naur ./libmpdemux/timeshift.c ../main2/libmpdemux/timeshift.c - --- ./libmpdemux/timeshift.c 1970-01-01 01:00:00.000000000 +0100 - +++ ../main2/libmpdemux/timeshift.c 2003-06-09 22:57:04.000000000 +0200 - @@ -0,0 +1,183 @@ - +#include <stdlib.h> - +#include <fcntl.h> - +#include <stdarg.h> - +#include <errno.h> - +#include <netdb.h> - +#include <unistd.h> - +#include <string.h> - +#include <sys/ioctl.h> - +#include <sys/types.h> - +#include <sys/stat.h> - +#include <unistd.h> - +#include <sys/mman.h> - +#include <fcntl.h> - +#include <stdio.h> - + - +#include "../version.h" - +#include "stream.h" - +#include "network.h" - + - +#define OVERRUN_DELTA 1 - +#define SEEK_END_OFFSET 1000000 - + - +typedef struct tagHeaderInfo - +{ - + char freevots[12] ; - + int file_size ; - + int file_size2 ; - + int header_size ; - + int header_size2 ; - + int data_size ; - + int data_size2 ; - + int writepointer ; - + int writepointer2 ; - + char reserved[20] ; - +} HEADERINFO ; - + - +stream_t* timeshift_open(char* url) - +{ - + int fd = 0; - + caddr_t pointer ; - + stream_t* s = NULL ; - + fd = open( url, O_RDONLY ) ; - + if ( fd <= 0 ) return NULL ; - + /* read header */ - + HEADERINFO header ; - + read( fd, &header, sizeof( header ) ) ; - + if (strcmp( header.freevots, "freevots") == 0) - + { - + pointer = mmap( 0, header.file_size, PROT_READ, MAP_SHARED, fd, 0 ) ; - + printf( "\nopen_timeshift: %s\n", url ) ; - + s = new_stream((int)pointer,STREAMTYPE_TIMESHIFT) ; - + } - + else - + { - + printf( "\nopen_timeshift failed: %s\n", url ) ; - + } - + close( fd ) ; - + return s; - +} - + - +int timeshift_read(stream_t* s,void *buffer,int size) - +{ - + int readsize ; - + int maxpos ; - + int waititerations ; - + HEADERINFO * pHeader ; - + pHeader = (HEADERINFO*) s->fd ; - + readsize = 0 ; - + if ( msync( (void*)s->fd, pHeader->file_size, MS_SYNC ) == -1 ) - + { - + fprintf( stderr, "Error in msync.\n" ) ; - + } - + waititerations = 0 ; - + /* Wait until size bytes are available */ - + while ( ((s->pos)+size) > pHeader->writepointer) - + { - + /* That's a Buffer Underrun Condition */ - + usleep( 500 * 1000 ) ; - + if ( msync( (void*)s->fd, pHeader->file_size, MS_SYNC ) == -1 ) - + { - + fprintf( stderr, "Error in msync.\n" ) ; - + } - + if ( ++waititerations > 10 ) - + { - + fprintf( stderr, "Buffer Underrun WP: %d / RP: %d\n", pHeader->writepointer, s->pos ) ; - + break ; - + } - + } - + - + /* Detect a Buffer Overrun Condition */ - + if (( pHeader->writepointer - s->pos ) <= OVERRUN_DELTA ) - + { - + fprintf( stderr, "Buffer Overrun: fd = %d, Pos = %d, WP = %i \n", - + s->fd, s->pos, pHeader->writepointer ) ; - + } - + /* find maximum readpos. It's either writepos or datasize. */ - + if ( s->pos%pHeader->data_size > pHeader->writepointer%pHeader->data_size ) - + { - + maxpos = pHeader->data_size ; - + } - + else - + { - + maxpos = pHeader->writepointer % pHeader->data_size ; - + } - + if ( size > maxpos - (s->pos % pHeader->data_size) ) - + { - + size = maxpos - (s->pos % pHeader->data_size) ; - + } - + memcpy( buffer, (void*) s->fd + sizeof( HEADERINFO ) + (s->pos % pHeader->data_size), size ) ; - + /* Adjust readpointer and wrap if necessary */ - + //s->pos += size ; - + // fprintf( stderr, "\nrp: %d / wp: %d\n", (s->pos % pHeader->data_size), pHeader->writepointer ) ; - + return size ; - +} - + - +void timeshift_close(stream_t* s) - +{ - + HEADERINFO * pHeader = (HEADERINFO*)(s->fd); - + // munmap(); - +} - + - +int timeshift_lseek(stream_t* s, off_t offset, int whence) - +{ - + HEADERINFO * pHeader ; - + pHeader = (HEADERINFO*)(s->fd) ; - + int maxoffset = pHeader->writepointer ; - + int minoffset = maxoffset - pHeader->data_size ; - + if ( minoffset < 0 ) minoffset = 0 ; - + maxoffset -= SEEK_END_OFFSET; - + int readpointer ; - + if ( msync( (void*)s->fd, pHeader->file_size, MS_SYNC ) == -1 ) - + { - + fprintf( stderr, "Error in msync.\n" ) ; - + return -1 ; - + } - + switch ( whence ) - + { - + case SEEK_SET: - + readpointer = offset ; - + if ( readpointer > maxoffset ) - + readpointer = maxoffset ; - + if ( readpointer < minoffset ) - + readpointer = minoffset ; - + return readpointer ; - + break ; - + } - + return offset ; - +} - + - +int timeshift_seek(stream_t* s,int offset,int whence) - +{ - + HEADERINFO * pHeader ; - + pHeader = (HEADERINFO*)(s->fd) ; - + int maxoffset = pHeader->writepointer ; - + int minoffset = maxoffset - pHeader->data_size ; - + if ( minoffset < 0 ) minoffset = 0 ; - + maxoffset -= SEEK_END_OFFSET; - + int readpointer ; - + if ( msync( (void*)s->fd, pHeader->file_size, MS_SYNC ) == -1 ) - + { - + fprintf( stderr, "Error in msync.\n" ) ; - + return -1 ; - + } - + switch ( whence ) - + { - + case SEEK_SET: - + readpointer = offset ; - + if ( readpointer > maxoffset ) - + readpointer = maxoffset ; - + if ( readpointer < minoffset ) - + readpointer = minoffset ; - + return readpointer ; - + break ; - + case SEEK_CUR: - + readpointer = ( readpointer + offset ) % pHeader->data_size ; - + break ; - + case SEEK_END: - + /* Positioning beyond End = Position behind writepointer */ - + readpointer = ( pHeader->writepointer + offset ) % pHeader->data_size ; - + break ; - + } - + return offset ; - +} --- 121,122 ---- |