diff --git a/ffserver.c b/ffserver.c index 93e546751c..dfed41283a 100644 --- a/ffserver.c +++ b/ffserver.c @@ -1774,153 +1774,172 @@ static void compute_status(HTTPContext *c) stream = stream->next; continue; } - av_strlcpy(sfilename, stream->filename, sizeof(sfilename) - 10); - eosf = sfilename + strlen(sfilename); - if (eosf - sfilename >= 4) { - if (strcmp(eosf - 4, ".asf") == 0) - strcpy(eosf - 4, ".asx"); - else if (strcmp(eosf - 3, ".rm") == 0) - strcpy(eosf - 3, ".ram"); - else if (stream->fmt && !strcmp(stream->fmt->name, "rtp")) { - /* generate a sample RTSP director if - unicast. Generate an SDP redirector if - multicast */ - eosf = strrchr(sfilename, '.'); - if (!eosf) - eosf = sfilename + strlen(sfilename); - if (stream->is_multicast) - strcpy(eosf, ".sdp"); - else - strcpy(eosf, ".rtsp"); - } + + av_strlcpy(sfilename, stream->filename, sizeof(sfilename) - 10); + eosf = sfilename + strlen(sfilename); + if (eosf - sfilename >= 4) { + if (strcmp(eosf - 4, ".asf") == 0) + strcpy(eosf - 4, ".asx"); + else if (strcmp(eosf - 3, ".rm") == 0) + strcpy(eosf - 3, ".ram"); + else if (stream->fmt && !strcmp(stream->fmt->name, "rtp")) { + /* generate a sample RTSP director if + unicast. Generate an SDP redirector if + multicast */ + eosf = strrchr(sfilename, '.'); + if (!eosf) + eosf = sfilename + strlen(sfilename); + if (stream->is_multicast) + strcpy(eosf, ".sdp"); + else + strcpy(eosf, ".rtsp"); } + } - avio_printf(pb, "
"); + avio_printf(pb, "
"); + } + + avio_printf(pb, "
Stream | " + "type | kbits/s | codec | "
+ "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, "
| ||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
%d | %s | %d" + " | %s | %s\n", + i, type, st->codec->bit_rate/1000, + codec ? codec->name : "", parameters); + } + avio_printf(pb, " |
# | File | IP | Proto | State | Target bits/sec | Actual bits/sec | Bytes transferred\n"); + avio_printf(pb, " |
---|---|---|---|---|---|---|---|
# | File | IP | Proto | State | Target " + "bits/sec | Actual bits/sec | Bytes transferred\n"); c1 = first_http_ctx; i = 0; while (c1) { @@ -1953,13 +1973,11 @@ static void compute_status(HTTPContext *c) i++; p = inet_ntoa(c1->from_addr.sin_addr); - avio_printf(pb, " |
%d | %s%s | %s | %s | %s | ", - i, - c1->stream ? c1->stream->filename : "", - c1->state == HTTPSTATE_RECEIVE_DATA ? "(input)" : "", - p, - c1->protocol, - http_state[c1->state]); + avio_printf(pb, " | ||
%d | %s%s | %s | %s | %s" + " | ", + i, c1->stream ? c1->stream->filename : "", + c1->state == HTTPSTATE_RECEIVE_DATA ? "(input)" : "", p, + c1->protocol, http_state[c1->state]); fmt_bytecount(pb, bitrate); avio_printf(pb, " | "); fmt_bytecount(pb, compute_datarate(&c1->datarate, c1->data_count) * 8); |