summaryrefslogtreecommitdiffstats
path: root/stream/stream_file.c
diff options
context:
space:
mode:
authorben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-07-31 17:39:17 +0000
committerben <ben@b3059339-0415-0410-9bf9-f77b7e298cf2>2006-07-31 17:39:17 +0000
commit49867bd432352d19172ab26cf873bd5651e69e25 (patch)
treec2d419bb4f81564036baa12832a44b8aac27c6d1 /stream/stream_file.c
parentd3b998da64927403879ad588287c178f86b7c849 (diff)
downloadmpv-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.c162
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
+};