|
|
|
@ -209,6 +209,7 @@ static void close_connection(HTTPContext *c); |
|
|
|
|
|
|
|
|
|
/* HTTP handling */ |
|
|
|
|
static int handle_connection(HTTPContext *c); |
|
|
|
|
static inline void print_stream_params(AVIOContext *pb, FFServerStream *stream); |
|
|
|
|
static void compute_status(HTTPContext *c); |
|
|
|
|
static int open_input_stream(HTTPContext *c, const char *info); |
|
|
|
|
static int http_parse_request(HTTPContext *c); |
|
|
|
@ -1750,6 +1751,52 @@ static void fmt_bytecount(AVIOContext *pb, int64_t count) |
|
|
|
|
avio_printf(pb, "%"PRId64"%c", count, *s); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static inline void print_stream_params(AVIOContext *pb, FFServerStream *stream) |
|
|
|
|
{ |
|
|
|
|
int i, stream_no; |
|
|
|
|
const char *type = "unknown"; |
|
|
|
|
char parameters[64]; |
|
|
|
|
AVStream *st; |
|
|
|
|
AVCodec *codec; |
|
|
|
|
|
|
|
|
|
stream_no = stream->nb_streams; |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "<table cellspacing=0 cellpadding=4><tr><th>Stream<th>" |
|
|
|
|
"type<th>kbits/s<th align=left>codec<th align=left>" |
|
|
|
|
"Parameters\n"); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < stream_no; i++) { |
|
|
|
|
st = stream->streams[i]; |
|
|
|
|
codec = avcodec_find_encoder(st->codec->codec_id); |
|
|
|
|
|
|
|
|
|
parameters[0] = 0; |
|
|
|
|
|
|
|
|
|
switch(st->codec->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
type = "audio"; |
|
|
|
|
snprintf(parameters, sizeof(parameters), "%d channel(s), %d Hz", |
|
|
|
|
st->codec->channels, st->codec->sample_rate); |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
type = "video"; |
|
|
|
|
snprintf(parameters, sizeof(parameters), |
|
|
|
|
"%dx%d, q=%d-%d, fps=%d", st->codec->width, |
|
|
|
|
st->codec->height, st->codec->qmin, st->codec->qmax, |
|
|
|
|
st->codec->time_base.den / st->codec->time_base.num); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
abort(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "<tr><td align=right>%d<td>%s<td align=right>%d" |
|
|
|
|
"<td>%s<td>%s\n", |
|
|
|
|
i, type, st->codec->bit_rate/1000, |
|
|
|
|
codec ? codec->name : "", parameters); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "</table>\n"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
static void compute_status(HTTPContext *c) |
|
|
|
|
{ |
|
|
|
|
HTTPContext *c1; |
|
|
|
@ -1920,42 +1967,7 @@ static void compute_status(HTTPContext *c) |
|
|
|
|
avio_printf(pb, "<p>"); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "<table cellspacing=0 cellpadding=4><tr><th>Stream<th>" |
|
|
|
|
"type<th>kbits/s<th align=left>codec<th align=left>" |
|
|
|
|
"Parameters\n"); |
|
|
|
|
|
|
|
|
|
for (i = 0; i < stream->nb_streams; i++) { |
|
|
|
|
AVStream *st = stream->streams[i]; |
|
|
|
|
AVCodec *codec = avcodec_find_encoder(st->codec->codec_id); |
|
|
|
|
const char *type = "unknown"; |
|
|
|
|
char parameters[64]; |
|
|
|
|
|
|
|
|
|
parameters[0] = 0; |
|
|
|
|
|
|
|
|
|
switch(st->codec->codec_type) { |
|
|
|
|
case AVMEDIA_TYPE_AUDIO: |
|
|
|
|
type = "audio"; |
|
|
|
|
snprintf(parameters, sizeof(parameters), "%d channel(s), %d Hz", |
|
|
|
|
st->codec->channels, st->codec->sample_rate); |
|
|
|
|
break; |
|
|
|
|
case AVMEDIA_TYPE_VIDEO: |
|
|
|
|
type = "video"; |
|
|
|
|
snprintf(parameters, sizeof(parameters), |
|
|
|
|
"%dx%d, q=%d-%d, fps=%d", st->codec->width, |
|
|
|
|
st->codec->height, st->codec->qmin, st->codec->qmax, |
|
|
|
|
st->codec->time_base.den / st->codec->time_base.num); |
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
abort(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "<tr><td align=right>%d<td>%s<td align=right>%d" |
|
|
|
|
"<td>%s<td>%s\n", |
|
|
|
|
i, type, st->codec->bit_rate/1000, |
|
|
|
|
codec ? codec->name : "", parameters); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
avio_printf(pb, "</table>\n"); |
|
|
|
|
print_stream_params(pb, stream); |
|
|
|
|
stream = stream->next; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|