summaryrefslogtreecommitdiffstats
path: root/stream
diff options
context:
space:
mode:
Diffstat (limited to 'stream')
-rw-r--r--stream/pnm.c2
-rw-r--r--stream/stream.c34
-rw-r--r--stream/stream.h13
-rw-r--r--stream/stream_dvd.c23
-rw-r--r--stream/stream_dvd.h4
-rw-r--r--stream/stream_dvdnav.c16
-rw-r--r--stream/stream_dvdnav.h4
-rw-r--r--stream/stream_smb.c1
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;