diff options
Diffstat (limited to 'stream')
-rw-r--r-- | stream/dvbin.h | 1 | ||||
-rw-r--r-- | stream/stream.c | 13 | ||||
-rw-r--r-- | stream/stream.h | 1 | ||||
-rw-r--r-- | stream/stream_dvb.c | 4 | ||||
-rw-r--r-- | stream/stream_file.c | 35 | ||||
-rw-r--r-- | stream/stream_smb.c | 26 | ||||
-rw-r--r-- | stream/stream_vcd.c | 41 | ||||
-rw-r--r-- | stream/vcd_read.h | 2 |
8 files changed, 57 insertions, 66 deletions
diff --git a/stream/dvbin.h b/stream/dvbin.h index 8f7ff28d40..ccaf0db66c 100644 --- a/stream/dvbin.h +++ b/stream/dvbin.h @@ -76,6 +76,7 @@ typedef struct { } dvb_config_t; typedef struct { + int fd; int card; int fe_fd; int sec_fd; diff --git a/stream/stream.c b/stream/stream.c index ead4a55b3d..1e53b75c4e 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -315,13 +315,7 @@ static int stream_read_unbuffered(stream_t *s, void *buf, int len) int orig_len = len; s->buf_pos = s->buf_len = 0; // we will retry even if we already reached EOF previously. - if (s->fill_buffer) { - len = s->fill_buffer(s, buf, len); - } else if (s->fd >= 0) { - len = read(s->fd, buf, len); - } else { - len = 0; - } + len = s->fill_buffer ? s->fill_buffer(s, buf, len) : -1; if (len < 0) len = 0; if (len == 0) { @@ -590,8 +584,6 @@ static stream_t *new_stream(size_t min_size) min_size = FFMAX(min_size, TOTAL_BUFFER_SIZE); stream_t *s = talloc_size(NULL, sizeof(stream_t) + min_size); memset(s, 0, sizeof(stream_t)); - - s->fd = -2; return s; } @@ -604,9 +596,6 @@ void free_stream(stream_t *s) if (s->close) s->close(s); - if (s->fd > 0) { - close(s->fd); - } free_stream(s->uncached_stream); talloc_free(s); } diff --git a/stream/stream.h b/stream/stream.h index b80f31c44f..36adea2c40 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -134,7 +134,6 @@ typedef struct stream { // Close void (*close)(struct stream *s); - int fd; // file descriptor, see man open(2) enum streamtype type; // see STREAMTYPE_* enum streamtype uncached_type; // if stream is cache, type of wrapped str. int flags; // MP_STREAM_SEEK_* or'ed flags diff --git a/stream/stream_dvb.c b/stream/stream_dvb.c index 6dbdf7b0b9..898d57221b 100644 --- a/stream/stream_dvb.c +++ b/stream/stream_dvb.c @@ -443,7 +443,7 @@ static int dvb_streaming_read(stream_t *stream, char *buffer, int size) tries = priv->retry + 1; - fd = stream->fd; + fd = priv->fd; while(pos < size) { pfds[0].fd = fd; @@ -535,7 +535,7 @@ int dvb_set_channel(stream_t *stream, int card, int n) priv->list = new_list; priv->retry = 5; new_list->current = n; - stream->fd = priv->dvr_fd; + priv->fd = priv->dvr_fd; mp_msg(MSGT_DEMUX, MSGL_V, "DVB_SET_CHANNEL: new channel name=%s, card: %d, channel %d\n", channel->name, card, n); stream->buf_pos = stream->buf_len = 0; diff --git a/stream/stream_file.c b/stream/stream_file.c index 79ebbb3eef..6166610ec6 100644 --- a/stream/stream_file.c +++ b/stream/stream_file.c @@ -32,6 +32,11 @@ #include "core/m_option.h" #include "core/m_struct.h" +struct priv { + int fd; + bool close; +}; + static struct stream_priv_s { char* filename; char *filename2; @@ -54,15 +59,17 @@ static const struct m_struct_st stream_opts = { }; static int fill_buffer(stream_t *s, char* buffer, int max_len){ - int r = read(s->fd,buffer,max_len); + struct priv *p = s->priv; + int r = read(p->fd,buffer,max_len); return (r <= 0) ? -1 : r; } static int write_buffer(stream_t *s, char* buffer, int len) { + struct priv *p = s->priv; int r; int wr = 0; while (wr < len) { - r = write(s->fd,buffer,len); + r = write(p->fd,buffer,len); if (r <= 0) return -1; wr += r; @@ -72,8 +79,9 @@ static int write_buffer(stream_t *s, char* buffer, int len) { } static int seek(stream_t *s,int64_t newpos) { + struct priv *p = s->priv; s->pos = newpos; - if(lseek(s->fd,s->pos,SEEK_SET)<0) { + if(lseek(p->fd,s->pos,SEEK_SET)<0) { return 0; } return 1; @@ -95,12 +103,13 @@ static int seek_forward(stream_t *s,int64_t newpos) { } static int control(stream_t *s, int cmd, void *arg) { + struct priv *p = s->priv; switch(cmd) { case STREAM_CTRL_GET_SIZE: { off_t size; - size = lseek(s->fd, 0, SEEK_END); - lseek(s->fd, s->pos, SEEK_SET); + size = lseek(p->fd, 0, SEEK_END); + lseek(p->fd, s->pos, SEEK_SET); if(size != (off_t)-1) { *(uint64_t*)arg = size; return 1; @@ -110,6 +119,13 @@ static int control(stream_t *s, int cmd, void *arg) { return STREAM_UNSUPPORTED; } +static void s_close(stream_t *s) +{ + struct priv *p = s->priv; + if (p->close && p->fd >= 0) + close(p->fd); +} + static int open_f(stream_t *stream,int mode, void* opts) { int f; @@ -117,6 +133,9 @@ static int open_f(stream_t *stream,int mode, void* opts) int64_t len; unsigned char *filename; struct stream_priv_s* p = (struct stream_priv_s*)opts; + struct priv *priv = talloc_ptrtype(stream, priv); + *priv = (struct priv) { .fd = -1 }; + stream->priv = priv; if(mode == STREAM_READ) m = O_RDONLY; @@ -163,6 +182,8 @@ static int open_f(stream_t *stream,int mode, void* opts) setmode(fileno(stdout),O_BINARY); #endif } + priv->fd = f; + priv->close = false; } else { mode_t openmode = S_IRUSR|S_IWUSR; #ifndef __MINGW32__ @@ -184,6 +205,8 @@ static int open_f(stream_t *stream,int mode, void* opts) return STREAM_ERROR; } #endif + priv->fd = f; + priv->close = true; } len=lseek(f,0,SEEK_END); lseek(f,0,SEEK_SET); @@ -203,11 +226,11 @@ static int open_f(stream_t *stream,int mode, void* opts) 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; stream->control = control; stream->read_chunk = 64*1024; + stream->close = s_close; m_struct_free(&stream_opts,opts); return STREAM_OK; diff --git a/stream/stream_smb.c b/stream/stream_smb.c index d98d3485c1..5c9a4a6b0b 100644 --- a/stream/stream_smb.c +++ b/stream/stream_smb.c @@ -26,6 +26,10 @@ #include "core/m_option.h" #include "core/m_struct.h" +struct priv { + int fd; +}; + static struct stream_priv_s { } stream_priv_dflts = { }; @@ -72,10 +76,11 @@ static void smb_auth_fn(const char *server, const char *share, } static int control(stream_t *s, int cmd, void *arg) { + struct priv *p = s->priv; switch(cmd) { case STREAM_CTRL_GET_SIZE: { - off_t size = smbc_lseek(s->fd,0,SEEK_END); - smbc_lseek(s->fd,s->pos,SEEK_SET); + off_t size = smbc_lseek(p->fd,0,SEEK_END); + smbc_lseek(p->fd,s->pos,SEEK_SET); if(size != (off_t)-1) { *(uint64_t *)arg = size; return 1; @@ -86,23 +91,26 @@ static int control(stream_t *s, int cmd, void *arg) { } static int seek(stream_t *s,int64_t newpos) { + struct priv *p = s->priv; s->pos = newpos; - if(smbc_lseek(s->fd,s->pos,SEEK_SET)<0) { + if(smbc_lseek(p->fd,s->pos,SEEK_SET)<0) { return 0; } return 1; } static int fill_buffer(stream_t *s, char* buffer, int max_len){ - int r = smbc_read(s->fd,buffer,max_len); + struct priv *p = s->priv; + int r = smbc_read(p->fd,buffer,max_len); return (r <= 0) ? -1 : r; } static int write_buffer(stream_t *s, char* buffer, int len) { + struct priv *p = s->priv; int r; int wr = 0; while (wr < len) { - r = smbc_write(s->fd,buffer,len); + r = smbc_write(p->fd,buffer,len); if (r <= 0) return -1; wr += r; @@ -112,7 +120,8 @@ static int write_buffer(stream_t *s, char* buffer, int len) { } static void close_f(stream_t *s){ - smbc_close(s->fd); + struct priv *p = s->priv; + smbc_close(p->fd); } static int open_f (stream_t *stream, int mode, void *opts) @@ -122,6 +131,9 @@ static int open_f (stream_t *stream, int mode, void *opts) int64_t len; int fd, err; + struct priv *priv = talloc_zero(stream, struct priv); + stream->priv = priv; + filename = stream->url; if(mode == STREAM_READ) @@ -165,7 +177,7 @@ static int open_f (stream_t *stream, int mode, void *opts) stream->seek = seek; if(mode == STREAM_READ) stream->end_pos = len; } - stream->fd = fd; + priv->fd = fd; stream->fill_buffer = fill_buffer; stream->write_buffer = write_buffer; stream->close = close_f; diff --git a/stream/stream_vcd.c b/stream/stream_vcd.c index 8828f227d9..cd03b49744 100644 --- a/stream/stream_vcd.c +++ b/stream/stream_vcd.c @@ -92,43 +92,10 @@ static int seek(stream_t *s,int64_t newpos) { return 1; } -static int control(stream_t *stream, int cmd, void *arg) { - struct stream_priv_s *p = stream->priv; - switch(cmd) { - case STREAM_CTRL_GET_NUM_TITLES: - case STREAM_CTRL_GET_NUM_CHAPTERS: - { - mp_vcd_priv_t *vcd = vcd_read_toc(stream->fd); - if (!vcd) - break; - *(unsigned int *)arg = vcd_end_track(vcd); - return STREAM_OK; - } - case STREAM_CTRL_SEEK_TO_CHAPTER: - { - int r; - unsigned int track = *(unsigned int *)arg + 1; - mp_vcd_priv_t *vcd = vcd_read_toc(stream->fd); - if (!vcd) - break; - r = vcd_seek_to_track(vcd, track); - if (r >= 0) { - p->track = track; - return STREAM_OK; - } - break; - } - case STREAM_CTRL_GET_CURRENT_CHAPTER: - { - *(unsigned int *)arg = p->track - 1; - return STREAM_OK; - } - } - return STREAM_UNSUPPORTED; -} - static void close_s(stream_t *stream) { - free(stream->priv); + mp_vcd_priv_t *p = stream->priv; + close(p->fd); + free(p); } static int open_s(stream_t *stream,int mode, void* opts) @@ -220,7 +187,6 @@ static int open_s(stream_t *stream,int mode, void* opts) } #endif - stream->fd = f; stream->sector_size = VCD_SECTOR_DATA; stream->start_pos=ret; stream->end_pos=ret2; @@ -228,7 +194,6 @@ static int open_s(stream_t *stream,int mode, void* opts) stream->fill_buffer = fill_buffer; stream->seek = seek; - stream->control = control; stream->close = close_s; stream->demuxer = "lavf"; // mpegps ( or "vcd"?) diff --git a/stream/vcd_read.h b/stream/vcd_read.h index 2d4a88604a..92a9c53b78 100644 --- a/stream/vcd_read.h +++ b/stream/vcd_read.h @@ -147,10 +147,12 @@ static mp_vcd_priv_t* vcd_read_toc(int fd){ return vcd; } +/* static int vcd_end_track(mp_vcd_priv_t* vcd) { return vcd->tochdr.cdth_trk1; } +*/ static int vcd_read(mp_vcd_priv_t* vcd,char *mem){ #ifndef sun |