diff options
author | ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-07-31 17:39:17 +0000 |
---|---|---|
committer | ben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2> | 2006-07-31 17:39:17 +0000 |
commit | 49867bd432352d19172ab26cf873bd5651e69e25 (patch) | |
tree | c2d419bb4f81564036baa12832a44b8aac27c6d1 /stream/stream_file.c | |
parent | d3b998da64927403879ad588287c178f86b7c849 (diff) | |
download | mpv-49867bd432352d19172ab26cf873bd5651e69e25.tar.bz2 mpv-49867bd432352d19172ab26cf873bd5651e69e25.tar.xz |
introduce new 'stream' directory for all stream layer related components and split them from libmpdemux
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@19277 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'stream/stream_file.c')
-rw-r--r-- | stream/stream_file.c | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/stream/stream_file.c b/stream/stream_file.c new file mode 100644 index 0000000000..ba2c3b133c --- /dev/null +++ b/stream/stream_file.c @@ -0,0 +1,162 @@ + +#include "config.h" + +#include <stdio.h> +#include <sys/types.h> +#include <sys/stat.h> +#include <fcntl.h> +#include <unistd.h> + +#include "mp_msg.h" +#include "stream.h" +#include "help_mp.h" +#include "m_option.h" +#include "m_struct.h" + +static struct stream_priv_s { + char* filename; + char *filename2; +} stream_priv_dflts = { + NULL, NULL +}; + +#define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) +/// URL definition +static m_option_t stream_opts_fields[] = { + {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL}, + {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL}, + { NULL, NULL, 0, 0, 0, 0, NULL } +}; +static struct m_struct_st stream_opts = { + "file", + sizeof(struct stream_priv_s), + &stream_priv_dflts, + stream_opts_fields +}; + +static int fill_buffer(stream_t *s, char* buffer, int max_len){ + int r = read(s->fd,buffer,max_len); + return (r <= 0) ? -1 : r; +} + +static int write_buffer(stream_t *s, char* buffer, int len) { + int r = write(s->fd,buffer,len); + return (r <= 0) ? -1 : r; +} + +static int seek(stream_t *s,off_t newpos) { + s->pos = newpos; + if(lseek(s->fd,s->pos,SEEK_SET)<0) { + s->eof=1; + return 0; + } + return 1; +} + +static int seek_forward(stream_t *s,off_t newpos) { + if(newpos<s->pos){ + mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); + return 0; + } + while(s->pos<newpos){ + int len=s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE); + if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF + s->buf_pos=0; + s->buf_len=len; + s->pos+=len; + } + return 1; +} + +static int open_f(stream_t *stream,int mode, void* opts, int* file_format) { + int f; + mode_t m = 0; + off_t len; + unsigned char *filename; + struct stream_priv_s* p = (struct stream_priv_s*)opts; + + if(mode == STREAM_READ) + m = O_RDONLY; + else if(mode == STREAM_WRITE) + m = O_WRONLY; + else { + mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode); + m_struct_free(&stream_opts,opts); + return STREAM_UNSUPORTED; + } + + if(p->filename) + filename = p->filename; + else if(p->filename2) + filename = p->filename2; + else + filename = NULL; + if(!filename) { + mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n"); + m_struct_free(&stream_opts,opts); + return STREAM_ERROR; + } + +#if defined(__CYGWIN__)|| defined(__MINGW32__) + m |= O_BINARY; +#endif + + if(!strcmp(filename,"-")){ + if(mode == STREAM_READ) { + // read from stdin + mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_ReadSTDIN); + f=0; // 0=stdin +#ifdef __MINGW32__ + setmode(fileno(stdin),O_BINARY); +#endif + } else { + mp_msg(MSGT_OPEN,MSGL_INFO,"Writing to stdout\n"); + f=1; +#ifdef __MINGW32__ + setmode(fileno(stdout),O_BINARY); +#endif + } + } else { + f=open(filename,m); + if(f<0) { + mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename); + m_struct_free(&stream_opts,opts); + return STREAM_ERROR; + } + } + + len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); +#ifdef __MINGW32__ + if(f==0 || len == -1) { +#else + if(len == -1) { +#endif + stream->seek = seek_forward; + stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE + stream->flags |= STREAM_SEEK_FW; + } else if(len >= 0) { + stream->seek = seek; + stream->end_pos = len; + stream->type = STREAMTYPE_FILE; + } + + mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len); + + stream->fd = f; + stream->fill_buffer = fill_buffer; + stream->write_buffer = write_buffer; + + m_struct_free(&stream_opts,opts); + return STREAM_OK; +} + +stream_info_t stream_info_file = { + "File", + "file", + "Albeu", + "based on the code from ??? (probably Arpi)", + open_f, + { "file", "", NULL }, + &stream_opts, + 1 // Urls are an option string +}; |