mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-11-21 10:55:51 +02:00
* Add support for time-limiting a live stream. (Some guy streamed one of
my pondcam streams for 24 hours! I'll bet he wasn't watching. * Add code to allocate the priv_data so that the ffm header can be parsed again. [Fix crash] Originally committed as revision 577 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
parent
935cdf0902
commit
ec3b22326d
36
ffserver.c
36
ffserver.c
@ -95,6 +95,7 @@ typedef struct HTTPContext {
|
||||
int last_packet_sent; /* true if last data packet was sent */
|
||||
int suppress_log;
|
||||
int bandwidth;
|
||||
time_t start_time;
|
||||
char protocol[16];
|
||||
char method[16];
|
||||
char url[128];
|
||||
@ -116,6 +117,7 @@ typedef struct FFStream {
|
||||
AVOutputFormat *fmt;
|
||||
int nb_streams;
|
||||
int prebuffer; /* Number of millseconds early to start */
|
||||
time_t max_time;
|
||||
int send_on_key;
|
||||
AVStream *streams[MAX_STREAMS];
|
||||
int feed_streams[MAX_STREAMS]; /* index of streams in the feed */
|
||||
@ -559,7 +561,7 @@ static int http_parse_request(HTTPContext *c)
|
||||
c->bandwidth += st->codec.bit_rate;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
av_abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -636,7 +638,7 @@ static int http_parse_request(HTTPContext *c)
|
||||
q += sprintf(q, "http://%s/%s%s\r\n",
|
||||
hostbuf, filename, info);
|
||||
} else
|
||||
abort();
|
||||
av_abort();
|
||||
|
||||
/* prepare output buffer */
|
||||
c->buffer_ptr = c->buffer;
|
||||
@ -829,7 +831,7 @@ static void compute_stats(HTTPContext *c)
|
||||
}
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
av_abort();
|
||||
}
|
||||
}
|
||||
q += sprintf(q, "<TD align=center> %s <TD align=right> %d <TD align=right> %d <TD> %s %s <TD align=right> %d <TD> %s %s",
|
||||
@ -873,7 +875,7 @@ static void compute_stats(HTTPContext *c)
|
||||
type = "video";
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
av_abort();
|
||||
}
|
||||
q += sprintf(q, "<tr><td align=right>%d<td>%s<td align=right>%d<td>%s\n",
|
||||
i, type, st->codec.bit_rate/1000, codec ? codec->name : "");
|
||||
@ -960,7 +962,7 @@ static void http_write_packet(void *opaque,
|
||||
c->buffer_ptr = c->buffer_end = c->buffer;
|
||||
|
||||
if (c->buffer_end - c->buffer + size > IOBUFFER_MAX_SIZE)
|
||||
abort();
|
||||
av_abort();
|
||||
|
||||
memcpy(c->buffer_end, buf, size);
|
||||
c->buffer_end += size;
|
||||
@ -1127,8 +1129,12 @@ static int http_prepare_data(HTTPContext *c)
|
||||
c->stream->feed->feed_write_index,
|
||||
c->stream->feed->feed_size);
|
||||
}
|
||||
|
||||
if (av_read_packet(c->fmt_in, &pkt) < 0) {
|
||||
|
||||
if (c->stream->max_time &&
|
||||
c->stream->max_time + c->start_time > time(0)) {
|
||||
/* We have timed out */
|
||||
c->state = HTTPSTATE_SEND_DATA_TRAILER;
|
||||
} else if (av_read_packet(c->fmt_in, &pkt) < 0) {
|
||||
if (c->stream->feed && c->stream->feed->feed_opened) {
|
||||
/* if coming from feed, it means we reached the end of the
|
||||
ffm file, so must wait for more data */
|
||||
@ -1326,18 +1332,25 @@ static int http_receive_data(HTTPContext *c)
|
||||
if (!fmt_in)
|
||||
goto fail;
|
||||
|
||||
s.priv_data = av_mallocz(fmt_in->priv_data_size);
|
||||
if (!s.priv_data)
|
||||
goto fail;
|
||||
|
||||
if (fmt_in->read_header(&s, 0) < 0) {
|
||||
av_freep(&s.priv_data);
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Now we have the actual streams */
|
||||
if (s.nb_streams != feed->nb_streams) {
|
||||
av_freep(&s.priv_data);
|
||||
goto fail;
|
||||
}
|
||||
for (i = 0; i < s.nb_streams; i++) {
|
||||
memcpy(&feed->streams[i]->codec,
|
||||
&s.streams[i]->codec, sizeof(AVCodecContext));
|
||||
}
|
||||
av_freep(&s.priv_data);
|
||||
}
|
||||
c->buffer_ptr = c->buffer;
|
||||
}
|
||||
@ -1379,7 +1392,7 @@ int add_av_stream(FFStream *feed,
|
||||
goto found;
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
av_abort();
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1530,7 +1543,7 @@ void add_codec(FFStream *stream, AVCodecContext *av)
|
||||
|
||||
break;
|
||||
default:
|
||||
abort();
|
||||
av_abort();
|
||||
}
|
||||
|
||||
st = av_mallocz(sizeof(AVStream));
|
||||
@ -1807,6 +1820,11 @@ int parse_ffconfig(const char *filename)
|
||||
filename, line_num, arg);
|
||||
errors++;
|
||||
}
|
||||
} else if (!strcasecmp(cmd, "MaxTime")) {
|
||||
get_arg(arg, sizeof(arg), &p);
|
||||
if (stream) {
|
||||
stream->max_time = atoi(arg);
|
||||
}
|
||||
} else if (!strcasecmp(cmd, "AudioBitRate")) {
|
||||
get_arg(arg, sizeof(arg), &p);
|
||||
if (stream) {
|
||||
|
Loading…
Reference in New Issue
Block a user