winlin

srs-librtmp: finish the simple publish and play sample.

@@ -25,6 +25,8 @@ gcc srs_play.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_play @@ -25,6 +25,8 @@ gcc srs_play.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_play
25 */ 25 */
26 26
27 #include <stdio.h> 27 #include <stdio.h>
  28 +#include <stdlib.h>
  29 +
28 #include "../../objs/include/srs_librtmp.h" 30 #include "../../objs/include/srs_librtmp.h"
29 31
30 int main(int argc, char** argv) 32 int main(int argc, char** argv)
@@ -33,14 +35,14 @@ int main(int argc, char** argv) @@ -33,14 +35,14 @@ int main(int argc, char** argv)
33 35
34 // packet data 36 // packet data
35 int type, size; 37 int type, size;
36 - u_int32_t timestamp; 38 + u_int32_t timestamp = 0;
37 char* data; 39 char* data;
38 40
39 printf("suck rtmp stream like rtmpdump\n"); 41 printf("suck rtmp stream like rtmpdump\n");
40 printf("srs(simple-rtmp-server) client librtmp library.\n"); 42 printf("srs(simple-rtmp-server) client librtmp library.\n");
41 printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); 43 printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());
42 44
43 - rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live?vhost=__defaultVhost__/livestream"); 45 + rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live/livestream");
44 46
45 if (srs_simple_handshake(rtmp) != 0) { 47 if (srs_simple_handshake(rtmp) != 0) {
46 printf("simple handshake failed.\n"); 48 printf("simple handshake failed.\n");
@@ -25,12 +25,20 @@ gcc srs_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_publish @@ -25,12 +25,20 @@ gcc srs_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_publish
25 */ 25 */
26 26
27 #include <stdio.h> 27 #include <stdio.h>
  28 +#include <stdlib.h>
  29 +#include <unistd.h>
  30 +
28 #include "../../objs/include/srs_librtmp.h" 31 #include "../../objs/include/srs_librtmp.h"
29 32
30 int main(int argc, char** argv) 33 int main(int argc, char** argv)
31 { 34 {
32 srs_rtmp_t rtmp; 35 srs_rtmp_t rtmp;
33 36
  37 + // packet data
  38 + int type, size;
  39 + u_int32_t timestamp = 0;
  40 + char* data;
  41 +
34 printf("publish rtmp stream to server like FMLE/FFMPEG/Encoder\n"); 42 printf("publish rtmp stream to server like FMLE/FFMPEG/Encoder\n");
35 printf("srs(simple-rtmp-server) client librtmp library.\n"); 43 printf("srs(simple-rtmp-server) client librtmp library.\n");
36 printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision()); 44 printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());
@@ -55,6 +63,20 @@ int main(int argc, char** argv) @@ -55,6 +63,20 @@ int main(int argc, char** argv)
55 } 63 }
56 printf("publish stream success\n"); 64 printf("publish stream success\n");
57 65
  66 + for (;;) {
  67 + type = SRS_RTMP_TYPE_VIDEO;
  68 + timestamp += 40;
  69 + size = 4096;
  70 + data = (char*)malloc(4096);
  71 +
  72 + if (srs_write_packet(rtmp, type, timestamp, data, size) != 0) {
  73 + goto rtmp_destroy;
  74 + }
  75 + printf("sent packet: type=%s, time=%d, size=%d\n", srs_type2string(type), timestamp, size);
  76 +
  77 + usleep(40 * 1000);
  78 + }
  79 +
