mirror of
https://github.com/ossrs/srs.git
synced 2025-03-09 15:49:59 +00:00
for #316, add codec info to stream.
This commit is contained in:
parent
8bf60895a9
commit
04f3f2a8f8
8 changed files with 286 additions and 50 deletions
|
@ -50,12 +50,29 @@ SrsStatisticStream::SrsStatisticStream()
|
|||
{
|
||||
id = __srs_generate_id();
|
||||
vhost = NULL;
|
||||
|
||||
has_video = false;
|
||||
vcodec = SrsCodecVideoReserved;
|
||||
avc_profile = 0;
|
||||
avc_level = 0;
|
||||
|
||||
has_audio = false;
|
||||
acodec = SrsCodecAudioReserved1;
|
||||
asample_rate = SrsCodecAudioSampleRateReserved;
|
||||
asound_type = SrsCodecAudioSoundTypeReserved;
|
||||
aac_profile = 0;
|
||||
}
|
||||
|
||||
SrsStatisticStream::~SrsStatisticStream()
|
||||
{
|
||||
}
|
||||
|
||||
void SrsStatisticStream::close()
|
||||
{
|
||||
has_video = false;
|
||||
has_audio = false;
|
||||
}
|
||||
|
||||
SrsStatistic* SrsStatistic::_instance = new SrsStatistic();
|
||||
|
||||
SrsStatistic::SrsStatistic()
|
||||
|
@ -93,34 +110,54 @@ SrsStatistic* SrsStatistic::instance()
|
|||
return _instance;
|
||||
}
|
||||
|
||||
int SrsStatistic::on_video_info(SrsRequest* req,
|
||||
SrsCodecVideo vcodec, u_int8_t avc_profile, u_int8_t avc_level
|
||||
) {
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsStatisticVhost* vhost = create_vhost(req);
|
||||
SrsStatisticStream* stream = create_stream(vhost, req);
|
||||
|
||||
stream->has_video = true;
|
||||
stream->vcodec = vcodec;
|
||||
stream->avc_profile = avc_profile;
|
||||
stream->avc_level = avc_level;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int SrsStatistic::on_audio_info(SrsRequest* req,
|
||||
SrsCodecAudio acodec, SrsCodecAudioSampleRate asample_rate, SrsCodecAudioSoundType asound_type,
|
||||
u_int8_t aac_profile
|
||||
) {
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
SrsStatisticVhost* vhost = create_vhost(req);
|
||||
SrsStatisticStream* stream = create_stream(vhost, req);
|
||||
|
||||
stream->has_audio = true;
|
||||
stream->acodec = acodec;
|
||||
stream->asample_rate = asample_rate;
|
||||
stream->asound_type = asound_type;
|
||||
stream->aac_profile = aac_profile;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
void SrsStatistic::on_stream_close(SrsRequest* req)
|
||||
{
|
||||
SrsStatisticVhost* vhost = create_vhost(req);
|
||||
SrsStatisticStream* stream = create_stream(vhost, req);
|
||||
|
||||
stream->close();
|
||||
}
|
||||
|
||||
int SrsStatistic::on_client(int id, SrsRequest* req)
|
||||
{
|
||||
int ret = ERROR_SUCCESS;
|
||||
|
||||
// create vhost if not exists.
|
||||
SrsStatisticVhost* vhost = NULL;
|
||||
if (vhosts.find(req->vhost) == vhosts.end()) {
|
||||
vhost = new SrsStatisticVhost();
|
||||
vhost->vhost = req->vhost;
|
||||
vhosts[req->vhost] = vhost;
|
||||
} else {
|
||||
vhost = vhosts[req->vhost];
|
||||
}
|
||||
|
||||
// the url to identify the stream.
|
||||
std::string url = req->get_stream_url();
|
||||
|
||||
// create stream if not exists.
|
||||
SrsStatisticStream* stream = NULL;
|
||||
if (streams.find(url) == streams.end()) {
|
||||
stream = new SrsStatisticStream();
|
||||
stream->vhost = vhost;
|
||||
stream->stream = req->stream;
|
||||
stream->url = url;
|
||||
streams[url] = stream;
|
||||
} else {
|
||||
stream = streams[url];
|
||||
}
|
||||
SrsStatisticVhost* vhost = create_vhost(req);
|
||||
SrsStatisticStream* stream = create_stream(vhost, req);
|
||||
|
||||
// create client if not exists
|
||||
SrsStatisticClient* client = NULL;
|
||||
|
@ -135,7 +172,7 @@ int SrsStatistic::on_client(int id, SrsRequest* req)
|
|||
return ret;
|
||||
}
|
||||
|
||||
void SrsStatistic::on_close(int id)
|
||||
void SrsStatistic::on_disconnect(int id)
|
||||
{
|
||||
std::map<int, SrsStatisticClient*>::iterator it;
|
||||
it = clients.find(id);
|
||||
|
@ -198,10 +235,74 @@ int SrsStatistic::dumps_streams(stringstream& ss)
|
|||
<< __SRS_JFIELD_ORG("id", stream->id) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_STR("name", stream->stream) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("vhost", stream->vhost->id) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("clients", client_num)
|
||||
<< __SRS_JOBJECT_END;
|
||||
<< __SRS_JFIELD_ORG("clients", client_num) << __SRS_JFIELD_CONT;
|
||||
|
||||
if (!stream->has_video) {
|
||||
ss << __SRS_JFIELD_NULL("video") << __SRS_JFIELD_CONT;
|
||||
} else {
|
||||
ss << __SRS_JFIELD_NAME("video")
|
||||
<< __SRS_JOBJECT_START
|
||||
<< __SRS_JFIELD_STR("codec", srs_codec_video2str(stream->vcodec)) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("profile", (int)stream->avc_profile) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("level", (int)stream->avc_level)
|
||||
<< __SRS_JOBJECT_END
|
||||
<< __SRS_JFIELD_CONT;
|
||||
}
|
||||
|
||||
if (!stream->has_audio) {
|
||||
ss << __SRS_JFIELD_NULL("audio");
|
||||
} else {
|
||||
ss << __SRS_JFIELD_NAME("audio")
|
||||
<< __SRS_JOBJECT_START
|
||||
<< __SRS_JFIELD_STR("codec", srs_codec_audio2str(stream->acodec)) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("sample_rate", (int)flv_sample_rates[stream->asample_rate]) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_ORG("channel", (int)stream->asound_type + 1) << __SRS_JFIELD_CONT
|
||||
<< __SRS_JFIELD_STR("profile", srs_codec_aac_profile2str(stream->aac_profile))
|
||||
<< __SRS_JOBJECT_END;
|
||||
}
|
||||
|
||||
ss << __SRS_JOBJECT_END;
|
||||
}
|
||||
ss << __SRS_JARRAY_END;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
SrsStatisticVhost* SrsStatistic::create_vhost(SrsRequest* req)
|
||||
{
|
||||
SrsStatisticVhost* vhost = NULL;
|
||||
|
||||
// create vhost if not exists.
|
||||
if (vhosts.find(req->vhost) == vhosts.end()) {
|
||||
vhost = new SrsStatisticVhost();
|
||||
vhost->vhost = req->vhost;
|
||||
vhosts[req->vhost] = vhost;
|
||||
return vhost;
|
||||
}
|
||||
|
||||
vhost = vhosts[req->vhost];
|
||||
|
||||
return vhost;
|
||||
}
|
||||
|
||||
SrsStatisticStream* SrsStatistic::create_stream(SrsStatisticVhost* vhost, SrsRequest* req)
|
||||
{
|
||||
std::string url = req->get_stream_url();
|
||||
|
||||
SrsStatisticStream* stream = NULL;
|
||||
|
||||
// create stream if not exists.
|
||||
if (streams.find(url) == streams.end()) {
|
||||
stream = new SrsStatisticStream();
|
||||
stream->vhost = vhost;
|
||||
stream->stream = req->stream;
|
||||
stream->url = url;
|
||||
streams[url] = stream;
|
||||
return stream;
|
||||
}
|
||||
|
||||
stream = streams[url];
|
||||
|
||||
return stream;
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue