Mercurial > mplayer.hg
annotate stream/stream_file.c @ 19382:7c6c205b88b6
trying to fix the reverting paragraph
if you dissagree, dont hesitate to revert this commit or flame, but at least we should not claim that svn cannot revert commits except by recommiting the old version
author | michael |
---|---|
date | Sun, 13 Aug 2006 22:14:32 +0000 |
parents | 64d82a45a05d |
children | 32c50eb3ff18 |
rev | line source |
---|---|
9794 | 1 |
2 #include "config.h" | |
3 | |
16748
ec02252fbaa6
we need stdio.h for SEEK_SET on mingw, patch by Zuxy <zuxy.meng at gmail.com>
faust3
parents:
15461
diff
changeset
|
4 #include <stdio.h> |
9794 | 5 #include <sys/types.h> |
6 #include <sys/stat.h> | |
7 #include <fcntl.h> | |
8 #include <unistd.h> | |
9 | |
10 #include "mp_msg.h" | |
11 #include "stream.h" | |
12 #include "help_mp.h" | |
17012 | 13 #include "m_option.h" |
14 #include "m_struct.h" | |
9794 | 15 |
16 static struct stream_priv_s { | |
17 char* filename; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
18 char *filename2; |
9794 | 19 } stream_priv_dflts = { |
15452 | 20 NULL, NULL |
9794 | 21 }; |
22 | |
23 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f) | |
24 /// URL definition | |
25 static m_option_t stream_opts_fields[] = { | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
26 {"string", ST_OFF(filename), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
27 {"filename", ST_OFF(filename2), CONF_TYPE_STRING, 0, 0 ,0, NULL}, |
9794 | 28 { NULL, NULL, 0, 0, 0, 0, NULL } |
29 }; | |
30 static struct m_struct_st stream_opts = { | |
31 "file", | |
32 sizeof(struct stream_priv_s), | |
33 &stream_priv_dflts, | |
34 stream_opts_fields | |
35 }; | |
36 | |
37 static int fill_buffer(stream_t *s, char* buffer, int max_len){ | |
38 int r = read(s->fd,buffer,max_len); | |
39 return (r <= 0) ? -1 : r; | |
40 } | |
41 | |
42 static int write_buffer(stream_t *s, char* buffer, int len) { | |
43 int r = write(s->fd,buffer,len); | |
44 return (r <= 0) ? -1 : r; | |
45 } | |
46 | |
47 static int seek(stream_t *s,off_t newpos) { | |
48 s->pos = newpos; | |
49 if(lseek(s->fd,s->pos,SEEK_SET)<0) { | |
50 s->eof=1; | |
51 return 0; | |
52 } | |
53 return 1; | |
54 } | |
55 | |
56 static int seek_forward(stream_t *s,off_t newpos) { | |
57 if(newpos<s->pos){ | |
58 mp_msg(MSGT_STREAM,MSGL_INFO,"Cannot seek backward in linear streams!\n"); | |
59 return 0; | |
60 } | |
61 while(s->pos<newpos){ | |
12018 | 62 int len=s->fill_buffer(s,s->buffer,STREAM_BUFFER_SIZE); |
63 if(len<=0){ s->eof=1; s->buf_pos=s->buf_len=0; break; } // EOF | |
64 s->buf_pos=0; | |
65 s->buf_len=len; | |
66 s->pos+=len; | |
9794 | 67 } |
68 return 1; | |
69 } | |
70 | |
71 static int open_f(stream_t *stream,int mode, void* opts, int* file_format) { | |
72 int f; | |
73 mode_t m = 0; | |
74 off_t len; | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
75 unsigned char *filename; |
9794 | 76 struct stream_priv_s* p = (struct stream_priv_s*)opts; |
77 | |
78 if(mode == STREAM_READ) | |
79 m = O_RDONLY; | |
80 else if(mode == STREAM_WRITE) | |
81 m = O_WRONLY; | |
82 else { | |
10608 | 83 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] Unknown open mode %d\n",mode); |
9794 | 84 m_struct_free(&stream_opts,opts); |
85 return STREAM_UNSUPORTED; | |
86 } | |
87 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
88 if(p->filename) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
89 filename = p->filename; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
90 else if(p->filename2) |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
91 filename = p->filename2; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
92 else |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
93 filename = NULL; |
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
94 if(!filename) { |
9849 | 95 mp_msg(MSGT_OPEN,MSGL_ERR, "[file] No filename\n"); |
96 m_struct_free(&stream_opts,opts); | |
97 return STREAM_ERROR; | |
98 } | |
99 | |
9794 | 100 #if defined(__CYGWIN__)|| defined(__MINGW32__) |
101 m |= O_BINARY; | |
102 #endif | |
103 | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
104 if(!strcmp(filename,"-")){ |
9794 | 105 if(mode == STREAM_READ) { |
106 // read from stdin | |
107 mp_msg(MSGT_OPEN,MSGL_INFO,MSGTR_ReadSTDIN); | |
108 f=0; // 0=stdin | |
12921 | 109 #ifdef __MINGW32__ |
110 setmode(fileno(stdin),O_BINARY); | |
111 #endif | |
9794 | 112 } else { |
113 mp_msg(MSGT_OPEN,MSGL_INFO,"Writing to stdout\n"); | |
114 f=1; | |
12921 | 115 #ifdef __MINGW32__ |
116 setmode(fileno(stdout),O_BINARY); | |
117 #endif | |
9794 | 118 } |
119 } else { | |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
120 f=open(filename,m); |
9794 | 121 if(f<0) { |
15461
7c272bfba96f
fixed file:// syntax using newly introduced -string- urlpart
nicodvb
parents:
15452
diff
changeset
|
122 mp_msg(MSGT_OPEN,MSGL_ERR,MSGTR_FileNotFound,filename); |
9794 | 123 m_struct_free(&stream_opts,opts); |
9827 | 124 return STREAM_ERROR; |
9794 | 125 } |
126 } | |
127 | |
128 len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); | |
12921 | 129 #ifdef __MINGW32__ |
130 if(f==0 || len == -1) { | |
131 #else | |
9794 | 132 if(len == -1) { |
12921 | 133 #endif |
9794 | 134 stream->seek = seek_forward; |
135 stream->type = STREAMTYPE_STREAM; // Must be move to STREAMTYPE_FILE | |
136 stream->flags |= STREAM_SEEK_FW; | |
137 } else if(len >= 0) { | |
138 stream->seek = seek; | |
139 stream->end_pos = len; | |
140 stream->type = STREAMTYPE_FILE; | |
141 } | |
142 | |
16750
0a31740dd5e6
Use PRI?64 defines as format strings for 64 bit variables.
reimar
parents:
16748
diff
changeset
|
143 mp_msg(MSGT_OPEN,MSGL_V,"[file] File size is %"PRId64" bytes\n", (int64_t)len); |
9794 | 144 |
145 stream->fd = f; | |
146 stream->fill_buffer = fill_buffer; | |
147 stream->write_buffer = write_buffer; | |
148 | |
149 m_struct_free(&stream_opts,opts); | |
150 return STREAM_OK; | |
151 } | |
152 | |
153 stream_info_t stream_info_file = { | |
154 "File", | |
155 "file", | |
156 "Albeu", | |
157 "based on the code from ??? (probably Arpi)", | |
158 open_f, | |
159 { "file", "", NULL }, | |
160 &stream_opts, | |
161 1 // Urls are an option string | |
162 }; |