X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=ffserver.c;h=e83534cc764da5be1cea6815fc27ed6b3e53e65e;hb=db9f426caba574719c58de12e68742063c8e7979;hp=cb7e3aeda318f9b1f3dbff087502b6202db0c10f;hpb=27ccc82e1bb1b97a85e5fb33b92082267078b4d1;p=ffmpeg diff --git a/ffserver.c b/ffserver.c index cb7e3aeda31..e83534cc764 100644 --- a/ffserver.c +++ b/ffserver.c @@ -44,6 +44,7 @@ #include "libavutil/avstring.h" #include "libavutil/lfg.h" #include "libavutil/dict.h" +#include "libavutil/intreadwrite.h" #include "libavutil/mathematics.h" #include "libavutil/random_seed.h" #include "libavutil/parseutils.h" @@ -328,6 +329,39 @@ static AVLFG random_state; static FILE *logfile = NULL; +static int64_t ffm_read_write_index(int fd) +{ + uint8_t buf[8]; + + if (lseek(fd, 8, SEEK_SET) < 0) + return AVERROR(EIO); + if (read(fd, buf, 8) != 8) + return AVERROR(EIO); + return AV_RB64(buf); +} + +static int ffm_write_write_index(int fd, int64_t pos) +{ + uint8_t buf[8]; + int i; + + for(i=0;i<8;i++) + buf[i] = (pos >> (56 - i * 8)) & 0xff; + if (lseek(fd, 8, SEEK_SET) < 0) + return AVERROR(EIO); + if (write(fd, buf, 8) != 8) + return AVERROR(EIO); + return 8; +} + +static void ffm_set_write_index(AVFormatContext *s, int64_t pos, + int64_t file_size) +{ + FFMContext *ffm = s->priv_data; + ffm->write_index = pos; + ffm->file_size = file_size; +} + /* FIXME: make ffserver work with IPv6 */ /* resolve host with also IP address parsing */ static int resolve_host(struct in_addr *sin_addr, const char *hostname) @@ -767,7 +801,7 @@ static void http_send_too_busy_reply(int fd) "\r\n" "Too busy\r\n" "

The server is too busy to serve your request at this time.

\r\n" - "

The number of current connections is %d, and this exceeds the limit of %d.

\r\n" + "

The number of current connections is %u, and this exceeds the limit of %u.

\r\n" "\r\n", nb_connections, nb_max_connections); av_assert0(len < sizeof(buffer)); @@ -778,7 +812,8 @@ static void http_send_too_busy_reply(int fd) static void new_connection(int server_fd, int is_rtsp) { struct sockaddr_in from_addr; - int fd, len; + socklen_t len; + int fd; HTTPContext *c = NULL; len = sizeof(from_addr); @@ -1702,7 +1737,8 @@ static int http_parse_request(HTTPContext *c) case REDIR_SDP: { uint8_t *sdp_data; - int sdp_data_size, len; + int sdp_data_size; + socklen_t len; struct sockaddr_in my_addr; snprintf(q, c->buffer_size, @@ -2985,7 +3021,8 @@ static void rtsp_cmd_describe(HTTPContext *c, const char *url) char path1[1024]; const char *path; uint8_t *content; - int content_length, len; + int content_length; + socklen_t len; struct sockaddr_in my_addr; /* find which url is asked */ @@ -3474,6 +3511,9 @@ static AVStream *add_av_stream1(FFStream *stream, AVCodecContext *codec, int cop { AVStream *fst; + if(stream->nb_streams >= FF_ARRAY_ELEMS(stream->streams)) + return NULL; + fst = av_mallocz(sizeof(AVStream)); if (!fst) return NULL; @@ -3821,6 +3861,9 @@ static void add_codec(FFStream *stream, AVCodecContext *av) { AVStream *st; + if(stream->nb_streams >= FF_ARRAY_ELEMS(stream->streams)) + return; + /* compute default parameters */ switch(av->codec_type) { case AVMEDIA_TYPE_AUDIO: