From 47cec752915a5aa6780b844247b285f5e96536e9 Mon Sep 17 00:00:00 2001 From: wm4 Date: Thu, 24 Jan 2013 17:43:07 +0100 Subject: stream: uncrustify stream.c/.h The formatting almost made me break out in tears. --- stream/stream.c | 870 ++++++++++++++++++++++++++++++-------------------------- stream/stream.h | 376 +++++++++++++----------- 2 files changed, 664 insertions(+), 582 deletions(-) (limited to 'stream') 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(newpospos){ - 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->pospos < 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) +#define MP_STREAM_SEEK (MP_STREAM_SEEK_BW | MP_STREAM_SEEK_FW) //////////// Open return code #define STREAM_REDIRECTED -2 @@ -103,26 +103,28 @@ #define STREAM_CTRL_GET_CACHE_IDLE 17 struct stream_lang_req { - int type; // STREAM_AUDIO, STREAM_SUB - int id; - char name[50]; + int type; // STREAM_AUDIO, STREAM_SUB + int id; + char name[50]; }; typedef enum { - streaming_stopped_e, - streaming_playing_e + streaming_stopped_e, + streaming_playing_e } streaming_status; typedef struct streaming_control { - URL_t *url; - streaming_status status; - char *buffer; - unsigned int buffer_size; - unsigned int buffer_pos; - unsigned int bandwidth; // The downstream available - int (*streaming_read)( int fd, char *buffer, int buffer_size, struct streaming_control *stream_ctrl ); - int (*streaming_seek)( int fd, int64_t pos, struct streaming_control *stream_ctrl ); - void *data; + URL_t *url; + streaming_status status; + char *buffer; + unsigned int buffer_size; + unsigned int buffer_pos; + unsigned int bandwidth; // The downstream available + int (*streaming_read)(int fd, char *buffer, int buffer_size, + struct streaming_control *stream_ctrl); + int (*streaming_seek)(int fd, int64_t pos, + struct streaming_control *stream_ctrl); + void *data; // hacks for asf int *audio_id_ptr; int *video_id_ptr; @@ -130,56 +132,58 @@ typedef struct streaming_control { struct stream; typedef struct stream_info_st { - const char *info; - const char *name; - const char *author; - const char *comment; - /// mode isn't used atm (ie always READ) but it shouldn't be ignored - /// opts is at least in it's defaults settings and may have been - /// altered by url parsing if enabled and the options string parsing. - int (*open)(struct stream* st, int mode, void* opts, int* file_format); - const char* protocols[MAX_STREAM_PROTOCOLS]; - const void* opts; - int opts_url; /* If this is 1 we will parse the url as an option string - * too. Otherwise options are only parsed from the - * options string given to open_stream_plugin */ + const char *info; + const char *name; + const char *author; + const char *comment; + /// mode isn't used atm (ie always READ) but it shouldn't be ignored + /// opts is at least in it's defaults settings and may have been + /// altered by url parsing if enabled and the options string parsing. + int (*open)(struct stream *st, int mode, void *opts, int *file_format); + const char *protocols[MAX_STREAM_PROTOCOLS]; + const void *opts; + int opts_url; /* If this is 1 we will parse the url as an option string + * too. Otherwise options are only parsed from the + * options string given to open_stream_plugin */ } stream_info_t; typedef struct stream { - // Read - int (*fill_buffer)(struct stream *s, char* buffer, int max_len); - // Write - int (*write_buffer)(struct stream *s, char* buffer, int len); - // Seek - int (*seek)(struct stream *s,int64_t pos); - // Control - // Will be later used to let streams like dvd and cdda report - // their structure (ie tracks, chapters, etc) - int (*control)(struct stream *s,int cmd,void* arg); - // Close - void (*close)(struct stream *s); - - int fd; // file descriptor, see man open(2) - int type; // see STREAMTYPE_* - int flags; - int sector_size; // sector size (seek will be aligned on this size if non 0) - int read_chunk; // maximum amount of data to read at once to limit latency (0 for default) - unsigned int buf_pos,buf_len; - int64_t pos,start_pos,end_pos; - int eof; - int mode; //STREAM_READ or STREAM_WRITE - bool streaming; // known to be a network stream if true - int cache_size; // cache size in KB to use if enabled - bool cached; // cache active - unsigned int cache_pid; - void* cache_data; - void* priv; // used for DVD, TV, RTSP etc - char* url; // strdup() of filename/url - char *mime_type; // when HTTP streaming is used - char *lavf_type; // name of expected demuxer type for lavf - struct MPOpts *opts; - streaming_ctrl_t *streaming_ctrl; - unsigned char buffer[STREAM_BUFFER_SIZE>STREAM_MAX_SECTOR_SIZE?STREAM_BUFFER_SIZE:STREAM_MAX_SECTOR_SIZE]; + // Read + int (*fill_buffer)(struct stream *s, char *buffer, int max_len); + // Write + int (*write_buffer)(struct stream *s, char *buffer, int len); + // Seek + int (*seek)(struct stream *s, int64_t pos); + // Control + // Will be later used to let streams like dvd and cdda report + // their structure (ie tracks, chapters, etc) + int (*control)(struct stream *s, int cmd, void *arg); + // Close + void (*close)(struct stream *s); + + int fd; // file descriptor, see man open(2) + int type; // see STREAMTYPE_* + int flags; + int sector_size; // sector size (seek will be aligned on this size if non 0) + int read_chunk; // maximum amount of data to read at once to limit latency (0 for default) + unsigned int buf_pos, buf_len; + int64_t pos, start_pos, end_pos; + int eof; + int mode; //STREAM_READ or STREAM_WRITE + bool streaming; // known to be a network stream if true + int cache_size; // cache size in KB to use if enabled + bool cached; // cache active + unsigned int cache_pid; + void *cache_data; + void *priv; // used for DVD, TV, RTSP etc + char *url; // strdup() of filename/url + char *mime_type; // when HTTP streaming is used + char *lavf_type; // name of expected demuxer type for lavf + struct MPOpts *opts; + streaming_ctrl_t *streaming_ctrl; + unsigned char buffer[STREAM_BUFFER_SIZE > + STREAM_MAX_SECTOR_SIZE ? STREAM_BUFFER_SIZE : + STREAM_MAX_SECTOR_SIZE]; } stream_t; #ifdef CONFIG_NETWORKING @@ -191,156 +195,182 @@ int stream_seek_long(stream_t *s, int64_t pos); #ifdef CONFIG_STREAM_CACHE int stream_enable_cache_percent(stream_t *stream, int64_t stream_cache_size, - float stream_cache_min_percent, float stream_cache_seek_min_percent); -int stream_enable_cache(stream_t *stream,int64_t size,int64_t min,int64_t prefill); + float stream_cache_min_percent, + float stream_cache_seek_min_percent); +int stream_enable_cache(stream_t *stream, int64_t size, int64_t min, + int64_t prefill); int cache_stream_fill_buffer(stream_t *s); -int cache_stream_seek_long(stream_t *s,int64_t pos); +int cache_stream_seek_long(stream_t *s, int64_t pos); #else // no cache, define wrappers: #define cache_stream_fill_buffer(x) stream_fill_buffer(x) -#define cache_stream_seek_long(x,y) stream_seek_long(x,y) -#define stream_enable_cache(x,y,z,w) 1 -#define stream_enable_cache_percent(x,y,z,w) 1 +#define cache_stream_seek_long(x, y) stream_seek_long(x, y) +#define stream_enable_cache(x, y, z, w) 1 +#define stream_enable_cache_percent(x, y, z, w) 1 #endif int stream_write_buffer(stream_t *s, unsigned char *buf, int len); -inline static int stream_read_char(stream_t *s){ - return (s->buf_posbuf_len)?s->buffer[s->buf_pos++]: - (cache_stream_fill_buffer(s)?s->buffer[s->buf_pos++]:-256); +inline static int stream_read_char(stream_t *s) +{ + return (s->buf_pos < s->buf_len) ? s->buffer[s->buf_pos++] : + (cache_stream_fill_buffer(s) ? s->buffer[s->buf_pos++] : -256); // if(s->buf_posbuf_len) return s->buffer[s->buf_pos++]; // stream_fill_buffer(s); // if(s->buf_posbuf_len) return s->buffer[s->buf_pos++]; // return 0; // EOF } -inline static unsigned int stream_read_word(stream_t *s){ - int x,y; - x=stream_read_char(s); - y=stream_read_char(s); - return (x<<8)|y; +inline static unsigned int stream_read_word(stream_t *s) +{ + int x, y; + x = stream_read_char(s); + y = stream_read_char(s); + return (x << 8) | y; } -inline static unsigned int stream_read_dword(stream_t *s){ - unsigned int y; - y=stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - return y; +inline static unsigned int stream_read_dword(stream_t *s) +{ + unsigned int y; + y = stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + return y; } #define stream_read_fourcc stream_read_dword_le -inline static unsigned int stream_read_word_le(stream_t *s){ - int x,y; - x=stream_read_char(s); - y=stream_read_char(s); - return (y<<8)|x; +inline static unsigned int stream_read_word_le(stream_t *s) +{ + int x, y; + x = stream_read_char(s); + y = stream_read_char(s); + return (y << 8) | x; } inline static uint32_t stream_read_dword_le(stream_t *s) { - unsigned int y; - y=stream_read_char(s); - y|=stream_read_char(s)<<8; - y|=stream_read_char(s)<<16; - y|=stream_read_char(s)<<24; - return y; + unsigned int y; + y = stream_read_char(s); + y |= stream_read_char(s) << 8; + y |= stream_read_char(s) << 16; + y |= stream_read_char(s) << 24; + return y; } -inline static uint64_t stream_read_qword(stream_t *s){ - uint64_t y; - y = stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - return y; +inline static uint64_t stream_read_qword(stream_t *s) +{ + uint64_t y; + y = stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + return y; } -inline static uint64_t stream_read_qword_le(stream_t *s){ - uint64_t y; - y = stream_read_dword_le(s); - y|=(uint64_t)stream_read_dword_le(s)<<32; - return y; +inline static uint64_t stream_read_qword_le(stream_t *s) +{ + uint64_t y; + y = stream_read_dword_le(s); + y |= (uint64_t)stream_read_dword_le(s) << 32; + return y; } -inline static unsigned int stream_read_int24(stream_t *s){ - unsigned int y; - y = stream_read_char(s); - y=(y<<8)|stream_read_char(s); - y=(y<<8)|stream_read_char(s); - return y; +inline static unsigned int stream_read_int24(stream_t *s) +{ + unsigned int y; + y = stream_read_char(s); + y = (y << 8) | stream_read_char(s); + y = (y << 8) | stream_read_char(s); + return y; } -inline static int stream_read(stream_t *s,char* mem,int total){ - int len=total; - while(len>0){ - int x; - x=s->buf_len-s->buf_pos; - if(x==0){ - if(!cache_stream_fill_buffer(s)) return total-len; // EOF - x=s->buf_len-s->buf_pos; +inline static int stream_read(stream_t *s, char *mem, int total) +{ + int len = total; + while (len > 0) { + int x; + x = s->buf_len - s->buf_pos; + if (x == 0) { + if (!cache_stream_fill_buffer(s)) + return total - len; // EOF + x = s->buf_len - s->buf_pos; + } + if (s->buf_pos > s->buf_len) + mp_msg(MSGT_DEMUX, MSGL_WARN, + "stream_read: WARNING! s->buf_pos>s->buf_len\n"); + if (x > len) + x = len; + memcpy(mem, &s->buffer[s->buf_pos], x); + s->buf_pos += x; + mem += x; + len -= x; } - if(s->buf_pos>s->buf_len) mp_msg(MSGT_DEMUX, MSGL_WARN, "stream_read: WARNING! s->buf_pos>s->buf_len\n"); - if(x>len) x=len; - memcpy(mem,&s->buffer[s->buf_pos],x); - s->buf_pos+=x; mem+=x; len-=x; - } - return total; + return total; } -unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max, int utf16); +unsigned char *stream_read_line(stream_t *s, unsigned char *mem, int max, + int utf16); -inline static int stream_eof(stream_t *s){ - return s->eof; +inline static int stream_eof(stream_t *s) +{ + return s->eof; } -inline static int64_t stream_tell(stream_t *s){ - return s->pos+s->buf_pos-s->buf_len; +inline static int64_t stream_tell(stream_t *s) +{ + return s->pos + s->buf_pos - s->buf_len; } -inline static int stream_seek(stream_t *s,int64_t pos){ +inline static int stream_seek(stream_t *s, int64_t pos) +{ - mp_dbg(MSGT_DEMUX, MSGL_DBG3, "seek to 0x%llX\n", (long long)pos); + mp_dbg(MSGT_DEMUX, MSGL_DBG3, "seek to 0x%llX\n", (long long)pos); - if (pos < 0) { - mp_msg(MSGT_DEMUX, MSGL_ERR, "Invalid seek to negative position %llx!\n", - (long long)pos); - pos = 0; - } - if(pospos){ - int64_t x=pos-(s->pos-s->buf_len); - if(x>=0){ - s->buf_pos=x; - s->eof = 0; + if (pos < 0) { + mp_msg(MSGT_DEMUX, MSGL_ERR, + "Invalid seek to negative position %llx!\n", + (long long)pos); + pos = 0; + } + if (pos < s->pos) { + int64_t x = pos - (s->pos - s->buf_len); + if (x >= 0) { + s->buf_pos = x; + s->eof = 0; // putchar('*');fflush(stdout); - return 1; + return 1; + } } - } - return cache_stream_seek_long(s,pos); + return cache_stream_seek_long(s, pos); } -inline static int stream_skip(stream_t *s,int64_t len){ - if( len<0 || (len>2*STREAM_BUFFER_SIZE && (s->flags & MP_STREAM_SEEK_FW)) ) { - // negative or big skip! - return stream_seek(s,stream_tell(s)+len); - } - while(len>0){ - int x=s->buf_len-s->buf_pos; - if(x==0){ - if(!cache_stream_fill_buffer(s)) return 0; // EOF - x=s->buf_len-s->buf_pos; +inline static int stream_skip(stream_t *s, int64_t len) +{ + if (len < 0 || + (len > 2 * STREAM_BUFFER_SIZE && (s->flags & MP_STREAM_SEEK_FW))) { + // negative or big skip! + return stream_seek(s, stream_tell(s) + len); + } + while (len > 0) { + int x = s->buf_len - s->buf_pos; + if (x == 0) { + if (!cache_stream_fill_buffer(s)) + return 0; // EOF + x = s->buf_len - s->buf_pos; + } + if (x > len) + x = len; + //memcpy(mem,&s->buf[s->buf_pos],x); + s->buf_pos += x; + len -= x; } - if(x>len) x=len; - //memcpy(mem,&s->buf[s->buf_pos],x); - s->buf_pos+=x; len-=x; - } - return 1; + return 1; } struct MPOpts; @@ -355,9 +385,9 @@ struct bstr stream_read_complete(struct stream *s, void *talloc_ctx, void stream_reset(stream_t *s); int stream_control(stream_t *s, int cmd, void *arg); void stream_update_size(stream_t *s); -stream_t* new_stream(int fd,int type); +stream_t *new_stream(int fd, int type); void free_stream(stream_t *s); -stream_t* new_memory_stream(unsigned char* data,int len); +stream_t *new_memory_stream(unsigned char *data, int len); stream_t *open_stream(const char *filename, struct MPOpts *options, int *file_format); stream_t *open_output_stream(const char *filename, struct MPOpts *options); @@ -367,7 +397,7 @@ struct stream *new_ds_stream(struct demux_stream *ds); /// Set the callback to be used by libstream to check for user /// interruption during long blocking operations (cache filling, etc). struct input_ctx; -void stream_set_interrupt_callback(int (*cb)(struct input_ctx*, int), +void stream_set_interrupt_callback(int (*cb)(struct input_ctx *, int), struct input_ctx *ctx); /// Call the interrupt checking callback if there is one and /// wait for time milliseconds @@ -385,10 +415,10 @@ extern int dvd_angle; extern char *bluray_device; typedef struct { - int id; // 0 - 31 mpeg; 128 - 159 ac3; 160 - 191 pcm - int language; - int type; - int channels; + int id; // 0 - 31 mpeg; 128 - 159 ac3; 160 - 191 pcm + int language; + int type; + int channels; } stream_language_t; #endif /* MPLAYER_STREAM_H */ -- cgit v1.2.3