16 static struct stream_priv_s
{
19 } stream_priv_dflts
= {
23 #define ST_OFF(f) M_ST_OFF(struct stream_priv_s,f)
25 static m_option_t stream_opts_fields
[] = {
26 {"string", ST_OFF(filename
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
27 {"filename", ST_OFF(filename2
), CONF_TYPE_STRING
, 0, 0 ,0, NULL
},
28 { NULL
, NULL
, 0, 0, 0, 0, NULL
}
30 static struct m_struct_st stream_opts
= {
32 sizeof(struct stream_priv_s
),
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
;
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
;
47 static int seek(stream_t
*s
,off_t newpos
) {
49 if(lseek(s
->fd
,s
->pos
,SEEK_SET
)<0) {
56 static int seek_forward(stream_t
*s
,off_t newpos
) {
58 mp_msg(MSGT_STREAM
,MSGL_INFO
,"Cannot seek backward in linear streams!\n");
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
71 static int open_f(stream_t
*stream
,int mode
, void* opts
, int* file_format
) {
75 unsigned char *filename
;
76 struct stream_priv_s
* p
= (struct stream_priv_s
*)opts
;
78 if(mode
== STREAM_READ
)
80 else if(mode
== STREAM_WRITE
)
83 mp_msg(MSGT_OPEN
,MSGL_ERR
, "[file] Unknown open mode %d\n",mode
);
84 m_struct_free(&stream_opts
,opts
);
85 return STREAM_UNSUPORTED
;
89 filename
= p
->filename
;
91 filename
= p
->filename2
;
95 mp_msg(MSGT_OPEN
,MSGL_ERR
, "[file] No filename\n");
96 m_struct_free(&stream_opts
,opts
);
100 #if defined(__CYGWIN__)|| defined(__MINGW32__)
104 if(!strcmp(filename
,"-")){
105 if(mode
== STREAM_READ
) {
107 mp_msg(MSGT_OPEN
,MSGL_INFO
,MSGTR_ReadSTDIN
);
110 setmode(fileno(stdin
),O_BINARY
);
113 mp_msg(MSGT_OPEN
,MSGL_INFO
,"Writing to stdout\n");
116 setmode(fileno(stdout
),O_BINARY
);
122 mp_msg(MSGT_OPEN
,MSGL_ERR
,MSGTR_FileNotFound
,filename
);
123 m_struct_free(&stream_opts
,opts
);
128 len
=lseek(f
,0,SEEK_END
); lseek(f
,0,SEEK_SET
);
130 if(f
==0 || len
== -1) {
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) {
139 stream
->end_pos
= len
;
140 stream
->type
= STREAMTYPE_FILE
;
143 mp_msg(MSGT_OPEN
,MSGL_V
,"[file] File size is %"PRId64
" bytes\n", (int64_t)len
);
146 stream
->fill_buffer
= fill_buffer
;
147 stream
->write_buffer
= write_buffer
;
149 m_struct_free(&stream_opts
,opts
);
153 stream_info_t stream_info_file
= {
157 "based on the code from ??? (probably Arpi)",
159 { "file", "", NULL
},
161 1 // Urls are an option string