mirror of
				https://github.com/ossrs/srs.git
				synced 2025-03-09 15:49:59 +00:00 
			
		
		
		
	1. Add live benchmark support in srs-bench, which only connects and disconnects without any media transport, to test source creation and disposal and verify source memory leaks. 2. SmartPtr: Support cleanup of HTTP-FLV stream. Unregister the HTTP-FLV handler for the pattern and clean up the objects and resources. 3. Support benchmarking RTMP/SRT with srs-bench by integrating the gosrt and oryx RTMP libraries. 4. Refine SRT and RTC sources by using a timer to clean up the sources, following the same strategy as the Live source. --------- Co-authored-by: Haibo Chen <495810242@qq.com> Co-authored-by: Jacob Su <suzp1984@gmail.com>
		
			
				
	
	
		
			55 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.1 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package srtgo
 | |
| 
 | |
| /*
 | |
| #cgo LDFLAGS: -lsrt
 | |
| #include <srt/srt.h>
 | |
| 
 | |
| int srt_sendmsg2_wrapped(SRTSOCKET u, const char* buf, int len, SRT_MSGCTRL *mctrl, int *srterror, int *syserror)
 | |
| {
 | |
| 	int ret = srt_sendmsg2(u, buf, len, mctrl);
 | |
| 	if (ret < 0) {
 | |
| 		*srterror = srt_getlasterror(syserror);
 | |
| 	}
 | |
| 	return ret;
 | |
| }
 | |
| 
 | |
| */
 | |
| import "C"
 | |
| import (
 | |
| 	"errors"
 | |
| 	"syscall"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| func srtSendMsg2Impl(u C.SRTSOCKET, buf []byte, msgctrl *C.SRT_MSGCTRL) (n int, err error) {
 | |
| 	srterr := C.int(0)
 | |
| 	syserr := C.int(0)
 | |
| 	n = int(C.srt_sendmsg2_wrapped(u, (*C.char)(unsafe.Pointer(&buf[0])), C.int(len(buf)), msgctrl, &srterr, &syserr))
 | |
| 	if n < 0 {
 | |
| 		srterror := SRTErrno(srterr)
 | |
| 		if syserr < 0 {
 | |
| 			srterror.wrapSysErr(syscall.Errno(syserr))
 | |
| 		}
 | |
| 		err = srterror
 | |
| 		n = 0
 | |
| 	}
 | |
| 	return
 | |
| }
 | |
| 
 | |
| // Write data to the SRT socket
 | |
| func (s SrtSocket) Write(b []byte) (n int, err error) {
 | |
| 
 | |
| 	//Fastpath:
 | |
| 	if !s.blocking {
 | |
| 		s.pd.reset(ModeWrite)
 | |
| 	}
 | |
| 	n, err = srtSendMsg2Impl(s.socket, b, nil)
 | |
| 
 | |
| 	for {
 | |
| 		if !errors.Is(err, error(EAsyncSND)) || s.blocking {
 | |
| 			return
 | |
| 		}
 | |
| 		s.pd.wait(ModeWrite)
 | |
| 		n, err = srtSendMsg2Impl(s.socket, b, nil)
 | |
| 	}
 | |
| }
 |