summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stream/stream.c870
-rw-r--r--stream/stream.h376
2 files changed, 664 insertions, 582 deletions
diff --git a/stream/stream.c b/stream/stream.c
index 76cf453740..9dd190055a 100644
--- a/stream/stream.c
+++ b/stream/stream.c
@@ -54,10 +54,10 @@
#include "cache2.h"
/// We keep these 2 for the gui atm, but they will be removed.
-int vcd_track=0;
-char* cdrom_device=NULL;
-char* dvd_device=NULL;
-int dvd_title=0;
+int vcd_track = 0;
+char *cdrom_device = NULL;
+char *dvd_device = NULL;
+int dvd_title = 0;
struct input_ctx;
static int (*stream_check_interrupt_cb)(struct input_ctx *ctx, int time);
@@ -86,54 +86,54 @@ extern const stream_info_t stream_info_ifo;
extern const stream_info_t stream_info_dvd;
extern const stream_info_t stream_info_bluray;
-static const stream_info_t* const auto_open_streams[] = {
+static const stream_info_t *const auto_open_streams[] = {
#ifdef CONFIG_VCD
- &stream_info_vcd,
+ &stream_info_vcd,
#endif
#ifdef CONFIG_CDDA
- &stream_info_cdda,
+ &stream_info_cdda,
#endif
- &stream_info_ffmpeg, // use for rstp:// before http fallback
- &stream_info_avdevice,
+ &stream_info_ffmpeg, // use for rstp:// before http fallback
+ &stream_info_avdevice,
#ifdef CONFIG_NETWORKING
- &stream_info_http1,
- &stream_info_asf,
- &stream_info_udp,
- &stream_info_http2,
+ &stream_info_http1,
+ &stream_info_asf,
+ &stream_info_udp,
+ &stream_info_http2,
#endif
#ifdef CONFIG_DVBIN
- &stream_info_dvb,
+ &stream_info_dvb,
#endif
#ifdef CONFIG_TV
- &stream_info_tv,
+ &stream_info_tv,
#endif
#ifdef CONFIG_RADIO
- &stream_info_radio,
+ &stream_info_radio,
#endif
#ifdef CONFIG_PVR
- &stream_info_pvr,
+ &stream_info_pvr,
#endif
#ifdef CONFIG_FTP
- &stream_info_ftp,
+ &stream_info_ftp,
#endif
#ifdef CONFIG_VSTREAM
- &stream_info_vstream,
+ &stream_info_vstream,
#endif
#ifdef CONFIG_LIBSMBCLIENT
- &stream_info_smb,
+ &stream_info_smb,
#endif
#ifdef CONFIG_DVDREAD
- &stream_info_ifo,
- &stream_info_dvd,
+ &stream_info_ifo,
+ &stream_info_dvd,
#endif
#ifdef CONFIG_LIBBLURAY
- &stream_info_bluray,
+ &stream_info_bluray,
#endif
- &stream_info_null,
- &stream_info_mf,
- &stream_info_file,
- NULL
+ &stream_info_null,
+ &stream_info_mf,
+ &stream_info_file,
+ NULL
};
static stream_t *open_stream_plugin(const stream_info_t *sinfo,
@@ -142,132 +142,142 @@ static stream_t *open_stream_plugin(const stream_info_t *sinfo,
int *file_format, int *ret,
char **redirected_url)
{
- void* arg = NULL;
- stream_t* s;
- m_struct_t* desc = (m_struct_t*)sinfo->opts;
-
- // Parse options
- if(desc) {
- arg = m_struct_alloc(desc);
- if(sinfo->opts_url) {
- m_option_t url_opt =
- { "stream url", arg , CONF_TYPE_CUSTOM_URL, 0, 0 ,0, (void *)sinfo->opts };
- if (m_option_parse(&url_opt, bstr0("stream url"), bstr0(filename), arg) < 0) {
- mp_tmsg(MSGT_OPEN,MSGL_ERR, "URL parsing failed on url %s\n",filename);
- m_struct_free(desc,arg);
- *ret = STREAM_ERROR;
- return NULL;
- }
+ void *arg = NULL;
+ stream_t *s;
+ m_struct_t *desc = (m_struct_t *)sinfo->opts;
+
+ // Parse options
+ if (desc) {
+ arg = m_struct_alloc(desc);
+ if (sinfo->opts_url) {
+ m_option_t url_opt = { "stream url", arg, CONF_TYPE_CUSTOM_URL, 0,
+ 0, 0, (void *)sinfo->opts };
+ if (m_option_parse(&url_opt, bstr0("stream url"), bstr0(filename),
+ arg) < 0)
+ {
+ mp_tmsg(MSGT_OPEN, MSGL_ERR, "URL parsing failed on url %s\n",
+ filename);
+ m_struct_free(desc, arg);
+ *ret = STREAM_ERROR;
+ return NULL;
+ }
+ }
}
- }
- s = new_stream(-2,-2);
- s->opts = options;
- s->url=strdup(filename);
- s->flags |= mode;
- *ret = sinfo->open(s,mode,arg,file_format);
- if((*ret) != STREAM_OK) {
+ s = new_stream(-2, -2);
+ s->opts = options;
+ s->url = strdup(filename);
+ s->flags |= mode;
+ *ret = sinfo->open(s, mode, arg, file_format);
+ if ((*ret) != STREAM_OK) {
#ifdef CONFIG_NETWORKING
- if (*ret == STREAM_REDIRECTED && redirected_url) {
- if (s->streaming_ctrl && s->streaming_ctrl->url
- && s->streaming_ctrl->url->url)
- *redirected_url = strdup(s->streaming_ctrl->url->url);
- else
- *redirected_url = NULL;
- }
- streaming_ctrl_free(s->streaming_ctrl);
+ if (*ret == STREAM_REDIRECTED && redirected_url) {
+ if (s->streaming_ctrl && s->streaming_ctrl->url
+ && s->streaming_ctrl->url->url)
+ *redirected_url = strdup(s->streaming_ctrl->url->url);
+ else
+ *redirected_url = NULL;
+ }
+ streaming_ctrl_free(s->streaming_ctrl);
#endif
- free(s->url);
- talloc_free(s);
- return NULL;
- }
+ free(s->url);
+ talloc_free(s);
+ return NULL;
+ }
- if (s->streaming && !s->cache_size) {
- // Set default cache size to use if user does not specify it.
- s->cache_size = 320;
- }
+ if (s->streaming && !s->cache_size) {
+ // Set default cache size to use if user does not specify it.
+ s->cache_size = 320;
+ }
- if(s->type <= -2)
- mp_msg(MSGT_OPEN,MSGL_WARN, "Warning streams need a type !!!!\n");
- if(s->flags & MP_STREAM_SEEK && !s->seek)
- s->flags &= ~MP_STREAM_SEEK;
- if(s->seek && !(s->flags & MP_STREAM_SEEK))
- s->flags |= MP_STREAM_SEEK;
+ if (s->type <= -2)
+ mp_msg(MSGT_OPEN, MSGL_WARN, "Warning streams need a type !!!!\n");
+ if (s->flags & MP_STREAM_SEEK && !s->seek)
+ s->flags &= ~MP_STREAM_SEEK;
+ if (s->seek && !(s->flags & MP_STREAM_SEEK))
+ s->flags |= MP_STREAM_SEEK;
- s->mode = mode;
+ s->mode = mode;
- mp_msg(MSGT_OPEN,MSGL_V, "STREAM: [%s] %s\n",sinfo->name,filename);
- mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Description: %s\n",sinfo->info);
- mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Author: %s\n", sinfo->author);
- mp_msg(MSGT_OPEN,MSGL_V, "STREAM: Comment: %s\n", sinfo->comment);
+ mp_msg(MSGT_OPEN, MSGL_V, "STREAM: [%s] %s\n", sinfo->name, filename);
+ mp_msg(MSGT_OPEN, MSGL_V, "STREAM: Description: %s\n", sinfo->info);
+ mp_msg(MSGT_OPEN, MSGL_V, "STREAM: Author: %s\n", sinfo->author);
+ mp_msg(MSGT_OPEN, MSGL_V, "STREAM: Comment: %s\n", sinfo->comment);
- if (s->mime_type)
- mp_msg(MSGT_OPEN, MSGL_V, "Mime-type: '%s'\n", s->mime_type);
+ if (s->mime_type)
+ mp_msg(MSGT_OPEN, MSGL_V, "Mime-type: '%s'\n", s->mime_type);
- return s;
+ return s;
}
static stream_t *open_stream_full(const char *filename, int mode,
struct MPOpts *options, int *file_format)
{
- int i,j,l,r;
- const stream_info_t* sinfo;
- stream_t* s;
- char *redirected_url = NULL;
-
- assert(filename);
-
- int dummy;
- if (!file_format)
- file_format = &dummy;
-
- *file_format = DEMUXER_TYPE_UNKNOWN;
-
- for(i = 0 ; auto_open_streams[i] ; i++) {
- sinfo = auto_open_streams[i];
- if(!sinfo->protocols) {
- mp_msg(MSGT_OPEN,MSGL_WARN, "Stream type %s has protocols == NULL, it's a bug\n", sinfo->name);
- continue;
- }
- for(j = 0 ; sinfo->protocols[j] ; j++) {
- l = strlen(sinfo->protocols[j]);
- // l == 0 => Don't do protocol matching (ie network and filenames)
- if((l == 0 && !strstr(filename, "://")) ||
- ((strncasecmp(sinfo->protocols[j],filename,l) == 0) &&
- (strncmp("://",filename+l,3) == 0))) {
- *file_format = DEMUXER_TYPE_UNKNOWN;
- s = open_stream_plugin(sinfo,filename,mode,options,file_format,&r,
- &redirected_url);
- if(s) return s;
- if(r == STREAM_REDIRECTED && redirected_url) {
- mp_msg(MSGT_OPEN,MSGL_V, "[%s] open %s redirected to %s\n",
- sinfo->info, filename, redirected_url);
- s = open_stream_full(redirected_url, mode, options, file_format);
- free(redirected_url);
- return s;
- }
- else if(r != STREAM_UNSUPPORTED) {
- mp_tmsg(MSGT_OPEN,MSGL_ERR, "Failed to open %s.\n",filename);
- return NULL;
- }
- break;
- }
+ int i, j, l, r;
+ const stream_info_t *sinfo;
+ stream_t *s;
+ char *redirected_url = NULL;
+
+ assert(filename);
+
+ int dummy;
+ if (!file_format)
+ file_format = &dummy;
+
+ *file_format = DEMUXER_TYPE_UNKNOWN;
+
+ for (i = 0; auto_open_streams[i]; i++) {
+ sinfo = auto_open_streams[i];
+ if (!sinfo->protocols) {
+ mp_msg(MSGT_OPEN, MSGL_WARN,
+ "Stream type %s has protocols == NULL, it's a bug\n",
+ sinfo->name);
+ continue;
+ }
+ for (j = 0; sinfo->protocols[j]; j++) {
+ l = strlen(sinfo->protocols[j]);
+ // l == 0 => Don't do protocol matching (ie network and filenames)
+ if ((l == 0 && !strstr(filename, "://")) ||
+ ((strncasecmp(sinfo->protocols[j], filename, l) == 0) &&
+ (strncmp("://", filename + l, 3) == 0))) {
+ *file_format = DEMUXER_TYPE_UNKNOWN;
+ s =
+ open_stream_plugin(sinfo, filename, mode, options,
+ file_format,
+ &r,
+ &redirected_url);
+ if (s)
+ return s;
+ if (r == STREAM_REDIRECTED && redirected_url) {
+ mp_msg(MSGT_OPEN, MSGL_V, "[%s] open %s redirected to %s\n",
+ sinfo->info, filename, redirected_url);
+ s = open_stream_full(redirected_url, mode, options,
+ file_format);
+ free(redirected_url);
+ return s;
+ } else if (r != STREAM_UNSUPPORTED) {
+ mp_tmsg(MSGT_OPEN, MSGL_ERR, "Failed to open %s.\n",
+ filename);
+ return NULL;
+ }
+ break;
+ }
+ }
}
- }
- mp_tmsg(MSGT_OPEN,MSGL_ERR, "No stream found to handle url %s\n", filename);
- return NULL;
+ mp_tmsg(MSGT_OPEN, MSGL_ERR, "No stream found to handle url %s\n", filename);
+ return NULL;
}
-stream_t* open_stream(const char *filename, struct MPOpts *options,
+stream_t *open_stream(const char *filename, struct MPOpts *options,
int *file_format)
{
- return open_stream_full(filename,STREAM_READ,options,file_format);
+ return open_stream_full(filename, STREAM_READ, options, file_format);
}
stream_t *open_output_stream(const char *filename, struct MPOpts *options)
{
- return open_stream_full(filename,STREAM_WRITE,options,NULL);
+ return open_stream_full(filename, STREAM_WRITE, options, NULL);
}
//=================== STREAMER =========================
@@ -284,9 +294,10 @@ static int stream_reconnect(stream_t *s)
do {
if (retry >= MAX_RECONNECT_RETRIES)
return 0;
- if (retry) usec_sleep(RECONNECT_SLEEP_MS * 1000);
+ if (retry)
+ usec_sleep(RECONNECT_SLEEP_MS * 1000);
retry++;
- s->eof=1;
+ s->eof = 1;
stream_reset(s);
} while (stream_seek_internal(s, pos) >= 0 || s->pos != pos); // seek failed
return 1;
@@ -294,195 +305,208 @@ static int stream_reconnect(stream_t *s)
int stream_read_internal(stream_t *s, void *buf, int len)
{
- int orig_len = len;
- // we will retry even if we already reached EOF previously.
- switch(s->type){
- case STREAMTYPE_STREAM:
-#ifdef CONFIG_NETWORKING
- if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_read ) {
- len=s->streaming_ctrl->streaming_read(s->fd, buf, len, s->streaming_ctrl);
- if (s->streaming_ctrl->status == streaming_stopped_e &&
- (!s->end_pos || s->pos == s->end_pos))
+ int orig_len = len;
+ // we will retry even if we already reached EOF previously.
+ switch (s->type) {
+ case STREAMTYPE_STREAM:
+ if (s->streaming_ctrl != NULL && s->streaming_ctrl->streaming_read) {
+ len = s->streaming_ctrl->streaming_read(s->fd, buf, len,
+ s->streaming_ctrl);
+ if (s->streaming_ctrl->status == streaming_stopped_e &&
+ (!s->end_pos || s->pos == s->end_pos))
+ s->eof = 1;
+ } else {
+ if (s->fill_buffer)
+ len = s->fill_buffer(s, buf, len);
+ else
+ len = read(s->fd, buf, len);
+ }
+ break;
+ case STREAMTYPE_DS:
+ len = demux_read_data((demux_stream_t *)s->priv, buf, len);
+ break;
+
+
+ default:
+ len = s->fill_buffer ? s->fill_buffer(s, buf, len) : 0;
+ }
+ if (len <= 0) {
+ // do not retry if this looks like proper eof
+ if (s->eof || (s->end_pos && s->pos == s->end_pos))
+ goto eof_out;
+
+ // just in case this is an error e.g. due to network
+ // timeout reset and retry
+ if (!stream_reconnect(s))
+ goto eof_out;
+ // make sure EOF is set to ensure no endless loops
s->eof = 1;
- } else
-#endif
- if (s->fill_buffer)
- len = s->fill_buffer(s, buf, len);
- else
- len = read(s->fd, buf, len);
- break;
- case STREAMTYPE_DS:
- len = demux_read_data((demux_stream_t*)s->priv, buf, len);
- break;
-
-
- default:
- len= s->fill_buffer ? s->fill_buffer(s, buf, len) : 0;
- }
- if(len<=0){
- // do not retry if this looks like proper eof
- if (s->eof || (s->end_pos && s->pos == s->end_pos))
- goto eof_out;
-
- // just in case this is an error e.g. due to network
- // timeout reset and retry
- if (!stream_reconnect(s))
- goto eof_out;
- // make sure EOF is set to ensure no endless loops
- s->eof=1;
- return stream_read_internal(s, buf, orig_len);
+ return stream_read_internal(s, buf, orig_len);
eof_out:
- s->eof=1;
- return 0;
- }
- // When reading succeeded we are obviously not at eof.
- // This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS
- s->eof=0;
- s->pos+=len;
- return len;
+ s->eof = 1;
+ return 0;
+ }
+ // When reading succeeded we are obviously not at eof.
+ // This e.g. avoids issues with eof getting stuck when lavf seeks in MPEG-TS
+ s->eof = 0;
+ s->pos += len;
+ return len;
}
-int stream_fill_buffer(stream_t *s){
- int len = stream_read_internal(s, s->buffer, STREAM_BUFFER_SIZE);
- if (len <= 0)
- return 0;
- s->buf_pos=0;
- s->buf_len=len;
+int stream_fill_buffer(stream_t *s)
+{
+ int len = stream_read_internal(s, s->buffer, STREAM_BUFFER_SIZE);
+ if (len <= 0)
+ return 0;
+ s->buf_pos = 0;
+ s->buf_len = len;
// printf("[%d]",len);fflush(stdout);
- return len;
+ return len;
}
-int stream_write_buffer(stream_t *s, unsigned char *buf, int len) {
- int rd;
- if(!s->write_buffer)
- return -1;
- rd = s->write_buffer(s, buf, len);
- if(rd < 0)
- return -1;
- s->pos += rd;
- assert(rd == len && "stream_write_buffer(): unexpected short write");
- return rd;
+int stream_write_buffer(stream_t *s, unsigned char *buf, int len)
+{
+ int rd;
+ if (!s->write_buffer)
+ return -1;
+ rd = s->write_buffer(s, buf, len);
+ if (rd < 0)
+ return -1;
+ s->pos += rd;
+ assert(rd == len && "stream_write_buffer(): unexpected short write");
+ return rd;
}
int stream_seek_internal(stream_t *s, int64_t newpos)
{
-if(newpos==0 || newpos!=s->pos){
- switch(s->type){
- case STREAMTYPE_STREAM:
- //s->pos=newpos; // real seek
- // Some streaming protocol allow to seek backward and forward
- // A function call that return -1 can tell that the protocol
- // doesn't support seeking.
+ if (newpos == 0 || newpos != s->pos) {
+ switch (s->type) {
+ case STREAMTYPE_STREAM:
+ //s->pos=newpos; // real seek
+ // Some streaming protocol allow to seek backward and forward
+ // A function call that return -1 can tell that the protocol
+ // doesn't support seeking.
#ifdef CONFIG_NETWORKING
- if(s->seek) { // new stream seek is much cleaner than streaming_ctrl one
- if(!s->seek(s,newpos)) {
- mp_tmsg(MSGT_STREAM,MSGL_ERR, "Seek failed\n");
- return 0;
- }
- break;
- }
-
- if( s->streaming_ctrl!=NULL && s->streaming_ctrl->streaming_seek ) {
- if( s->streaming_ctrl->streaming_seek( s->fd, newpos, s->streaming_ctrl )<0 ) {
- mp_tmsg(MSGT_STREAM,MSGL_INFO,"Stream not seekable!\n");
- return 1;
- }
- break;
- }
+ if (s->seek) { // new stream seek is much cleaner than streaming_ctrl one
+ if (!s->seek(s, newpos)) {
+ mp_tmsg(MSGT_STREAM, MSGL_ERR, "Seek failed\n");
+ return 0;
+ }
+ break;
+ }
+
+ if (s->streaming_ctrl != NULL &&
+ s->streaming_ctrl->streaming_seek) {
+ if (s->streaming_ctrl->streaming_seek(s->fd, newpos,
+ s->streaming_ctrl) < 0) {
+ mp_tmsg(MSGT_STREAM, MSGL_INFO, "Stream not seekable!\n");
+ return 1;
+ }
+ break;
+ }
#endif
- if(newpos<s->pos){
- mp_tmsg(MSGT_STREAM, MSGL_INFO,
- "Cannot seek backward in linear streams!\n");
- return 1;
- }
- break;
- default:
- // This should at the beginning as soon as all streams are converted
- if(!s->seek)
- return 0;
- // Now seek
- if(!s->seek(s,newpos)) {
- mp_tmsg(MSGT_STREAM,MSGL_ERR, "Seek failed\n");
- return 0;
- }
- }
+ if (newpos < s->pos) {
+ mp_tmsg(MSGT_STREAM, MSGL_INFO,
+ "Cannot seek backward in linear streams!\n");
+ return 1;
+ }
+ break;
+ default:
+ // This should at the beginning as soon as all streams are converted
+ if (!s->seek)
+ return 0;
+ // Now seek
+ if (!s->seek(s, newpos)) {
+ mp_tmsg(MSGT_STREAM, MSGL_ERR, "Seek failed\n");
+ return 0;
+ }
+ }
// putchar('.');fflush(stdout);
//} else {
// putchar('%');fflush(stdout);
-}
- return -1;
+ }
+ return -1;
}
-int stream_seek_long(stream_t *s,int64_t pos){
- int res;
-int64_t newpos=0;
+int stream_seek_long(stream_t *s, int64_t pos)
+{
+ int res;
+ int64_t newpos = 0;
// if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ) printf("seek_long to 0x%X\n",(unsigned int)pos);
- s->buf_pos=s->buf_len=0;
-
- if(s->mode == STREAM_WRITE) {
- if(!s->seek || !s->seek(s,pos))
- return 0;
- return 1;
- }
+ s->buf_pos = s->buf_len = 0;
- if(s->sector_size)
- newpos = (pos/s->sector_size)*s->sector_size;
- else
- newpos = pos&(~((int64_t)STREAM_BUFFER_SIZE-1));
+ if (s->mode == STREAM_WRITE) {
+ if (!s->seek || !s->seek(s, pos))
+ return 0;
+ return 1;
+ }
-if( mp_msg_test(MSGT_STREAM,MSGL_DBG3) ){
- mp_msg(MSGT_STREAM,MSGL_DBG3, "s->pos=%"PRIX64" newpos=%"PRIX64" new_bufpos=%"PRIX64" buflen=%X \n",
- (int64_t)s->pos,(int64_t)newpos,(int64_t)pos,s->buf_len);
-}
- pos-=newpos;
+ if (s->sector_size)
+ newpos = (pos / s->sector_size) * s->sector_size;
+ else
+ newpos = pos & (~((int64_t)STREAM_BUFFER_SIZE - 1));
+
+ if (mp_msg_test(MSGT_STREAM, MSGL_DBG3)) {
+ mp_msg(
+ MSGT_STREAM, MSGL_DBG3,
+ "s->pos=%" PRIX64 " newpos=%" PRIX64 " new_bufpos=%" PRIX64
+ " buflen=%X \n",
+ (int64_t)s->pos, (int64_t)newpos, (int64_t)pos, s->buf_len);
+ }
+ pos -= newpos;
- res = stream_seek_internal(s, newpos);
- if (res >= 0)
- return res;
+ res = stream_seek_internal(s, newpos);
+ if (res >= 0)
+ return res;
- while(s->pos<newpos){
- if(stream_fill_buffer(s)<=0) break; // EOF
- }
+ while (s->pos < newpos) {
+ if (stream_fill_buffer(s) <= 0)
+ break; // EOF
+ }
-s->eof = 0; // EOF reset when seek succeeds.
-while (stream_fill_buffer(s) > 0) {
- if(pos<=s->buf_len){
- s->buf_pos=pos; // byte position in sector
- return 1;
- }
- pos -= s->buf_len;
-}
+ s->eof = 0; // EOF reset when seek succeeds.
+ while (stream_fill_buffer(s) > 0) {
+ if (pos <= s->buf_len) {
+ s->buf_pos = pos; // byte position in sector
+ return 1;
+ }
+ pos -= s->buf_len;
+ }
// Fill failed, but seek still is a success.
-s->pos += pos;
-s->buf_pos = 0;
-s->buf_len = 0;
+ s->pos += pos;
+ s->buf_pos = 0;
+ s->buf_len = 0;
-mp_msg(MSGT_STREAM,MSGL_V,
- "stream_seek: Seek to/past EOF: no buffer preloaded.\n");
-return 1;
+ mp_msg(MSGT_STREAM, MSGL_V,
+ "stream_seek: Seek to/past EOF: no buffer preloaded.\n");
+ return 1;
}
-void stream_reset(stream_t *s){
- if(s->eof){
- s->pos=0;
- s->buf_pos=s->buf_len=0;
- s->eof=0;
- }
- if(s->control) s->control(s,STREAM_CTRL_RESET,NULL);
- //stream_seek(s,0);
+void stream_reset(stream_t *s)
+{
+ if (s->eof) {
+ s->pos = 0;
+ s->buf_pos = s->buf_len = 0;
+ s->eof = 0;
+ }
+ if (s->control)
+ s->control(s, STREAM_CTRL_RESET, NULL);
+ //stream_seek(s,0);
}
-int stream_control(stream_t *s, int cmd, void *arg){
+int stream_control(stream_t *s, int cmd, void *arg)
+{
#ifdef CONFIG_STREAM_CACHE
- if (s->cache_pid)
- return cache_do_control(s, cmd, arg);
+ if (s->cache_pid)
+ return cache_do_control(s, cmd, arg);
#endif
- if(!s->control) return STREAM_UNSUPPORTED;
- return s->control(s, cmd, arg);
+ if (!s->control)
+ return STREAM_UNSUPPORTED;
+ return s->control(s, cmd, arg);
}
void stream_update_size(stream_t *s)
@@ -494,66 +518,74 @@ void stream_update_size(stream_t *s)
}
}
-stream_t* new_memory_stream(unsigned char* data,int len){
- stream_t *s;
-
- if(len < 0)
- return NULL;
- s=calloc(1, sizeof(stream_t)+len);
- s->fd=-1;
- s->type=STREAMTYPE_MEMORY;
- s->buf_pos=0; s->buf_len=len;
- s->start_pos=0; s->end_pos=len;
- stream_reset(s);
- s->pos=len;
- memcpy(s->buffer,data,len);
- return s;
+stream_t *new_memory_stream(unsigned char *data, int len)
+{
+ stream_t *s;
+
+ if (len < 0)
+ return NULL;
+ s = calloc(1, sizeof(stream_t) + len);
+ s->fd = -1;
+ s->type = STREAMTYPE_MEMORY;
+ s->buf_pos = 0;
+ s->buf_len = len;
+ s->start_pos = 0;
+ s->end_pos = len;
+ stream_reset(s);
+ s->pos = len;
+ memcpy(s->buffer, data, len);
+ return s;
}
-stream_t* new_stream(int fd,int type){
- stream_t *s=talloc_zero(NULL, stream_t);
+stream_t *new_stream(int fd, int type)
+{
+ stream_t *s = talloc_zero(NULL, stream_t);
#if HAVE_WINSOCK2_H
- {
- WSADATA wsdata;
- int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later)
- mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 init: %i\n", temp);
- }
+ {
+ WSADATA wsdata;
+ int temp = WSAStartup(0x0202, &wsdata); // there might be a better place for this (-> later)
+ mp_msg(MSGT_STREAM, MSGL_V, "WINSOCK2 init: %i\n", temp);
+ }
#endif
- s->fd=fd;
- s->type=type;
- stream_reset(s);
- return s;
+ s->fd = fd;
+ s->type = type;
+ stream_reset(s);
+ return s;
}
-void free_stream(stream_t *s){
+void free_stream(stream_t *s)
+{
// printf("\n*** free_stream() called ***\n");
#ifdef CONFIG_STREAM_CACHE
cache_uninit(s);
#endif
- if(s->close) s->close(s);
- if(s->fd>0){
- /* on unix we define closesocket to close
- on windows however we have to distinguish between
- network socket and file */
- if(s->url && strstr(s->url,"://"))
- closesocket(s->fd);
- else close(s->fd);
- }
+ if (s->close)
+ s->close(s);
+ if (s->fd > 0) {
+ /* on unix we define closesocket to close
+ on windows however we have to distinguish between
+ network socket and file */
+ if (s->url && strstr(s->url, "://"))
+ closesocket(s->fd);
+ else
+ close(s->fd);
+ }
#if HAVE_WINSOCK2_H
- mp_msg(MSGT_STREAM,MSGL_V,"WINSOCK2 uninit\n");
- WSACleanup(); // there might be a better place for this (-> later)
+ mp_msg(MSGT_STREAM, MSGL_V, "WINSOCK2 uninit\n");
+ WSACleanup(); // there might be a better place for this (-> later)
#endif
- free(s->url);
- talloc_free(s);
+ free(s->url);
+ talloc_free(s);
}
-stream_t* new_ds_stream(demux_stream_t *ds) {
- stream_t* s = new_stream(-1,STREAMTYPE_DS);
- s->priv = ds;
- return s;
+stream_t *new_ds_stream(demux_stream_t *ds)
+{
+ stream_t *s = new_stream(-1, STREAMTYPE_DS);
+ s->priv = ds;
+ return s;
}
void stream_set_interrupt_callback(int (*cb)(struct input_ctx *, int),
@@ -563,8 +595,9 @@ void stream_set_interrupt_callback(int (*cb)(struct input_ctx *, int),
stream_check_interrupt_ctx = ctx;
}
-int stream_check_interrupt(int time) {
- if(!stream_check_interrupt_cb) {
+int stream_check_interrupt(int time)
+{
+ if (!stream_check_interrupt_cb) {
usec_sleep(time * 1000);
return 0;
}
@@ -576,9 +609,9 @@ int stream_check_interrupt(int time) {
*/
static uint16_t get_le16_inc(const uint8_t **buf)
{
- uint16_t v = AV_RL16(*buf);
- *buf += 2;
- return v;
+ uint16_t v = AV_RL16(*buf);
+ *buf += 2;
+ return v;
}
/**
@@ -586,9 +619,9 @@ static uint16_t get_le16_inc(const uint8_t **buf)
*/
static uint16_t get_be16_inc(const uint8_t **buf)
{
- uint16_t v = AV_RB16(*buf);
- *buf += 2;
- return v;
+ uint16_t v = AV_RB16(*buf);
+ *buf += 2;
+ return v;
}
/**
@@ -600,27 +633,29 @@ static uint16_t get_be16_inc(const uint8_t **buf)
*/
static const uint8_t *find_newline(const uint8_t *buf, int len, int utf16)
{
- uint32_t c;
- const uint8_t *end = buf + len;
- switch (utf16) {
- case 0:
- return (uint8_t *)memchr(buf, '\n', len);
- case 1:
- while (buf < end - 1) {
- GET_UTF16(c, buf < end - 1 ? get_le16_inc(&buf) : 0, return NULL;)
- if (buf <= end && c == '\n')
- return buf - 1;
- }
- break;
- case 2:
- while (buf < end - 1) {
- GET_UTF16(c, buf < end - 1 ? get_be16_inc(&buf) : 0, return NULL;)
- if (buf <= end && c == '\n')
- return buf - 1;
+ uint32_t c;
+ const uint8_t *end = buf + len;
+ switch (utf16) {
+ case 0:
+ return (uint8_t *)memchr(buf, '\n', len);
+ case 1:
+ while (buf < end - 1) {
+ GET_UTF16(c, buf < end - 1 ? get_le16_inc(&buf) : 0, return NULL;
+ )
+ if (buf <= end && c == '\n')
+ return buf - 1;
+ }
+ break;
+ case 2:
+ while (buf < end - 1) {
+ GET_UTF16(c, buf < end - 1 ? get_be16_inc(&buf) : 0, return NULL;
+ )
+ if (buf <= end && c == '\n')
+ return buf - 1;
+ }
+ break;
}
- break;
- }
- return NULL;
+ return NULL;
}
/**
@@ -635,61 +670,72 @@ static const uint8_t *find_newline(const uint8_t *buf, int len, int utf16)
static int copy_characters(uint8_t *dst, int dstsize,
const uint8_t *src, int *len, int utf16)
{
- uint32_t c;
- uint8_t *dst_end = dst + dstsize;
- const uint8_t *end = src + *len;
- switch (utf16) {
- case 0:
- if (*len > dstsize)
- *len = dstsize;
- memcpy(dst, src, *len);
- return *len;
- case 1:
- while (src < end - 1 && dst_end - dst > 8) {
- uint8_t tmp;
- GET_UTF16(c, src < end - 1 ? get_le16_inc(&src) : 0, ;)
- PUT_UTF8(c, tmp, *dst++ = tmp;)
- }
- *len -= end - src;
- return dstsize - (dst_end - dst);
- case 2:
- while (src < end - 1 && dst_end - dst > 8) {
- uint8_t tmp;
- GET_UTF16(c, src < end - 1 ? get_be16_inc(&src) : 0, ;)
- PUT_UTF8(c, tmp, *dst++ = tmp;)
+ uint32_t c;
+ uint8_t *dst_end = dst + dstsize;
+ const uint8_t *end = src + *len;
+ switch (utf16) {
+ case 0:
+ if (*len > dstsize)
+ *len = dstsize;
+ memcpy(dst, src, *len);
+ return *len;
+ case 1:
+ while (src < end - 1 && dst_end - dst > 8) {
+ uint8_t tmp;
+ GET_UTF16(c, src < end - 1 ? get_le16_inc(&src) : 0,;
+ )
+ PUT_UTF8(c, tmp, *dst++ = tmp;
+ )
+ }
+ *len -= end - src;
+ return dstsize - (dst_end - dst);
+ case 2:
+ while (src < end - 1 && dst_end - dst > 8) {
+ uint8_t tmp;
+ GET_UTF16(c, src < end - 1 ? get_be16_inc(&src) : 0,;
+ )
+ PUT_UTF8(c, tmp, *dst++ = tmp;
+ )
+ }
+ *len -= end - src;
+ return dstsize - (dst_end - dst);
}
- *len -= end - src;
- return dstsize - (dst_end - dst);
- }
- return 0;
+ return 0;
}
-unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max, int utf16) {
- int len;
- const unsigned char *end;
- unsigned char *ptr = mem;
- if (max < 1) return NULL;
- max--; // reserve one for 0-termination
- do {
- len = s->buf_len-s->buf_pos;
- // try to fill the buffer
- if(len <= 0 &&
- (!cache_stream_fill_buffer(s) ||
- (len = s->buf_len-s->buf_pos) <= 0)) break;
- end = find_newline(s->buffer+s->buf_pos, len, utf16);
- if(end) len = end - (s->buffer+s->buf_pos) + 1;
- if(len > 0 && max > 0) {
- int l = copy_characters(ptr, max, s->buffer+s->buf_pos, &len, utf16);
- max -= l;
- ptr += l;
- if (!len)
- break;
- }
- s->buf_pos += len;
- } while(!end);
- ptr[0] = 0;
- if(s->eof && ptr == mem) return NULL;
- return mem;
+unsigned char *stream_read_line(stream_t *s, unsigned char *mem, int max,
+ int utf16)
+{
+ int len;
+ const unsigned char *end;
+ unsigned char *ptr = mem;
+ if (max < 1)
+ return NULL;
+ max--; // reserve one for 0-termination
+ do {
+ len = s->buf_len - s->buf_pos;
+ // try to fill the buffer
+ if (len <= 0 &&
+ (!cache_stream_fill_buffer(s) ||
+ (len = s->buf_len - s->buf_pos) <= 0))
+ break;
+ end = find_newline(s->buffer + s->buf_pos, len, utf16);
+ if (end)
+ len = end - (s->buffer + s->buf_pos) + 1;
+ if (len > 0 && max > 0) {
+ int l = copy_characters(ptr, max, s->buffer + s->buf_pos, &len,
+ utf16);
+ max -= l;
+ ptr += l;
+ if (!len)
+ break;
+ }
+ s->buf_pos += len;
+ } while (!end);
+ ptr[0] = 0;
+ if (s->eof && ptr == mem)
+ return NULL;
+ return mem;
}
struct bstr stream_read_complete(struct stream *s, void *talloc_ctx,
@@ -703,7 +749,9 @@ struct bstr stream_read_complete(struct stream *s, void *talloc_ctx,
int padding = FFMAX(padding_bytes, 1);
char *buf = NULL;
if (s->end_pos > max_size)
- return (struct bstr){NULL, 0};
+ return (struct bstr){
+ NULL, 0
+ };
if (s->end_pos > 0)
bufsize = s->end_pos + padding;
else
@@ -716,10 +764,14 @@ struct bstr stream_read_complete(struct stream *s, void *talloc_ctx,
break;
if (bufsize > max_size) {
talloc_free(buf);
- return (struct bstr){NULL, 0};
+ return (struct bstr){
+ NULL, 0
+ };
}
bufsize = FFMIN(bufsize + (bufsize >> 1), max_size + padding);
}
buf = talloc_realloc_size(talloc_ctx, buf, total_read + padding);
- return (struct bstr){buf, total_read};
+ return (struct bstr){
+ buf, total_read
+ };
}
diff --git a/stream/stream.h b/stream/stream.h
index 43980197e7..4beefc91bd 100644
--- a/stream/stream.h
+++ b/stream/stream.h
@@ -57,7 +57,7 @@
#define STREAMTYPE_AVDEVICE 21
#define STREAM_BUFFER_SIZE 2048
-#define STREAM_MAX_SECTOR_SIZE (8*1024)
+#define STREAM_MAX_SECTOR_SIZE (8 * 1024)
#define VCD_SECTOR_SIZE 2352
#define VCD_SECTOR_OFFS 24
@@ -71,7 +71,7 @@
/// MP_STREAM_SEEK is automaticly set
#define MP_STREAM_SEEK_BW 2
#define MP_STREAM_SEEK_FW 4
-#define MP_STREAM_SEEK (MP_STREAM_SEEK_BW|MP_STREAM_SEEK_FW)
+#