正在显示
5 个修改的文件
包含
169 行增加
和
3 行删除
@@ -57,7 +57,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -57,7 +57,9 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
57 | #define ERROR_RTMP_REQ_CONNECT 305 | 57 | #define ERROR_RTMP_REQ_CONNECT 305 |
58 | #define ERROR_RTMP_REQ_TCURL 306 | 58 | #define ERROR_RTMP_REQ_TCURL 306 |
59 | #define ERROR_RTMP_MESSAGE_DECODE 307 | 59 | #define ERROR_RTMP_MESSAGE_DECODE 307 |
60 | +#define ERROR_RTMP_MESSAGE_ENCODE 308 | ||
60 | 61 | ||
61 | #define ERROR_SYSTEM_STREAM_INIT 400 | 62 | #define ERROR_SYSTEM_STREAM_INIT 400 |
63 | +#define ERROR_SYSTEM_PACKET_INVALID 401 | ||
62 | 64 | ||
63 | #endif | 65 | #endif |
@@ -884,12 +884,17 @@ int SrsMessage::get_perfer_cid() | @@ -884,12 +884,17 @@ int SrsMessage::get_perfer_cid() | ||
884 | return packet->get_perfer_cid(); | 884 | return packet->get_perfer_cid(); |
885 | } | 885 | } |
886 | 886 | ||
887 | -void SrsMessage::set_packet(SrsPacket* pkt) | 887 | +void SrsMessage::set_packet(SrsPacket* pkt, int stream_id) |
888 | { | 888 | { |
889 | if (packet) { | 889 | if (packet) { |
890 | delete packet; | 890 | delete packet; |
891 | } | 891 | } |
892 | + | ||
892 | packet = pkt; | 893 | packet = pkt; |
894 | + | ||
895 | + header.message_type = packet->get_message_type(); | ||
896 | + header.payload_length = packet->get_payload_length(); | ||
897 | + header.stream_id = stream_id; | ||
893 | } | 898 | } |
894 | 899 | ||
895 | int SrsMessage::encode_packet() | 900 | int SrsMessage::encode_packet() |
@@ -900,8 +905,14 @@ int SrsMessage::encode_packet() | @@ -900,8 +905,14 @@ int SrsMessage::encode_packet() | ||
900 | srs_warn("packet is empty, send out empty message."); | 905 | srs_warn("packet is empty, send out empty message."); |
901 | return ret; | 906 | return ret; |
902 | } | 907 | } |
908 | + // realloc the payload. | ||
909 | + size = 0; | ||
910 | + if (payload) { | ||
911 | + delete[] payload; | ||
912 | + payload = NULL; | ||
913 | + } | ||
903 | 914 | ||
904 | - return ret; | 915 | + return packet->encode(size, (char*&)payload); |
905 | } | 916 | } |
906 | 917 | ||
907 | SrsPacket::SrsPacket() | 918 | SrsPacket::SrsPacket() |
@@ -923,6 +934,66 @@ int SrsPacket::get_perfer_cid() | @@ -923,6 +934,66 @@ int SrsPacket::get_perfer_cid() | ||
923 | return 0; | 934 | return 0; |
924 | } | 935 | } |
925 | 936 | ||
937 | +int SrsPacket::get_message_type() | ||
938 | +{ | ||
939 | + return 0; | ||
940 | +} | ||
941 | + | ||
942 | +int SrsPacket::get_payload_length() | ||
943 | +{ | ||
944 | + return get_size(); | ||
945 | +} | ||
946 | + | ||
947 | +int SrsPacket::encode(int& psize, char*& ppayload) | ||
948 | +{ | ||
949 | + int ret = ERROR_SUCCESS; | ||
950 | + | ||
951 | + int size = get_size(); | ||
952 | + char* payload = NULL; | ||
953 | + | ||
954 | + SrsStream stream; | ||
955 | + | ||
956 | + if (size > 0) { | ||
957 | + payload = new char[size]; | ||
958 | + | ||
959 | + if ((ret = stream.initialize(payload, size)) != ERROR_SUCCESS) { | ||
960 | + srs_error("initialize the stream failed. ret=%d", ret); | ||
961 | + delete[] payload; | ||
962 | + return ret; | ||
963 | + } | ||
964 | + } | ||
965 | + | ||
966 | + if ((ret = encode_packet(&stream)) != ERROR_SUCCESS) { | ||
967 | + srs_error("encode the packet failed. ret=%d", ret); | ||
968 | + delete[] payload; | ||
969 | + return ret; | ||
970 | + } | ||
971 | + | ||
972 | + psize = size; | ||
973 | + ppayload = payload; | ||
974 | + srs_verbose("encode the packet success. size=%d", size); | ||
975 | + | ||
976 | + return ret; | ||
977 | +} | ||
978 | + | ||
979 | +int SrsPacket::get_size() | ||
980 | +{ | ||
981 | + return 0; | ||
982 | +} | ||
983 | + | ||
984 | +int SrsPacket::encode_packet(SrsStream* stream) | ||
985 | +{ | ||
986 | + int ret = ERROR_SUCCESS; | ||
987 | + | ||
988 | + srs_assert(stream != NULL); | ||
989 | + | ||
990 | + ret = ERROR_SYSTEM_PACKET_INVALID; | ||
991 | + srs_error("current packet is not support to sendout. " | ||
992 | + "paket=%s, ret=%d", get_class_name(), ret); | ||
993 | + | ||
994 | + return ret; | ||
995 | +} | ||
996 | + | ||
926 | SrsConnectAppPacket::SrsConnectAppPacket() | 997 | SrsConnectAppPacket::SrsConnectAppPacket() |
927 | { | 998 | { |
928 | command_name = RTMP_AMF0_COMMAND_CONNECT; | 999 | command_name = RTMP_AMF0_COMMAND_CONNECT; |
@@ -1013,3 +1084,31 @@ int SrsSetWindowAckSizePacket::get_perfer_cid() | @@ -1013,3 +1084,31 @@ int SrsSetWindowAckSizePacket::get_perfer_cid() | ||
1013 | return RTMP_CID_ProtocolControl; | 1084 | return RTMP_CID_ProtocolControl; |
1014 | } | 1085 | } |
1015 | 1086 | ||
1087 | +int SrsSetWindowAckSizePacket::get_message_type() | ||
1088 | +{ | ||
1089 | + return RTMP_MSG_WindowAcknowledgementSize; | ||
1090 | +} | ||
1091 | + | ||
1092 | +int SrsSetWindowAckSizePacket::get_size() | ||
1093 | +{ | ||
1094 | + return 4; | ||
1095 | +} | ||
1096 | + | ||
1097 | +int SrsSetWindowAckSizePacket::encode_packet(SrsStream* stream) | ||
1098 | +{ | ||
1099 | + int ret = ERROR_SUCCESS; | ||
1100 | + | ||
1101 | + if (!stream->require(4)) { | ||
1102 | + ret = ERROR_RTMP_MESSAGE_ENCODE; | ||
1103 | + srs_error("encode ack size packet failed. ret=%d", ret); | ||
1104 | + return ret; | ||
1105 | + } | ||
1106 | + | ||
1107 | + stream->write_4bytes(ackowledgement_window_size); | ||
1108 | + | ||
1109 | + srs_verbose("encode ack size packet " | ||
1110 | + "success. ack_size=%d", ackowledgement_window_size); | ||
1111 | + | ||
1112 | + return ret; | ||
1113 | +} | ||
1114 | + |
@@ -46,6 +46,9 @@ class SrsMessage; | @@ -46,6 +46,9 @@ class SrsMessage; | ||
46 | class SrsChunkStream; | 46 | class SrsChunkStream; |
47 | class SrsAmf0Object; | 47 | class SrsAmf0Object; |
48 | 48 | ||
49 | +// convert class name to string. | ||
50 | +#define CLASS_NAME_STRING(className) #className | ||
51 | + | ||
49 | /** | 52 | /** |
50 | * max rtmp header size: | 53 | * max rtmp header size: |
51 | * 1bytes basic header, | 54 | * 1bytes basic header, |
@@ -237,9 +240,10 @@ public: | @@ -237,9 +240,10 @@ public: | ||
237 | virtual int get_perfer_cid(); | 240 | virtual int get_perfer_cid(); |
238 | /** | 241 | /** |
239 | * set the encoded packet to encode_packet() to payload. | 242 | * set the encoded packet to encode_packet() to payload. |
243 | + * @stream_id, the id of stream which is created by createStream. | ||
240 | * @remark, user never free the pkt, the message will auto free it. | 244 | * @remark, user never free the pkt, the message will auto free it. |
241 | */ | 245 | */ |
242 | - virtual void set_packet(SrsPacket* pkt); | 246 | + virtual void set_packet(SrsPacket* pkt, int stream_id = 0); |
243 | /** | 247 | /** |
244 | * encode the packet to message payload bytes. | 248 | * encode the packet to message payload bytes. |
245 | * @remark there exists empty packet, so maybe the payload is NULL. | 249 | * @remark there exists empty packet, so maybe the payload is NULL. |
@@ -259,6 +263,36 @@ public: | @@ -259,6 +263,36 @@ public: | ||
259 | virtual int decode(SrsStream* stream); | 263 | virtual int decode(SrsStream* stream); |
260 | public: | 264 | public: |
261 | virtual int get_perfer_cid(); | 265 | virtual int get_perfer_cid(); |
266 | + virtual int get_payload_length(); | ||
267 | +public: | ||
268 | + /** | ||
269 | + * subpacket must override to provide the right message type. | ||
270 | + */ | ||
271 | + virtual int get_message_type(); | ||
272 | + /** | ||
273 | + * the subpacket can override this encode, | ||
274 | + * for example, video and audio will directly set the payload withou memory copy, | ||
275 | + * other packet which need to serialize/encode to bytes by override the | ||
276 | + * get_size and encode_packet. | ||
277 | + */ | ||
278 | + virtual int encode(int& size, char*& payload); | ||
279 | +protected: | ||
280 | + /** | ||
281 | + * subpacket can override to calc the packet size. | ||
282 | + */ | ||
283 | + virtual int get_size(); | ||
284 | + /** | ||
285 | + * subpacket can override to encode the payload to stream. | ||
286 | + */ | ||
287 | + virtual int encode_packet(SrsStream* stream); | ||
288 | +protected: | ||
289 | + /** | ||
290 | + * subpacket must override to provide the right class name. | ||
291 | + */ | ||
292 | + virtual const char* get_class_name() | ||
293 | + { | ||
294 | + return CLASS_NAME_STRING(SrsPacket); | ||
295 | + } | ||
262 | }; | 296 | }; |
263 | 297 | ||
264 | /** | 298 | /** |
@@ -279,6 +313,11 @@ public: | @@ -279,6 +313,11 @@ public: | ||
279 | virtual ~SrsConnectAppPacket(); | 313 | virtual ~SrsConnectAppPacket(); |
280 | public: | 314 | public: |
281 | virtual int decode(SrsStream* stream); | 315 | virtual int decode(SrsStream* stream); |
316 | +protected: | ||
317 | + virtual const char* get_class_name() | ||
318 | + { | ||
319 | + return CLASS_NAME_STRING(SrsConnectAppPacket); | ||
320 | + } | ||
282 | }; | 321 | }; |
283 | 322 | ||
284 | /** | 323 | /** |
@@ -299,6 +338,16 @@ public: | @@ -299,6 +338,16 @@ public: | ||
299 | virtual int decode(SrsStream* stream); | 338 | virtual int decode(SrsStream* stream); |
300 | public: | 339 | public: |
301 | virtual int get_perfer_cid(); | 340 | virtual int get_perfer_cid(); |
341 | +public: | ||
342 | + virtual int get_message_type(); | ||
343 | +protected: | ||
344 | + virtual int get_size(); | ||
345 | + virtual int encode_packet(SrsStream* stream); | ||
346 | +protected: | ||
347 | + virtual const char* get_class_name() | ||
348 | + { | ||
349 | + return CLASS_NAME_STRING(SrsSetWindowAckSizePacket); | ||
350 | + } | ||
302 | }; | 351 | }; |
303 | 352 | ||
304 | /** | 353 | /** |
@@ -141,3 +141,14 @@ std::string SrsStream::read_string(int len) | @@ -141,3 +141,14 @@ std::string SrsStream::read_string(int len) | ||
141 | return value; | 141 | return value; |
142 | } | 142 | } |
143 | 143 | ||
144 | +void SrsStream::write_4bytes(int32_t value) | ||
145 | +{ | ||
146 | + srs_assert(require(4)); | ||
147 | + | ||
148 | + pp = (char*)&value; | ||
149 | + *p++ = pp[3]; | ||
150 | + *p++ = pp[2]; | ||
151 | + *p++ = pp[1]; | ||
152 | + *p++ = pp[0]; | ||
153 | +} | ||
154 | + |
@@ -91,6 +91,11 @@ public: | @@ -91,6 +91,11 @@ public: | ||
91 | * get string from stream, length specifies by param len. | 91 | * get string from stream, length specifies by param len. |
92 | */ | 92 | */ |
93 | virtual std::string read_string(int len); | 93 | virtual std::string read_string(int len); |
94 | +public: | ||
95 | + /** | ||
96 | + * write 4bytes int to stream. | ||
97 | + */ | ||
98 | + virtual void write_4bytes(int32_t value); | ||
94 | }; | 99 | }; |
95 | 100 | ||
96 | #endif | 101 | #endif |
-
请 注册 或 登录 后发表评论