diff options
Diffstat (limited to 'stream')
-rw-r--r-- | stream/pnm.c | 2 | ||||
-rw-r--r-- | stream/stream.c | 34 | ||||
-rw-r--r-- | stream/stream.h | 13 | ||||
-rw-r--r-- | stream/stream_dvd.c | 23 | ||||
-rw-r--r-- | stream/stream_dvd.h | 4 | ||||
-rw-r--r-- | stream/stream_dvdnav.c | 16 | ||||
-rw-r--r-- | stream/stream_dvdnav.h | 4 | ||||
-rw-r--r-- | stream/stream_smb.c | 1 |
8 files changed, 67 insertions, 30 deletions
diff --git a/stream/pnm.c b/stream/pnm.c index 40da142b33..14ffa5d1c1 100644 --- a/stream/pnm.c +++ b/stream/pnm.c @@ -503,7 +503,7 @@ static int pnm_get_headers(pnm_t *p, int *need_response) { uint8_t *ptr=p->header; uint8_t *prop_hdr=NULL; int chunk_size,size=0; - int nr; + int nr = 0; /* rmff_header_t *h; */ *need_response=0; diff --git a/stream/stream.c b/stream/stream.c index 62f6a1f171..9a3f25f8ab 100644 --- a/stream/stream.c +++ b/stream/stream.c @@ -30,6 +30,8 @@ #include <strings.h> #include <assert.h> +#include "talloc.h" + #include "config.h" #if HAVE_WINSOCK2_H @@ -680,3 +682,35 @@ unsigned char* stream_read_line(stream_t *s,unsigned char* mem, int max, int utf if(s->eof && ptr == mem) return NULL; return mem; } + +struct bstr stream_read_complete(struct stream *s, void *talloc_ctx, + int max_size, int padding_bytes) +{ + if (max_size > 1000000000) + abort(); + + int bufsize; + int total_read = 0; + int padding = FFMAX(padding_bytes, 1); + char *buf = NULL; + if (s->end_pos > max_size) + return (struct bstr){NULL, 0}; + if (s->end_pos > 0) + bufsize = s->end_pos + padding; + else + bufsize = 1000; + while (1) { + buf = talloc_realloc_size(talloc_ctx, buf, bufsize); + int readsize = stream_read(s, buf + total_read, bufsize - total_read); + total_read += readsize; + if (total_read < bufsize) + break; + if (bufsize > max_size) { + talloc_free(buf); + 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}; +} diff --git a/stream/stream.h b/stream/stream.h index cad61d3256..94bfb0e343 100644 --- a/stream/stream.h +++ b/stream/stream.h @@ -28,6 +28,8 @@ #include <sys/types.h> #include <fcntl.h> +#include "bstr.h" + #ifndef O_BINARY #define O_BINARY 0 #endif @@ -331,6 +333,14 @@ inline static int stream_skip(stream_t *s,off_t len){ } struct MPOpts; +/* + * Return allocated buffer for all data until EOF. + * If amount of data would be more than max_size return NULL as data ptr. + * Make the allocated buffer padding_bytes larger than the data read. + * Write number of bytes read at *amount_read. + */ +struct bstr stream_read_complete(struct stream *s, void *talloc_ctx, + int max_size, int padding_bytes); void stream_reset(stream_t *s); int stream_control(stream_t *s, int cmd, void *arg); stream_t* new_stream(int fd,int type); @@ -341,6 +351,9 @@ stream_t *open_stream(const char *filename, struct MPOpts *options, stream_t *open_stream_full(const char *filename,int mode, struct MPOpts *options, int *file_format); stream_t *open_output_stream(const char *filename, struct MPOpts *options); +struct demux_stream; +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; diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c index a302da81f1..f257ab78bd 100644 --- a/stream/stream_dvd.c +++ b/stream/stream_dvd.c @@ -125,24 +125,21 @@ int dvd_lang_from_aid(stream_t *stream, int id) { return 0; } -int dvd_aid_from_lang(stream_t *stream, const unsigned char* lang) { +int dvd_aid_from_lang(stream_t *stream, char **lang) { dvd_priv_t *d=stream->priv; int code,i; - if(lang) { - while(strlen(lang)>=2) { - code=lang[1]|(lang[0]<<8); + for (int n = 0; lang[n]; n++) { + code = lang[n][1] | (lang[n][0] << 8); for(i=0;i<d->nr_of_channels;i++) { if(d->audio_streams[i].language==code) { mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD audio channel: %d language: %c%c\n", - d->audio_streams[i].id, lang[0],lang[1]); + d->audio_streams[i].id, lang[n][0], lang[n][1]); return d->audio_streams[i].id; } //printf("%X != %X (%c%c)\n",code,d->audio_streams[i].language,lang[0],lang[1]); } - lang+=2; while (lang[0]==',' || lang[0]==' ') ++lang; - } - mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD audio language found!\n"); } + mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD audio language found!\n"); return -1; } @@ -169,19 +166,17 @@ int dvd_lang_from_sid(stream_t *stream, int id) { return 0; } -int dvd_sid_from_lang(stream_t *stream, const unsigned char* lang) { +int dvd_sid_from_lang(stream_t *stream, char **lang) { dvd_priv_t *d=stream->priv; int code,i; - while(lang && strlen(lang)>=2) { - code=lang[1]|(lang[0]<<8); + for (int n = 0; lang[n]; n++) { + code = lang[n][1] | (lang[n][0] << 8); for(i=0;i<d->nr_of_subtitles;i++) { if(d->subtitles[i].language==code) { - mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD subtitle channel: %d language: %c%c\n", i, lang[0],lang[1]); + mp_tmsg(MSGT_OPEN,MSGL_INFO,"Selected DVD subtitle channel: %d language: %c%c\n", i, lang[n][0], lang[n][1]); return d->subtitles[i].id; } } - lang+=2; - while (lang[0]==',' || lang[0]==' ') ++lang; } mp_tmsg(MSGT_OPEN,MSGL_WARN,"No matching DVD subtitle language found!\n"); return -1; diff --git a/stream/stream_dvd.h b/stream/stream_dvd.h index f0f0b5d08f..fe52d4399a 100644 --- a/stream/stream_dvd.h +++ b/stream/stream_dvd.h @@ -59,8 +59,8 @@ typedef struct { int dvd_number_of_subs(stream_t *stream); int dvd_lang_from_aid(stream_t *stream, int id); int dvd_lang_from_sid(stream_t *stream, int id); -int dvd_aid_from_lang(stream_t *stream, const unsigned char* lang); -int dvd_sid_from_lang(stream_t *stream, const unsigned char* lang); +int dvd_aid_from_lang(stream_t *stream, char **lang); +int dvd_sid_from_lang(stream_t *stream, char **lang); int dvd_chapter_from_cell(dvd_priv_t *dvd,int title,int cell); #endif /* MPLAYER_STREAM_DVD_H */ diff --git a/stream/stream_dvdnav.c b/stream/stream_dvdnav.c index ff0e715716..d5b12dc9f6 100644 --- a/stream/stream_dvdnav.c +++ b/stream/stream_dvdnav.c @@ -736,14 +736,14 @@ static int mp_dvdnav_get_aid_from_format (stream_t *stream, int index, uint8_t l * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */ -int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language) { +int mp_dvdnav_aid_from_lang(stream_t *stream, char **language) { dvdnav_priv_t * priv = stream->priv; int k; uint8_t lg; uint16_t lang, lcode; - while(language && strlen(language)>=2) { - lcode = (language[0] << 8) | (language[1]); + for (int i = 0; language[i]; i++) { + lcode = (language[i][0] << 8) | (language[i][1]); for(k=0; k<32; k++) { lg = dvdnav_get_audio_logical_stream(priv->dvdnav, k); if(lg == 0xff) continue; @@ -751,8 +751,6 @@ int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language) { if(lang != 0xFFFF && lang == lcode) return mp_dvdnav_get_aid_from_format (stream, k, lg); } - language += 2; - while(language[0]==',' || language[0]==' ') ++language; } return -1; } @@ -788,13 +786,13 @@ int mp_dvdnav_lang_from_aid(stream_t *stream, int aid, unsigned char *buf) { * \param lang: 2-characters language code[s], eventually separated by spaces of commas * \return -1 on error, current subtitle id if successful */ -int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language) { +int mp_dvdnav_sid_from_lang(stream_t *stream, char **language) { dvdnav_priv_t * priv = stream->priv; uint8_t lg, k; uint16_t lang, lcode; - while(language && strlen(language)>=2) { - lcode = (language[0] << 8) | (language[1]); + for (int i = 0; language[i]; i++) { + lcode = (language[i][0] << 8) | (language[i][1]); for(k=0; k<32; k++) { lg = dvdnav_get_spu_logical_stream(priv->dvdnav, k); if(lg == 0xff) continue; @@ -803,8 +801,6 @@ int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language) { return lg; } } - language += 2; - while(language[0]==',' || language[0]==' ') ++language; } return -1; } diff --git a/stream/stream_dvdnav.h b/stream/stream_dvdnav.h index 97c2cb6d71..ae58367320 100644 --- a/stream/stream_dvdnav.h +++ b/stream/stream_dvdnav.h @@ -30,9 +30,9 @@ typedef struct { int mp_dvdnav_number_of_subs(stream_t *stream); int mp_dvdnav_aid_from_audio_num(stream_t *stream, int audio_num); -int mp_dvdnav_aid_from_lang(stream_t *stream, const unsigned char *language); +int mp_dvdnav_aid_from_lang(stream_t *stream, char **language); int mp_dvdnav_lang_from_aid(stream_t *stream, int id, unsigned char *buf); -int mp_dvdnav_sid_from_lang(stream_t *stream, const unsigned char *language); +int mp_dvdnav_sid_from_lang(stream_t *stream, char **language); int mp_dvdnav_lang_from_sid(stream_t *stream, int sid, unsigned char *buf); void mp_dvdnav_handle_input(stream_t *stream, int cmd, int *button); void mp_dvdnav_update_mouse_pos(stream_t *stream, int32_t x, int32_t y, int* button); diff --git a/stream/stream_smb.c b/stream/stream_smb.c index 714e80fe79..f176bc7518 100644 --- a/stream/stream_smb.c +++ b/stream/stream_smb.c @@ -117,7 +117,6 @@ static void close_f(stream_t *s){ } static int open_f (stream_t *stream, int mode, void *opts, int* file_format) { - struct stream_priv_s *p = (struct stream_priv_s*)opts; char *filename; mode_t m = 0; off_t len; |