58 rtmp_destroy: 80 rtmp_destroy:
59 srs_rtmp_destroy(rtmp); 81 srs_rtmp_destroy(rtmp);
60 82
@@ -677,7 +677,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata @@ -677,7 +677,7 @@ int SrsSource::on_meta_data(SrsCommonMessage* msg, SrsOnMetaDataPacket* metadata
677 cache_metadata = new SrsSharedPtrMessage(); 677 cache_metadata = new SrsSharedPtrMessage();
678 678
679 // dump message to shared ptr message. 679 // dump message to shared ptr message.
680 - if ((ret = cache_metadata->initialize(msg, payload, size)) != ERROR_SUCCESS) { 680 + if ((ret = cache_metadata->initialize(&msg->header, payload, size)) != ERROR_SUCCESS) {
681 srs_error("initialize the cache metadata failed. ret=%d", ret); 681 srs_error("initialize the cache metadata failed. ret=%d", ret);
682 return ret; 682 return ret;
683 } 683 }
@@ -328,6 +328,51 @@ int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** dat @@ -328,6 +328,51 @@ int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** dat
328 int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size) 328 int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size)
329 { 329 {
330 int ret = ERROR_SUCCESS; 330 int ret = ERROR_SUCCESS;
  331 +
  332 + srs_assert(rtmp != NULL);
  333 + Context* context = (Context*)rtmp;
  334 +
  335 + SrsSharedPtrMessage* msg = NULL;
  336 +
  337 + if (type == SRS_RTMP_TYPE_AUDIO) {
  338 + SrsMessageHeader header;
  339 + header.initialize_audio(size, timestamp, context->stream_id);
  340 +
  341 + msg = new SrsSharedPtrMessage();
  342 + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
  343 + srs_freepa(data);
  344 + return ret;
  345 + }
  346 + } else if (type == SRS_RTMP_TYPE_VIDEO) {
  347 + SrsMessageHeader header;
  348 + header.initialize_video(size, timestamp, context->stream_id);
  349 +
  350 + msg = new SrsSharedPtrMessage();
  351 + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
  352 + srs_freepa(data);
  353 + return ret;
  354 + }
  355 + } else if (type == SRS_RTMP_TYPE_SCRIPT) {
  356 + SrsMessageHeader header;
  357 + header.initialize_amf0_script(size, context->stream_id);
  358 +
  359 + msg = new SrsSharedPtrMessage();
  360 + if ((ret = msg->initialize(&header, data, size)) != ERROR_SUCCESS) {
  361 + srs_freepa(data);
  362 + return ret;
  363 + }
  364 + }
  365 +
  366 + if (msg) {
  367 + // send out encoded msg.
  368 + if ((ret = context->rtmp->send_message(msg)) != ERROR_SUCCESS) {
  369 + return ret;
  370 + }
  371 + } else {
  372 + // directly free data if not sent out.
  373 + srs_freepa(data);
  374 + }
  375 +
331 return ret; 376 return ret;
332 } 377 }
333 378
@@ -1193,6 +1193,33 @@ bool SrsMessageHeader::is_user_control_message() @@ -1193,6 +1193,33 @@ bool SrsMessageHeader::is_user_control_message()
1193 return message_type == RTMP_MSG_UserControlMessage; 1193 return message_type == RTMP_MSG_UserControlMessage;
1194 } 1194 }
1195 1195
  1196 +void SrsMessageHeader::initialize_amf0_script(int size, int stream)
  1197 +{
  1198 + message_type = RTMP_MSG_AMF0DataMessage;
  1199 + payload_length = (int32_t)size;
  1200 + timestamp_delta = (int32_t)0;
  1201 + timestamp = (int64_t)0;
  1202 + stream_id = (int32_t)stream;
  1203 +}
  1204 +
  1205 +void SrsMessageHeader::initialize_audio(int size, u_int32_t time, int stream)
  1206 +{
  1207 + message_type = RTMP_MSG_AudioMessage;
  1208 + payload_length = (int32_t)size;
  1209 + timestamp_delta = (int32_t)time;
  1210 + timestamp = (int64_t)time;
  1211 + stream_id = (int32_t)stream;
  1212 +}
  1213 +
  1214 +void SrsMessageHeader::initialize_video(int size, u_int32_t time, int stream)
  1215 +{
  1216 + message_type = RTMP_MSG_VideoMessage;
  1217 + payload_length = (int32_t)size;
  1218 + timestamp_delta = (int32_t)time;
  1219 + timestamp = (int64_t)time;
  1220 + stream_id = (int32_t)stream;
  1221 +}
  1222 +
