正在显示
3 个修改的文件
包含
189 行增加
和
13 行删除
@@ -65,5 +65,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -65,5 +65,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
65 | #define ERROR_SYSTEM_STREAM_INIT 400 | 65 | #define ERROR_SYSTEM_STREAM_INIT 400 |
66 | #define ERROR_SYSTEM_PACKET_INVALID 401 | 66 | #define ERROR_SYSTEM_PACKET_INVALID 401 |
67 | #define ERROR_SYSTEM_CLIENT_INVALID 402 | 67 | #define ERROR_SYSTEM_CLIENT_INVALID 402 |
68 | +#define ERROR_SYSTEM_ASSERT_FAILED 403 | ||
68 | 69 | ||
69 | #endif | 70 | #endif |
@@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | @@ -29,6 +29,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. | ||
29 | #include <srs_core_socket.hpp> | 29 | #include <srs_core_socket.hpp> |
30 | #include <srs_core_buffer.hpp> | 30 | #include <srs_core_buffer.hpp> |
31 | #include <srs_core_stream.hpp> | 31 | #include <srs_core_stream.hpp> |
32 | +#include <srs_core_auto_free.hpp> | ||
32 | 33 | ||
33 | /**************************************************************************** | 34 | /**************************************************************************** |
34 | ***************************************************************************** | 35 | ***************************************************************************** |
@@ -319,10 +320,13 @@ int SrsProtocol::recv_message(SrsMessage** pmsg) | @@ -319,10 +320,13 @@ int SrsProtocol::recv_message(SrsMessage** pmsg) | ||
319 | return ret; | 320 | return ret; |
320 | } | 321 | } |
321 | 322 | ||
322 | -int SrsProtocol::send_message(SrsMessage* msg) | 323 | +int SrsProtocol::send_message(SrsOutputableMessage* msg) |
323 | { | 324 | { |
324 | int ret = ERROR_SUCCESS; | 325 | int ret = ERROR_SUCCESS; |
325 | 326 | ||
327 | + // free msg whatever return value. | ||
328 | + SrsAutoFree(SrsOutputableMessage, msg, false); | ||
329 | + | ||
326 | if ((ret = msg->encode_packet()) != ERROR_SUCCESS) { | 330 | if ((ret = msg->encode_packet()) != ERROR_SUCCESS) { |
327 | srs_error("encode packet to message payload failed. ret=%d", ret); | 331 | srs_error("encode packet to message payload failed. ret=%d", ret); |
328 | return ret; | 332 | return ret; |
@@ -475,15 +479,21 @@ int SrsProtocol::on_recv_message(SrsMessage* msg) | @@ -475,15 +479,21 @@ int SrsProtocol::on_recv_message(SrsMessage* msg) | ||
475 | return ret; | 479 | return ret; |
476 | } | 480 | } |
477 | 481 | ||
478 | -int SrsProtocol::on_send_message(SrsMessage* msg) | 482 | +int SrsProtocol::on_send_message(SrsOutputableMessage* msg) |
479 | { | 483 | { |
480 | int ret = ERROR_SUCCESS; | 484 | int ret = ERROR_SUCCESS; |
481 | 485 | ||
482 | - srs_assert(msg != NULL); | 486 | + SrsMessage* common_msg = dynamic_cast<SrsMessage*>(msg); |
487 | + if (!msg) { | ||
488 | + srs_verbose("ignore the shared ptr message."); | ||
489 | + return ret; | ||
490 | + } | ||
483 | 491 | ||
484 | - switch (msg->header.message_type) { | 492 | + srs_assert(common_msg != NULL); |
493 | + | ||
494 | + switch (common_msg->header.message_type) { | ||
485 | case RTMP_MSG_SetChunkSize: { | 495 | case RTMP_MSG_SetChunkSize: { |
486 | - SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(msg->get_packet()); | 496 | + SrsSetChunkSizePacket* pkt = dynamic_cast<SrsSetChunkSizePacket*>(common_msg->get_packet()); |
487 | srs_assert(pkt != NULL); | 497 | srs_assert(pkt != NULL); |
488 | 498 | ||
489 | out_chunk_size = pkt->chunk_size; | 499 | out_chunk_size = pkt->chunk_size; |
@@ -917,17 +927,30 @@ SrsChunkStream::~SrsChunkStream() | @@ -917,17 +927,30 @@ SrsChunkStream::~SrsChunkStream() | ||
917 | srs_freep(msg); | 927 | srs_freep(msg); |
918 | } | 928 | } |
919 | 929 | ||
920 | -SrsMessage::SrsMessage() | 930 | +SrsOutputableMessage::SrsOutputableMessage() |
921 | { | 931 | { |
932 | + payload = NULL; | ||
922 | size = 0; | 933 | size = 0; |
934 | +} | ||
935 | + | ||
936 | +SrsOutputableMessage::~SrsOutputableMessage() | ||
937 | +{ | ||
938 | + free_payload(); | ||
939 | +} | ||
940 | + | ||
941 | +void SrsOutputableMessage::free_payload() | ||
942 | +{ | ||
943 | + srs_freepa(payload); | ||
944 | +} | ||
945 | + | ||
946 | +SrsMessage::SrsMessage() | ||
947 | +{ | ||
923 | stream = NULL; | 948 | stream = NULL; |
924 | - payload = NULL; | ||
925 | packet = NULL; | 949 | packet = NULL; |
926 | } | 950 | } |
927 | 951 | ||
928 | SrsMessage::~SrsMessage() | 952 | SrsMessage::~SrsMessage() |
929 | { | 953 | { |
930 | - srs_freep(payload); | ||
931 | srs_freep(packet); | 954 | srs_freep(packet); |
932 | srs_freep(stream); | 955 | srs_freep(stream); |
933 | } | 956 | } |
@@ -1089,14 +1112,97 @@ int SrsMessage::encode_packet() | @@ -1089,14 +1112,97 @@ int SrsMessage::encode_packet() | ||
1089 | return packet->encode(size, (char*&)payload); | 1112 | return packet->encode(size, (char*&)payload); |
1090 | } | 1113 | } |
1091 | 1114 | ||
1115 | +SrsSharedMessage::SrsSharedPtr::SrsSharedPtr() | ||
1116 | +{ | ||
1117 | + payload = NULL; | ||
1118 | + size = 0; | ||
1119 | + perfer_cid = 0; | ||
1120 | + shared_count = 0; | ||
1121 | +} | ||
1122 | + | ||
1123 | +SrsSharedMessage::SrsSharedPtr::~SrsSharedPtr() | ||
1124 | +{ | ||
1125 | + srs_freepa(payload); | ||
1126 | +} | ||
1127 | + | ||
1092 | SrsSharedMessage::SrsSharedMessage() | 1128 | SrsSharedMessage::SrsSharedMessage() |
1093 | { | 1129 | { |
1130 | + ptr = NULL; | ||
1094 | } | 1131 | } |
1095 | 1132 | ||
1096 | SrsSharedMessage::~SrsSharedMessage() | 1133 | SrsSharedMessage::~SrsSharedMessage() |
1097 | { | 1134 | { |
1098 | } | 1135 | } |
1099 | 1136 | ||
1137 | +void SrsSharedMessage::free_payload() | ||
1138 | +{ | ||
1139 | + if (ptr) { | ||
1140 | + if (ptr->shared_count == 0) { | ||
1141 | + srs_freep(ptr); | ||
1142 | + } else { | ||
1143 | + ptr->shared_count--; | ||
1144 | + } | ||
1145 | + } | ||
1146 | +} | ||
1147 | + | ||
1148 | +int SrsSharedMessage::initialize(SrsMessageHeader* header, char* payload, int size, int perfer_cid) | ||
1149 | +{ | ||
1150 | + int ret = ERROR_SUCCESS; | ||
1151 | + | ||
1152 | + super::header = *header; | ||
1153 | + | ||
1154 | + if (ptr) { | ||
1155 | + ret = ERROR_SYSTEM_ASSERT_FAILED; | ||
1156 | + srs_error("should not set the payload twice. ret=%d", ret); | ||
1157 | + srs_assert(false); | ||
1158 | + | ||
1159 | + return ret; | ||
1160 | + } | ||
1161 | + | ||
1162 | + ptr = new SrsSharedPtr(); | ||
1163 | + ptr->payload = payload; | ||
1164 | + ptr->size = size; | ||
1165 | + ptr->perfer_cid = perfer_cid; | ||
1166 | + | ||
1167 | + super::payload = (int8_t*)ptr->payload; | ||
1168 | + super::size = ptr->size; | ||
1169 | + | ||
1170 | + return ret; | ||
1171 | +} | ||
1172 | + | ||
1173 | +SrsSharedMessage* SrsSharedMessage::copy() | ||
1174 | +{ | ||
1175 | + if (!ptr) { | ||
1176 | + srs_error("invoke initialize to initialize the ptr."); | ||
1177 | + srs_assert(false); | ||
1178 | + return NULL; | ||
1179 | + } | ||
1180 | + | ||
1181 | + SrsSharedMessage* copy = new SrsSharedMessage(); | ||
1182 | + copy->ptr = ptr; | ||
1183 | + ptr->shared_count++; | ||
1184 | + | ||
1185 | + copy->payload = (int8_t*)ptr->payload; | ||
1186 | + copy->size = ptr->size; | ||
1187 | + | ||
1188 | + return copy; | ||
1189 | +} | ||
1190 | + | ||
1191 | +int SrsSharedMessage::get_perfer_cid() | ||
1192 | +{ | ||
1193 | + if (!ptr) { | ||
1194 | + return 0; | ||
1195 | + } | ||
1196 | + | ||
1197 | + return ptr->perfer_cid; | ||
1198 | +} | ||
1199 | + | ||
1200 | +int SrsSharedMessage::encode_packet() | ||
1201 | +{ | ||
1202 | + srs_verbose("shared message ignore the encode method."); | ||
1203 | + return ERROR_SUCCESS; | ||
1204 | +} | ||
1205 | + | ||
1100 | SrsPacket::SrsPacket() | 1206 | SrsPacket::SrsPacket() |
1101 | { | 1207 | { |
1102 | } | 1208 | } |
@@ -47,6 +47,7 @@ class SrsChunkStream; | @@ -47,6 +47,7 @@ class SrsChunkStream; | ||
47 | class SrsAmf0Object; | 47 | class SrsAmf0Object; |
48 | class SrsAmf0Null; | 48 | class SrsAmf0Null; |
49 | class SrsAmf0Undefined; | 49 | class SrsAmf0Undefined; |
50 | +class SrsOutputableMessage; | ||
50 | 51 | ||
51 | // convert class name to string. | 52 | // convert class name to string. |
52 | #define CLASS_NAME_STRING(className) #className | 53 | #define CLASS_NAME_STRING(className) #className |
@@ -111,7 +112,7 @@ public: | @@ -111,7 +112,7 @@ public: | ||
111 | * then sendout over socket. | 112 | * then sendout over socket. |
112 | * @msg this method will free it whatever return value. | 113 | * @msg this method will free it whatever return value. |
113 | */ | 114 | */ |
114 | - virtual int send_message(SrsMessage* msg); | 115 | + virtual int send_message(SrsOutputableMessage* msg); |
115 | private: | 116 | private: |
116 | /** | 117 | /** |
117 | * when recv message, update the context. | 118 | * when recv message, update the context. |
@@ -120,7 +121,7 @@ private: | @@ -120,7 +121,7 @@ private: | ||
120 | /** | 121 | /** |
121 | * when message sentout, update the context. | 122 | * when message sentout, update the context. |
122 | */ | 123 | */ |
123 | - virtual int on_send_message(SrsMessage* msg); | 124 | + virtual int on_send_message(SrsOutputableMessage* msg); |
124 | /** | 125 | /** |
125 | * try to recv interlaced message from peer, | 126 | * try to recv interlaced message from peer, |
126 | * return error if error occur and nerver set the pmsg, | 127 | * return error if error occur and nerver set the pmsg, |
@@ -232,9 +233,9 @@ public: | @@ -232,9 +233,9 @@ public: | ||
232 | }; | 233 | }; |
233 | 234 | ||
234 | /** | 235 | /** |
235 | -* common RTMP message defines in rtmp.part2.Message-Formats.pdf. | 236 | +* message to output. |
236 | */ | 237 | */ |
237 | -class SrsMessage | 238 | +class SrsOutputableMessage |
238 | { | 239 | { |
239 | // 4.1. Message Header | 240 | // 4.1. Message Header |
240 | public: | 241 | public: |
@@ -249,6 +250,34 @@ public: | @@ -249,6 +250,34 @@ public: | ||
249 | */ | 250 | */ |
250 | int32_t size; | 251 | int32_t size; |
251 | int8_t* payload; | 252 | int8_t* payload; |
253 | +public: | ||
254 | + SrsOutputableMessage(); | ||
255 | + virtual ~SrsOutputableMessage(); | ||
256 | +protected: | ||
257 | + virtual void free_payload(); | ||
258 | +/** | ||
259 | +* encode functions. | ||
260 | +*/ | ||
261 | +public: | ||
262 | + /** | ||
263 | + * get the perfered cid(chunk stream id) which sendout over. | ||
264 | + */ | ||
265 | + virtual int get_perfer_cid() = 0; | ||
266 | + /** | ||
267 | + * encode the packet to message payload bytes. | ||
268 | + * @remark there exists empty packet, so maybe the payload is NULL. | ||
269 | + */ | ||
270 | + virtual int encode_packet() = 0; | ||
271 | +}; | ||
272 | + | ||
273 | +/** | ||
274 | +* common RTMP message defines in rtmp.part2.Message-Formats.pdf. | ||
275 | +* cannbe parse and decode. | ||
276 | +*/ | ||
277 | +class SrsMessage : public SrsOutputableMessage | ||
278 | +{ | ||
279 | +private: | ||
280 | + typedef SrsOutputableMessage super; | ||
252 | // decoded message payload. | 281 | // decoded message payload. |
253 | private: | 282 | private: |
254 | SrsStream* stream; | 283 | SrsStream* stream; |
@@ -256,6 +285,9 @@ private: | @@ -256,6 +285,9 @@ private: | ||
256 | public: | 285 | public: |
257 | SrsMessage(); | 286 | SrsMessage(); |
258 | virtual ~SrsMessage(); | 287 | virtual ~SrsMessage(); |
288 | +/** | ||
289 | +* decode functions. | ||
290 | +*/ | ||
259 | public: | 291 | public: |
260 | /** | 292 | /** |
261 | * decode packet from message payload. | 293 | * decode packet from message payload. |
@@ -266,6 +298,9 @@ public: | @@ -266,6 +298,9 @@ public: | ||
266 | * @remark, user never free the pkt, the message will auto free it. | 298 | * @remark, user never free the pkt, the message will auto free it. |
267 | */ | 299 | */ |
268 | virtual SrsPacket* get_packet(); | 300 | virtual SrsPacket* get_packet(); |
301 | +/** | ||
302 | +* encode functions. | ||
303 | +*/ | ||
269 | public: | 304 | public: |
270 | /** | 305 | /** |
271 | * get the perfered cid(chunk stream id) which sendout over. | 306 | * get the perfered cid(chunk stream id) which sendout over. |
@@ -287,12 +322,46 @@ public: | @@ -287,12 +322,46 @@ public: | ||
287 | /** | 322 | /** |
288 | * shared ptr message. | 323 | * shared ptr message. |
289 | * for audio/video/data message that need less memory copy. | 324 | * for audio/video/data message that need less memory copy. |
325 | +* and only for output. | ||
290 | */ | 326 | */ |
291 | -class SrsSharedMessage : public SrsMessage | 327 | +class SrsSharedMessage : public SrsOutputableMessage |
292 | { | 328 | { |
329 | +private: | ||
330 | + typedef SrsOutputableMessage super; | ||
331 | +private: | ||
332 | + struct SrsSharedPtr | ||
333 | + { | ||
334 | + char* payload; | ||
335 | + int size; | ||
336 | + int perfer_cid; | ||
337 | + int shared_count; | ||
338 | + | ||
339 | + SrsSharedPtr(); | ||
340 | + virtual ~SrsSharedPtr(); | ||
341 | + }; | ||
342 | + SrsSharedPtr* ptr; | ||
293 | public: | 343 | public: |
294 | SrsSharedMessage(); | 344 | SrsSharedMessage(); |
295 | virtual ~SrsSharedMessage(); | 345 | virtual ~SrsSharedMessage(); |
346 | +protected: | ||
347 | + virtual void free_payload(); | ||
348 | +public: | ||
349 | + /** | ||
350 | + * set the shared payload. | ||
351 | + */ | ||
352 | + virtual int initialize(SrsMessageHeader* header, char* payload, int size, int perfer_cid); | ||
353 | + virtual SrsSharedMessage* copy(); | ||
354 | +public: | ||
355 | + /** | ||
356 | + * get the perfered cid(chunk stream id) which sendout over. | ||
357 | + */ | ||
358 | + virtual int get_perfer_cid(); | ||
359 | + /** | ||
360 | + * ignored. | ||
361 | + * for shared message, nothing should be done. | ||
362 | + * use initialize() to set the data. | ||
363 | + */ | ||
364 | + virtual int encode_packet(); | ||
296 | }; | 365 | }; |
297 | 366 | ||
298 | /** | 367 | /** |
-
请 注册 或 登录 后发表评论