RtmpProtocol.h 3.05 KB
Newer Older
xzl committed
1 2 3 4 5 6 7 8 9 10 11
/*
 * RtmpProtocol.h
 *
 *  Created on: 2017年2月7日
 *      Author: xzl
 */

#ifndef SRC_RTMP_RTMPPROTOCOL_H_
#define SRC_RTMP_RTMPPROTOCOL_H_

#include <netinet/in.h>
xiongzilaing committed
12
#include <memory>
xzl committed
13 14 15
#include <string>
#include <functional>
#include "amf.h"
xiongzilaing committed
16 17 18 19 20
#include "Rtmp.h"
#include "Util/util.h"
#include "Util/logger.h"
#include "Util/TimeTicker.h"
#include "Network/Socket.h"
xzl committed
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63

using namespace std;
using namespace ZL::Util;
using namespace ZL::Network;

namespace ZL {
namespace Rtmp {

class RtmpProtocol {
public:
	RtmpProtocol();
	virtual ~RtmpProtocol();
	//作为客户端发送c0c1,等待s0s1s2并且回调
	void startClientSession(const function<void()> &cb);
	void onParseRtmp(const char *pcRawData,int iSize);
	void clear();
protected:
	virtual void onSendRawData(const char *pcRawData,int iSize) = 0;
	virtual void onRtmpChunk(RtmpPacket &chunkData) = 0;

	virtual void onStreamBegin(uint32_t ui32StreamId){
		m_ui32StreamId = ui32StreamId;
	}
	virtual void onStreamEof(uint32_t ui32StreamId){};
	virtual void onStreamDry(uint32_t ui32StreamId){};
protected:
	void sendAcknowledgement(uint32_t ui32Size);
	void sendAcknowledgementSize(uint32_t ui32Size);
	void sendPeerBandwidth(uint32_t ui32Size);
	void sendChunkSize(uint32_t ui32Size);
	void sendPingRequest(uint32_t ui32TimeStamp = ::time(NULL));
	void sendPingResponse(uint32_t ui32TimeStamp = ::time(NULL));
	void sendSetBufferLength(uint32_t ui32StreamId, uint32_t ui32Length);
	void sendUserControl(uint16_t ui16EventType, uint32_t ui32EventData);
	void sendUserControl(uint16_t ui16EventType, const string &strEventData);

	void sendInvoke(const string &strCmd, const AMFValue &val);
	void sendRequest(int iCmd, const string &str);
	void sendResponse(int iType, const string &str);
	void sendRtmp(uint8_t ui8Type, uint32_t ui32StreamId, const std::string &strBuf, uint32_t ui32TimeStamp, int iChunkID);
protected:
	int m_iReqID = 0;
	uint32_t m_ui32StreamId = STREAM_CONTROL;
xiongziliang committed
64 65 66
	int m_iNowStreamID = 0;
	int m_iNowChunkID = 0;
	bool m_bDataStarted = false;
xzl committed
67 68 69
private:
	void handle_S0S1S2(const function<void()> &cb);
	void handle_C0C1();
70 71

	void handle_C1_simple();
72
#ifdef ENABLE_OPENSSL
73 74 75 76 77
	void handle_C1_complex();
	string get_C1_digest(const uint8_t *ptr,char **digestPos);
	string get_C1_key(const uint8_t *ptr);
	void check_C1_Digest(const string &digest,const string &data);
	void send_complex_S0S1S2(int schemeType,const string &digest);
78
#endif //ENABLE_OPENSSL
79

xzl committed
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104
	void handle_C2();
	void handle_rtmp();
	void handle_rtmpChunk(RtmpPacket &chunkData);

	////////////ChunkSize////////////
	size_t m_iChunkLenIn = DEFAULT_CHUNK_LEN;
	size_t m_iChunkLenOut = DEFAULT_CHUNK_LEN;
	////////////Acknowledgement////////////
	uint32_t m_ui32ByteSent = 0;
	uint32_t m_ui32LastSent = 0;
	uint32_t m_ui32WinSize = 0;
	///////////PeerBandwidth///////////
	uint32_t m_ui32Bandwidth = 2500000;
	uint8_t m_ui8LimitType = 2;
	////////////Chunk////////////
	unordered_map<int, RtmpPacket> m_mapChunkData;
	//////////Rtmp parser//////////
	string m_strRcvBuf;
	function<void()> m_nextHandle;
};

} /* namespace Rtmp */
} /* namespace ZL */

#endif /* SRC_RTMP_RTMPPROTOCOL_H_ */