OpenRTMFP/Cumulus性能优化(3) Listener的优化

一.Listener.h中部分方法声明如下:

class Listener {
public:
     Listener(Poco::UInt32 id,Publication& publication,FlowWriter& writer,bool unbuffered);
     virtual ~Listener();

     void pushAudioPacket(Poco::UInt32 time,PacketReader& packet);
     void pushVideoPacket(Poco::UInt32 time,PacketReader& packet);
     void pushDataPacket(const std::string& name,PacketReader& packet);

};

说明:这其中有些方法的参数为PacketReader的引用,然后在调用该方法之前,通常要通过new PacketReader实例化,如

在AMFReaderCreator类中就会有这样的方法:

Cumulus::PacketReader* AMFReaderCreator::getPacketReader() {
     Cumulus::PacketReader* pReader = new Cumulus::PacketReader(reinterpret_cast<const Poco::UInt8*>(amf.data()), amf.size());
     pReader->reset(13 + _name.size());
     return pReader;
}

这样,在DownstreamHandler中每接收一个报文就会new一个对象.

二.Listener.cpp中部分方法的实现如下:

void Listener::pushDataPacket(const string& name,PacketReader& packet) {
     if(_unbuffered) {
         UInt16 offset = name.size()+9;
         if(packet.position()>=offset) {
             packet.reset(packet.position()-offset);
             _writer.writeUnbufferedMessage(packet.current(),packet.available());
             return;
         }
     }
}

说明:细致观察该函数的实现,完全可以简单地替换如下:

void Listener::pushPacketData(const std::string& name,std::string& amf){
     if(_unbuffered){
         const unsigned char* amfData = reinterpret_cast<const Poco::UInt8*>(amf.data());
         amfData = amfData + 4;
         _writer.writeUnbufferedMessage(reinterpret_cast<const UInt8*>(amfData),amf.size()-4);
        return;
     }
}

三.由此,在DownstreamHandler中的调用就由原来的

    Cumulus::PacketReader* pReader = amfReaderCreator.getPacketReader();
    it->second->pushDataPacket(RPCMessage::HANDLE_VOICE_RES, *pReader);
    it->second->flush();
    delete pReader;

改为简单的返回amf字符串即可,如下:

    it->second->pushPacketData(RPCMessage::HANDLE_VIDEO_RES,amfReaderCreator.getAmfString());
    it->second->flush();

其中amfReaderCreator.getAmfString()的实现为

std::string& AMFReaderCreator::getAmfString(){
     return amf;
}

说明:amf即为一开始设置的amf3格式的字符串,比如:

AMFReaderCreator::AMFReaderCreator(const std::string& name, Poco::UInt16 timestamp)
  : _name(name) {//Poco::UInt32 timestamp) {
     char header[11] = {
     'U', 'S', 'T', 'C',
     0x0F, 0x00, 0x00, 0x00,
     static_cast<char>(timestamp & 0xFF00 >> 8),
     static_cast<char>(timestamp & 0x00FF)};
     amf.append(header, 10);
     writeString(name);
}

 

转载请注明出处:山水间博客,http://blog.csdn.net/linyanwen99/article/details/8651230

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值