1196 SrsChunkStream::SrsChunkStream(int _cid) 1223 SrsChunkStream::SrsChunkStream(int _cid)
1197 { 1224 {
1198 fmt = 0; 1225 fmt = 0;
@@ -1516,7 +1543,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) @@ -1516,7 +1543,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source)
1516 { 1543 {
1517 int ret = ERROR_SUCCESS; 1544 int ret = ERROR_SUCCESS;
1518 1545
1519 - if ((ret = initialize(source, (char*)source->payload, source->size)) != ERROR_SUCCESS) { 1546 + if ((ret = initialize(&source->header, (char*)source->payload, source->size)) != ERROR_SUCCESS) {
1520 return ret; 1547 return ret;
1521 } 1548 }
1522 1549
@@ -1527,7 +1554,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source) @@ -1527,7 +1554,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source)
1527 return ret; 1554 return ret;
1528 } 1555 }
1529 1556
1530 -int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int size) 1557 +int SrsSharedPtrMessage::initialize(SrsMessageHeader* source, char* payload, int size)
1531 { 1558 {
1532 int ret = ERROR_SUCCESS; 1559 int ret = ERROR_SUCCESS;
1533 1560
@@ -1540,7 +1567,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int @@ -1540,7 +1567,7 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int
1540 return ret; 1567 return ret;
1541 } 1568 }
1542 1569
1543 - header = source->header; 1570 + header = *source;
1544 header.payload_length = size; 1571 header.payload_length = size;
1545 1572
1546 ptr = new SrsSharedPtr(); 1573 ptr = new SrsSharedPtr();
@@ -1549,9 +1576,9 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int @@ -1549,9 +1576,9 @@ int SrsSharedPtrMessage::initialize(SrsCommonMessage* source, char* payload, int
1549 ptr->payload = payload; 1576 ptr->payload = payload;
1550 ptr->size = size; 1577 ptr->size = size;
1551 1578
1552 - if (source->header.is_video()) { 1579 + if (source->is_video()) {
1553 ptr->perfer_cid = RTMP_CID_Video; 1580 ptr->perfer_cid = RTMP_CID_Video;
1554 - } else if (source->header.is_audio()) { 1581 + } else if (source->is_audio()) {
1555 ptr->perfer_cid = RTMP_CID_Audio; 1582 ptr->perfer_cid = RTMP_CID_Audio;
1556 } else { 1583 } else {
1557 ptr->perfer_cid = RTMP_CID_OverConnection2; 1584 ptr->perfer_cid = RTMP_CID_OverConnection2;
@@ -262,6 +262,10 @@ struct SrsMessageHeader @@ -262,6 +262,10 @@ struct SrsMessageHeader
262 bool is_window_ackledgement_size(); 262 bool is_window_ackledgement_size();
263 bool is_set_chunk_size(); 263 bool is_set_chunk_size();
264 bool is_user_control_message(); 264 bool is_user_control_message();
  265 +
  266 + void initialize_amf0_script(int size, int stream);
  267 + void initialize_audio(int size, u_int32_t time, int stream);
  268 + void initialize_video(int size, u_int32_t time, int stream);
265 }; 269 };
266 270
267 /** 271 /**
@@ -434,9 +438,9 @@ public: @@ -434,9 +438,9 @@ public:
434 virtual int initialize(SrsCommonMessage* source); 438 virtual int initialize(SrsCommonMessage* source);
435 /** 439 /**
436 * set the shared payload. 440 * set the shared payload.
437 - * we will use the payload, donot use the payload of source. 441 + * use source header, and specified param payload.
438 */ 442 */
439 - virtual int initialize(SrsCommonMessage* source, char* payload, int size); 443 + virtual int initialize(SrsMessageHeader* source, char* payload, int size);
440 virtual SrsSharedPtrMessage* copy(); 444 virtual SrsSharedPtrMessage* copy();
441 public: 445 public:
442 /** 446 /**