1
0
Fork 0
mirror of https://github.com/ossrs/srs.git synced 2025-03-09 15:49:59 +00:00

for bug #251, add queue fast vector. 2.0.66

This commit is contained in:
winlin 2014-12-07 13:26:45 +08:00
parent 8f72f79504
commit 5a2b8afead
4 changed files with 131 additions and 3 deletions

View file

@ -156,6 +156,93 @@ int SrsRtmpJitter::get_time()
return (int)last_pkt_correct_time;
}
#ifdef SRS_PERF_QUEUE_FAST_VECTOR
SrsFastVector::SrsFastVector()
{
count = 0;
nb_msgs = SRS_PERF_MW_MSGS * 2;
msgs = new SrsSharedPtrMessage*[nb_msgs];
}
SrsFastVector::~SrsFastVector()
{
free();
}
int SrsFastVector::size()
{
return count;
}
int SrsFastVector::begin()
{
return 0;
}
int SrsFastVector::end()
{
return count;
}
SrsSharedPtrMessage** SrsFastVector::data()
{
return msgs;
}
SrsSharedPtrMessage* SrsFastVector::at(int index)
{
srs_assert(index < count);
return msgs[index];
}
void SrsFastVector::clear()
{
count = 0;
}
void SrsFastVector::erase(int _begin, int _end)
{
srs_assert(_begin < _end);
// move all erased to previous.
for (int i = 0; i < count - _end; i++) {
msgs[_begin + i] = msgs[_end + i];
}
// update the count.
count -= _end - _begin;
}
void SrsFastVector::push_back(SrsSharedPtrMessage* msg)
{
// increase vector.
if (count >= nb_msgs) {
int size = nb_msgs * 2;
SrsSharedPtrMessage** buf = new SrsSharedPtrMessage*[size];
for (int i = 0; i < nb_msgs; i++) {
buf[i] = msgs[i];
}
srs_warn("fast vector incrase %d=>%d", nb_msgs, size);
// use new array.
srs_freep(msgs);
msgs = buf;
nb_msgs = size;
}
msgs[count++] = msg;
}
void SrsFastVector::free()
{
for (int i = 0; i < count; i++) {
SrsSharedPtrMessage* msg = msgs[i];
srs_freep(msg);
}
count = 0;
}
#endif
SrsMessageQueue::SrsMessageQueue()
{
queue_size_ms = 0;
@ -251,7 +338,7 @@ void SrsMessageQueue::shrink()
// for when we shrinked, the first is the iframe,
// we will directly remove the gop next time.
for (int i = 1; i < (int)msgs.size(); i++) {
SrsSharedPtrMessage* msg = msgs[i];
SrsSharedPtrMessage* msg = msgs.at(i);
if (msg->is_video()) {
if (SrsFlvCodec::video_is_keyframe(msg->payload, msg->size)) {
@ -281,7 +368,7 @@ void SrsMessageQueue::shrink()
// remove the first gop from the front
for (int i = 0; i < iframe_index; i++) {
SrsSharedPtrMessage* msg = msgs[i];
SrsSharedPtrMessage* msg = msgs.at(i);
srs_freep(msg);
}
msgs.erase(msgs.begin(), msgs.begin() + iframe_index);
@ -289,12 +376,16 @@ void SrsMessageQueue::shrink()
void SrsMessageQueue::clear()
{
#ifndef SRS_PERF_QUEUE_FAST_VECTOR
std::vector<SrsSharedPtrMessage*>::iterator it;
for (it = msgs.begin(); it != msgs.end(); ++it) {
SrsSharedPtrMessage* msg = *it;
srs_freep(msg);
}
#else
msgs.free();
#endif
msgs.clear();