github.com/cnotch/ipchub@v1.1.0/service/rtsp/io.go (about)

     1  // Copyright (c) 2019,CAOHONGJU All rights reserved.
     2  // Use of this source code is governed by a MIT-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package rtsp
     6  
     7  import (
     8  	"bufio"
     9  	"strings"
    10  
    11  	"github.com/cnotch/xlog"
    12  )
    13  
    14  // 接收处理器接口
    15  type receiveHandler interface {
    16  	onRequest(req *Request) error
    17  	onResponse(resp *Response) error
    18  	onPack(pack *RTPPack) error
    19  }
    20  
    21  // 统一消息接受函数
    22  func receive(logger *xlog.Logger, r *bufio.Reader,
    23  	channels []int, handler receiveHandler) error {
    24  
    25  	// 预取4个字节
    26  	sl, err := r.Peek(4)
    27  	if err != nil {
    28  		return err
    29  	}
    30  
    31  	// 如果是 RTP 流
    32  	if sl[0] == rtpPackPrefix {
    33  		pack, err := ReadPacket(r, channels)
    34  		if err != nil {
    35  			if pack != nil { // 通道不匹配
    36  				logger.Warn(err.Error())
    37  				return nil
    38  			}
    39  			logger.Errorf("decode rtp pack failed; %v.", err)
    40  			return err
    41  		}
    42  		return handler.onPack(pack)
    43  	}
    44  
    45  	i := 0
    46  	for ; i < 4; i++ {
    47  		if sl[i] != rtspProto[i] {
    48  			break
    49  		}
    50  	}
    51  
    52  	if i == 4 { // 比较完成并且相等,是Response
    53  		resp, err := ReadResponse(r)
    54  		if err != nil {
    55  			logger.Errorf("decode response failed; %v.", err)
    56  			return err
    57  		}
    58  
    59  		if logger.LevelEnabled(xlog.DebugLevel) {
    60  			logger.Debugf("<<<===\r\n%s", strings.TrimSpace(resp.String()))
    61  		}
    62  		return handler.onResponse(resp)
    63  	}
    64  
    65  	// 是请求
    66  	req, err := ReadRequest(r)
    67  	if err != nil {
    68  		logger.Errorf("decode request failed; %v.", err)
    69  		return err
    70  	}
    71  
    72  	if logger.LevelEnabled(xlog.DebugLevel) {
    73  		logger.Debugf("<<<===\r\n%s", strings.TrimSpace(req.String()))
    74  	}
    75  	return handler.onRequest(req)
    76  }