mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	srs-librtmp: implements the read packet.
This commit is contained in:
		
							parent
							
								
									c338eb3666
								
							
						
					
					
						commit
						efa09102cf
					
				
					 4 changed files with 137 additions and 1 deletions
				
			
		| 
						 | 
					@ -31,11 +31,16 @@ int main(int argc, char** argv)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
	srs_rtmp_t rtmp;
 | 
						srs_rtmp_t rtmp;
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						// packet data
 | 
				
			||||||
 | 
						int type, size;
 | 
				
			||||||
 | 
						u_int32_t timestamp;
 | 
				
			||||||
 | 
						char* data;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
    printf("suck rtmp stream like rtmpdump\n");
 | 
					    printf("suck rtmp stream like rtmpdump\n");
 | 
				
			||||||
    printf("srs(simple-rtmp-server) client librtmp library.\n");
 | 
					    printf("srs(simple-rtmp-server) client librtmp library.\n");
 | 
				
			||||||
    printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());
 | 
					    printf("version: %d.%d.%d\n", srs_version_major(), srs_version_minor(), srs_version_revision());
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live/show?vhost=__defaultVhost__/livestream");
 | 
					    rtmp = srs_rtmp_create("rtmp://127.0.0.1:1935/live?vhost=__defaultVhost__/livestream");
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 	if (srs_simple_handshake(rtmp) != 0) {
 | 
					 	if (srs_simple_handshake(rtmp) != 0) {
 | 
				
			||||||
		printf("simple handshake failed.\n");
 | 
							printf("simple handshake failed.\n");
 | 
				
			||||||
| 
						 | 
					@ -55,6 +60,15 @@ int main(int argc, char** argv)
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	printf("play stream success\n");
 | 
						printf("play stream success\n");
 | 
				
			||||||
	
 | 
						
 | 
				
			||||||
 | 
						for (;;) {
 | 
				
			||||||
 | 
							if (srs_read_packet(rtmp, &type, ×tamp, &data, &size) != 0) {
 | 
				
			||||||
 | 
								goto rtmp_destroy;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							printf("got packet: type=%s, time=%d, size=%d\n", srs_type2string(type), timestamp, size);
 | 
				
			||||||
 | 
							
 | 
				
			||||||
 | 
							free(data);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
rtmp_destroy:
 | 
					rtmp_destroy:
 | 
				
			||||||
    srs_rtmp_destroy(rtmp);
 | 
					    srs_rtmp_destroy(rtmp);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -33,6 +33,8 @@ using namespace std;
 | 
				
			||||||
#include <srs_lib_simple_socket.hpp>
 | 
					#include <srs_lib_simple_socket.hpp>
 | 
				
			||||||
#include <srs_kernel_log.hpp>
 | 
					#include <srs_kernel_log.hpp>
 | 
				
			||||||
#include <srs_protocol_utility.hpp>
 | 
					#include <srs_protocol_utility.hpp>
 | 
				
			||||||
 | 
					#include <srs_core_autofree.hpp>
 | 
				
			||||||
 | 
					#include <srs_protocol_rtmp_stack.hpp>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// if user want to define log, define the folowing macro.
 | 
					// if user want to define log, define the folowing macro.
 | 
				
			||||||
#ifndef SRS_RTMP_USER_DEFINED_LOG
 | 
					#ifndef SRS_RTMP_USER_DEFINED_LOG
 | 
				
			||||||
| 
						 | 
					@ -256,6 +258,79 @@ int srs_publish_stream(srs_rtmp_t rtmp)
 | 
				
			||||||
	return ret;
 | 
						return ret;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const char* srs_type2string(int type)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						switch (type) {
 | 
				
			||||||
 | 
							case SRS_RTMP_TYPE_AUDIO: return "Audio";
 | 
				
			||||||
 | 
							case SRS_RTMP_TYPE_VIDEO: return "Video";
 | 
				
			||||||
 | 
							case SRS_RTMP_TYPE_SCRIPT: return "Data";
 | 
				
			||||||
 | 
							default: return "Unknown";
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						return "Unknown";
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** data, int* size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						*type = 0;
 | 
				
			||||||
 | 
						*timestamp = 0;
 | 
				
			||||||
 | 
						*data = NULL;
 | 
				
			||||||
 | 
						*size = 0;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
						int ret = ERROR_SUCCESS;
 | 
				
			||||||
 | 
						
 | 
				
			||||||
 | 
					    srs_assert(rtmp != NULL);
 | 
				
			||||||
 | 
					    Context* context = (Context*)rtmp;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (;;) {
 | 
				
			||||||
 | 
					        SrsCommonMessage* msg = NULL;
 | 
				
			||||||
 | 
					        if ((ret = context->rtmp->recv_message(&msg)) != ERROR_SUCCESS) {
 | 
				
			||||||
 | 
					            return ret;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        if (!msg) {
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        SrsAutoFree(SrsCommonMessage, msg, false);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (msg->header.is_audio()) {
 | 
				
			||||||
 | 
					            *type = SRS_RTMP_TYPE_AUDIO;
 | 
				
			||||||
 | 
					            *timestamp = (u_int32_t)msg->header.timestamp;
 | 
				
			||||||
 | 
					            *data = (char*)msg->payload;
 | 
				
			||||||
 | 
					            *size = (int)msg->size;
 | 
				
			||||||
 | 
					            // detach bytes from packet.
 | 
				
			||||||
 | 
					            msg->payload = NULL;
 | 
				
			||||||
 | 
					        } else if (msg->header.is_video()) {
 | 
				
			||||||
 | 
					            *type = SRS_RTMP_TYPE_VIDEO;
 | 
				
			||||||
 | 
					            *timestamp = (u_int32_t)msg->header.timestamp;
 | 
				
			||||||
 | 
					            *data = (char*)msg->payload;
 | 
				
			||||||
 | 
					            *size = (int)msg->size;
 | 
				
			||||||
 | 
					            // detach bytes from packet.
 | 
				
			||||||
 | 
					            msg->payload = NULL;
 | 
				
			||||||
 | 
					        } else if (msg->header.is_amf0_data() || msg->header.is_amf3_data()) {
 | 
				
			||||||
 | 
					            *type = SRS_RTMP_TYPE_SCRIPT;
 | 
				
			||||||
 | 
					            *data = (char*)msg->payload;
 | 
				
			||||||
 | 
					            *size = (int)msg->size;
 | 
				
			||||||
 | 
					            // detach bytes from packet.
 | 
				
			||||||
 | 
					            msg->payload = NULL;
 | 
				
			||||||
 | 
					        } else {
 | 
				
			||||||
 | 
					            // ignore and continue
 | 
				
			||||||
 | 
					            continue;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        // got expected message.
 | 
				
			||||||
 | 
					        break;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int ret = ERROR_SUCCESS;
 | 
				
			||||||
 | 
						return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int srs_ssl_enabled()
 | 
					int srs_ssl_enabled()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#ifndef SRS_SSL
 | 
					#ifndef SRS_SSL
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
#include <srs_librtmp.h>
 | 
					#include <srs_librtmp.h>
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <sys/types.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* srs-librtmp is a librtmp like library,
 | 
					* srs-librtmp is a librtmp like library,
 | 
				
			||||||
* used to play/publish rtmp stream from/to rtmp server.
 | 
					* used to play/publish rtmp stream from/to rtmp server.
 | 
				
			||||||
| 
						 | 
					@ -100,6 +102,43 @@ int srs_play_stream(srs_rtmp_t rtmp);
 | 
				
			||||||
*/
 | 
					*/
 | 
				
			||||||
int srs_publish_stream(srs_rtmp_t rtmp);
 | 
					int srs_publish_stream(srs_rtmp_t rtmp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* E.4.1 FLV Tag, page 75
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					// 8 = audio
 | 
				
			||||||
 | 
					#define SRS_RTMP_TYPE_AUDIO 8
 | 
				
			||||||
 | 
					// 9 = video
 | 
				
			||||||
 | 
					#define SRS_RTMP_TYPE_VIDEO 9
 | 
				
			||||||
 | 
					// 18 = script data
 | 
				
			||||||
 | 
					#define SRS_RTMP_TYPE_SCRIPT 18
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* convert the flv tag type to string.
 | 
				
			||||||
 | 
					* 	SRS_RTMP_TYPE_AUDIO to "Audio"
 | 
				
			||||||
 | 
					* 	SRS_RTMP_TYPE_VIDEO to "Video"
 | 
				
			||||||
 | 
					* 	SRS_RTMP_TYPE_SCRIPT to "Data"
 | 
				
			||||||
 | 
					* 	otherwise, "Unknown"
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					const char* srs_type2string(int type);
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					* read a audio/video/script-data packet from rtmp stream.
 | 
				
			||||||
 | 
					* @param type, output the packet type, macros:
 | 
				
			||||||
 | 
					*			SRS_RTMP_TYPE_AUDIO, FlvTagAudio
 | 
				
			||||||
 | 
					*			SRS_RTMP_TYPE_VIDEO, FlvTagVideo
 | 
				
			||||||
 | 
					*			SRS_RTMP_TYPE_SCRIPT, FlvTagScript
 | 
				
			||||||
 | 
					* @param timestamp, in ms, overflow in 50days
 | 
				
			||||||
 | 
					* @param data, the packet data, according to type:
 | 
				
			||||||
 | 
					* 			FlvTagAudio, @see "E.4.2.1 AUDIODATA"
 | 
				
			||||||
 | 
					*			FlvTagVideo, @see "E.4.3.1 VIDEODATA"
 | 
				
			||||||
 | 
					*			FlvTagScript, @see "E.4.4.1 SCRIPTDATA"
 | 
				
			||||||
 | 
					* @param size, size of packet.
 | 
				
			||||||
 | 
					* @return the error code. 0 for success; otherwise, error.
 | 
				
			||||||
 | 
					*
 | 
				
			||||||
 | 
					* @remark: for read, user must free the data.
 | 
				
			||||||
 | 
					* @remark: for write, user should never free the data, even if error.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					int srs_read_packet(srs_rtmp_t rtmp, int* type, u_int32_t* timestamp, char** data, int* size);
 | 
				
			||||||
 | 
					int srs_write_packet(srs_rtmp_t rtmp, int type, u_int32_t timestamp, char* data, int size);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
* whether srs is compiled with ssl,
 | 
					* whether srs is compiled with ssl,
 | 
				
			||||||
* that is, compile srs with ssl: ./configure --with-ssl,.
 | 
					* that is, compile srs with ssl: ./configure --with-ssl,.
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1025,6 +1025,14 @@ int SrsProtocol::read_message_header(SrsChunkStream* chunk, char fmt, int bh_siz
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// ffmpeg/librtmp may donot send this filed, need to detect the value.
 | 
							// ffmpeg/librtmp may donot send this filed, need to detect the value.
 | 
				
			||||||
		// @see also: http://blog.csdn.net/win_lin/article/details/13363699
 | 
							// @see also: http://blog.csdn.net/win_lin/article/details/13363699
 | 
				
			||||||
 | 
							// the extended-timestamp must be unsigned-int,
 | 
				
			||||||
 | 
							// 		24bits timestamp: 0xffffff = 16777215ms = 16777.215s = 4.66h
 | 
				
			||||||
 | 
							// 		32bits timestamp: 0xffffffff = 4294967295ms = 4294967.295s = 1193.046h = 49.71d
 | 
				
			||||||
 | 
							// because the rtmp protocol says the 32bits timestamp is about "50 days":
 | 
				
			||||||
 | 
							// 		3. Byte Order, Alignment, and Time Format
 | 
				
			||||||
 | 
							//				Because timestamps are generally only 32 bits long, they will roll
 | 
				
			||||||
 | 
							//				over after fewer than 50 days.
 | 
				
			||||||
 | 
							// so, use u_int32_t is right.
 | 
				
			||||||
		u_int32_t timestamp = 0x00;
 | 
							u_int32_t timestamp = 0x00;
 | 
				
			||||||
        char* pp = (char*)×tamp;
 | 
					        char* pp = (char*)×tamp;
 | 
				
			||||||
        pp[3] = *p++;
 | 
					        pp[3] = *p++;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue