mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	update for bug #66, add the srs-librtmp sample for publish h.264 raw stream.
This commit is contained in:
		
							parent
							
								
									1db69b153e
								
							
						
					
					
						commit
						b964a6c534
					
				
					 4 changed files with 117 additions and 10 deletions
				
			
		| 
						 | 
					@ -1,4 +1,5 @@
 | 
				
			||||||
/*
 | 
					/*
 | 
				
			||||||
 | 
					# see: https://github.com/winlinvip/simple-rtmp-server/issues/190
 | 
				
			||||||
# see: https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_SrsLinuxArm
 | 
					# see: https://github.com/winlinvip/simple-rtmp-server/wiki/v1_CN_SrsLinuxArm
 | 
				
			||||||
    g++ -g -O0 -o jmp_sp jmp_sp.cpp
 | 
					    g++ -g -O0 -o jmp_sp jmp_sp.cpp
 | 
				
			||||||
    arm-linux-gnueabi-g++ -g -o jmp_sp jmp_sp.cpp -static
 | 
					    arm-linux-gnueabi-g++ -g -o jmp_sp jmp_sp.cpp -static
 | 
				
			||||||
| 
						 | 
					@ -14,15 +15,13 @@ void func1()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
#if defined(__amd64__) || defined(__x86_64__)
 | 
					#if defined(__amd64__) || defined(__x86_64__)
 | 
				
			||||||
    register long int rsp0 asm("rsp");
 | 
					    register long int rsp0 asm("rsp");
 | 
				
			||||||
    printf("in func1, rsp=%#lx, longjmp to func0\n", rsp0);
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    longjmp(env_func1, 0x101);
 | 
					    int ret = setjmp(env_func1);
 | 
				
			||||||
    
 | 
					    printf("setjmp func0 ret=%d, rsp=%#lx\n", ret, rsp0);
 | 
				
			||||||
    printf("func1 terminated\n");
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void func0(int* pv0, int* pv1)
 | 
					void func0()
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
    the definition of jmp_buf:
 | 
					    the definition of jmp_buf:
 | 
				
			||||||
| 
						 | 
					@ -63,6 +62,8 @@ void func0(int* pv0, int* pv1)
 | 
				
			||||||
        printf("env[%d]=%#x, ", i, (int)env_func1[0].__jmpbuf[i]);
 | 
					        printf("env[%d]=%#x, ", i, (int)env_func1[0].__jmpbuf[i]);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    printf("\n");
 | 
					    printf("\n");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    func1();
 | 
				
			||||||
#else
 | 
					#else
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
        /usr/arm-linux-gnueabi/include/bits/setjmp.h
 | 
					        /usr/arm-linux-gnueabi/include/bits/setjmp.h
 | 
				
			||||||
| 
						 | 
					@ -84,6 +85,24 @@ void func0(int* pv0, int* pv1)
 | 
				
			||||||
            10-26: d8-d15 17words
 | 
					            10-26: d8-d15 17words
 | 
				
			||||||
            27: fpscr
 | 
					            27: fpscr
 | 
				
			||||||
    */
 | 
					    */
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					    For example, on raspberry-pi, armv6 cpu:
 | 
				
			||||||
 | 
					        (gdb) x /64 env_func1[0].__jmpbuf
 | 
				
			||||||
 | 
					            v1, 0:  0x00	0x00	0x00	0x00	
 | 
				
			||||||
 | 
					            v2, 1:  0x00	0x00	0x00	0x00
 | 
				
			||||||
 | 
					            v3, 2:  0x2c	0x84	0x00	0x00	
 | 
				
			||||||
 | 
					            v4, 3:  0x00	0x00	0x00	0x00
 | 
				
			||||||
 | 
					            v5, 4:  0x00	0x00	0x00	0x00	
 | 
				
			||||||
 | 
					            v6, 5:  0x00	0x00	0x00	0x00
 | 
				
			||||||
 | 
					            sl, 6:  0x00	0xf0	0xff	0xb6	
 | 
				
			||||||
 | 
					            fp, 7:  0x9c	0xfb	0xff	0xbe
 | 
				
			||||||
 | 
					            sp, 8:  0x88	0xfb	0xff	0xbe	
 | 
				
			||||||
 | 
					            pc, 9:  0x08	0x85	0x00	0x00
 | 
				
			||||||
 | 
					        (gdb) p /x $sp
 | 
				
			||||||
 | 
					        $5 = 0xbefffb88
 | 
				
			||||||
 | 
					        (gdb) p /x $pc
 | 
				
			||||||
 | 
					        $4 = 0x850c
 | 
				
			||||||
 | 
					    */
 | 
				
			||||||
    int ret = setjmp(env_func1);
 | 
					    int ret = setjmp(env_func1);
 | 
				
			||||||
    printf("setjmp func1 ret=%d\n", ret);
 | 
					    printf("setjmp func1 ret=%d\n", ret);
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
| 
						 | 
					@ -105,10 +124,7 @@ int main(int argc, char** argv) {
 | 
				
			||||||
        (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int));
 | 
					        (int)sizeof(long int), (int)sizeof(long), (int)sizeof(int));
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    int pv0 = 0xf0;
 | 
					    func0();
 | 
				
			||||||
    int pv1 = 0xf1;
 | 
					 | 
				
			||||||
    func0(&pv0, &pv1);
 | 
					 | 
				
			||||||
    func1();
 | 
					 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    printf("terminated\n");
 | 
					    printf("terminated\n");
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -6,7 +6,7 @@ else
 | 
				
			||||||
    ST_ALL      = objs/srs_flv_parser \
 | 
					    ST_ALL      = objs/srs_flv_parser \
 | 
				
			||||||
                objs/srs_flv_injecter objs/srs_publish objs/srs_play \
 | 
					                objs/srs_flv_injecter objs/srs_publish objs/srs_play \
 | 
				
			||||||
                objs/srs_ingest_flv objs/srs_ingest_rtmp objs/srs_detect_rtmp \
 | 
					                objs/srs_ingest_flv objs/srs_ingest_rtmp objs/srs_detect_rtmp \
 | 
				
			||||||
                objs/srs_bandwidth_check
 | 
					                objs/srs_bandwidth_check objs/srs_h264_raw_publish
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
.PHONY: default clean help ssl nossl
 | 
					.PHONY: default clean help ssl nossl
 | 
				
			||||||
| 
						 | 
					@ -23,6 +23,7 @@ help:
 | 
				
			||||||
	@echo "     srs_flv_parser          parse flv file, print detail info."
 | 
						@echo "     srs_flv_parser          parse flv file, print detail info."
 | 
				
			||||||
	@echo "     srs_flv_injecter        inject keyframes information to metadata."
 | 
						@echo "     srs_flv_injecter        inject keyframes information to metadata."
 | 
				
			||||||
	@echo "     srs_publish             publish program using srs-librtmp"
 | 
						@echo "     srs_publish             publish program using srs-librtmp"
 | 
				
			||||||
 | 
						@echo "     srs_h264_raw_publish    publish raw h.264 stream to SSR by srs-librtmp"
 | 
				
			||||||
	@echo "     srs_play                play program using srs-librtmp"
 | 
						@echo "     srs_play                play program using srs-librtmp"
 | 
				
			||||||
	@echo "     srs_ingest_flv          ingest flv file and publish to RTMP server."
 | 
						@echo "     srs_ingest_flv          ingest flv file and publish to RTMP server."
 | 
				
			||||||
	@echo "     srs_ingest_rtmp         ingest RTMP and publish to RTMP server."
 | 
						@echo "     srs_ingest_rtmp         ingest RTMP and publish to RTMP server."
 | 
				
			||||||
| 
						 | 
					@ -81,6 +82,9 @@ objs/srs_flv_injecter: srs_flv_injecter.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I)
 | 
				
			||||||
objs/srs_publish: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
 | 
					objs/srs_publish: srs_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
 | 
				
			||||||
	$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o objs/srs_publish
 | 
						$(GCC) srs_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o objs/srs_publish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					objs/srs_h264_raw_publish: srs_h264_raw_publish.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
 | 
				
			||||||
 | 
						$(GCC) srs_h264_raw_publish.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o objs/srs_h264_raw_publish
 | 
				
			||||||
 | 
					
 | 
				
			||||||
objs/srs_play: srs_play.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
 | 
					objs/srs_play: srs_play.c $(SRS_RESEARCH_DEPS) $(SRS_LIBRTMP_I) $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L)
 | 
				
			||||||
	$(GCC) srs_play.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o objs/srs_play
 | 
						$(GCC) srs_play.c $(SRS_LIBRTMP_L) $(SRS_LIBSSL_L) $(EXTRA_CXX_FLAG) -o objs/srs_play
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										86
									
								
								trunk/research/librtmp/srs_h264_raw_publish.c
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										86
									
								
								trunk/research/librtmp/srs_h264_raw_publish.c
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,86 @@
 | 
				
			||||||
 | 
					/*
 | 
				
			||||||
 | 
					The MIT License (MIT)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Copyright (c) 2013-2014 winlin
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Permission is hereby granted, free of charge, to any person obtaining a copy of
 | 
				
			||||||
 | 
					this software and associated documentation files (the "Software"), to deal in
 | 
				
			||||||
 | 
					the Software without restriction, including without limitation the rights to
 | 
				
			||||||
 | 
					use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
 | 
				
			||||||
 | 
					the Software, and to permit persons to whom the Software is furnished to do so,
 | 
				
			||||||
 | 
					subject to the following conditions:
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					The above copyright notice and this permission notice shall be included in all
 | 
				
			||||||
 | 
					copies or substantial portions of the Software.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 | 
				
			||||||
 | 
					IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
 | 
				
			||||||
 | 
					FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
 | 
				
			||||||
 | 
					COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
 | 
				
			||||||
 | 
					IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 | 
				
			||||||
 | 
					CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					/**
 | 
				
			||||||
 | 
					gcc srs_h264_raw_publish.c ../../objs/lib/srs_librtmp.a -g -O0 -lstdc++ -o srs_h264_raw_publish
 | 
				
			||||||
 | 
					*/
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <stdio.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "../../objs/include/srs_librtmp.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#define srs_trace(msg, ...) printf(msg, ##__VA_ARGS__);printf("\n")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int main(int argc, char** argv)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    srs_rtmp_t rtmp;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // packet data
 | 
				
			||||||
 | 
					    int type, size;
 | 
				
			||||||
 | 
					    u_int32_t timestamp = 0;
 | 
				
			||||||
 | 
					    char* data;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    srs_trace("publish raw h.264 as rtmp stream to server like FMLE/FFMPEG/Encoder");
 | 
				
			||||||
 | 
					    srs_trace("srs(simple-rtmp-server) client librtmp library.");
 | 
				
			||||||
 | 
					    srs_trace("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/livestream");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (srs_simple_handshake(rtmp) != 0) {
 | 
				
			||||||
 | 
					        srs_trace("simple handshake failed.");
 | 
				
			||||||
 | 
					        goto rtmp_destroy;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    srs_trace("simple handshake success");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (srs_connect_app(rtmp) != 0) {
 | 
				
			||||||
 | 
					        srs_trace("connect vhost/app failed.");
 | 
				
			||||||
 | 
					        goto rtmp_destroy;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    srs_trace("connect vhost/app success");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    if (srs_publish_stream(rtmp) != 0) {
 | 
				
			||||||
 | 
					        srs_trace("publish stream failed.");
 | 
				
			||||||
 | 
					        goto rtmp_destroy;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    srs_trace("publish stream success");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    for (;;) {
 | 
				
			||||||
 | 
					        type = SRS_RTMP_TYPE_VIDEO;
 | 
				
			||||||
 | 
					        timestamp += 40;
 | 
				
			||||||
 | 
					        size = 4096;
 | 
				
			||||||
 | 
					        data = (char*)malloc(4096);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        if (srs_write_packet(rtmp, type, timestamp, data, size) != 0) {
 | 
				
			||||||
 | 
					            goto rtmp_destroy;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        srs_trace("sent packet: type=%s, time=%d, size=%d", srs_type2string(type), timestamp, size);
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        usleep(40 * 1000);
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					rtmp_destroy:
 | 
				
			||||||
 | 
					    srs_rtmp_destroy(rtmp);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -132,6 +132,7 @@ file
 | 
				
			||||||
	..\..\research\librtmp\srs_detect_rtmp.c,
 | 
						..\..\research\librtmp\srs_detect_rtmp.c,
 | 
				
			||||||
	..\..\research\librtmp\srs_flv_injecter.c,
 | 
						..\..\research\librtmp\srs_flv_injecter.c,
 | 
				
			||||||
	..\..\research\librtmp\srs_flv_parser.c,
 | 
						..\..\research\librtmp\srs_flv_parser.c,
 | 
				
			||||||
 | 
						..\..\research\librtmp\srs_h264_raw_publish.c,
 | 
				
			||||||
	..\..\research\librtmp\srs_ingest_flv.c,
 | 
						..\..\research\librtmp\srs_ingest_flv.c,
 | 
				
			||||||
	..\..\research\librtmp\srs_ingest_rtmp.c,
 | 
						..\..\research\librtmp\srs_ingest_rtmp.c,
 | 
				
			||||||
	..\..\research\librtmp\srs_play.c,
 | 
						..\..\research\librtmp\srs_play.c,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue