You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lal/pkg/rtprtcp/rtp_unpacker.go

74 lines
2.7 KiB
Go

// Copyright 2020, Chef. All rights reserved.
// https://github.com/q191201771/lal
//
// Use of this source code is governed by a MIT-style license
// that can be found in the License file.
//
// Author: Chef (191201771@qq.com)
package rtprtcp
import (
"github.com/q191201771/lal/pkg/base"
"github.com/q191201771/naza/pkg/nazalog"
)
// 传入RTP包合成帧数据并回调返回
// 一路音频或一路视频各对应一个对象
var (
_ IRTPUnpacker = &RTPUnpackContainer{}
_ IRTPUnpackContainer = &RTPUnpackContainer{}
_ IRTPUnpackerProtocol = &RTPUnpackerAAC{}
_ IRTPUnpackerProtocol = &RTPUnpackerAVCHEVC{}
)
type IRTPUnpacker interface {
IRTPUnpackContainer
}
type IRTPUnpackContainer interface {
Feed(pkt RTPPacket)
}
type IRTPUnpackerProtocol interface {
// 计算rtp包处于帧中的位置
CalcPositionIfNeeded(pkt *RTPPacket)
// 尝试合成一个完整帧
//
// 从当前队列的第一个包开始合成
// 如果一个rtp包对应一个完整帧则合成一帧
// 如果一个rtp包对应多个完整帧则合成多帧
// 如果多个rtp包对应一个完整帧则尝试合成一帧
//
// @return unpackedFlag 本次调用是否成功合成
// @return unpackedSeq 如果成功合成合成使用的最后一个seq号如果失败则为0
TryUnpackOne(list *RTPPacketList) (unpackedFlag bool, unpackedSeq uint16)
}
// @param pkt: pkt.Timestamp RTP包头中的时间戳(pts)经过clockrate换算后的时间戳单位毫秒
// 注意不支持带B帧的视频流pts和dts永远相同
// pkt.PayloadType base.AVPacketPTXXX
// pkt.Payload 如果是AAC返回的是raw frame一个AVPacket只包含一帧
// 如果是AVC或HEVC是AVCC格式每个NAL前包含4字节NAL的长度
// AAC引用的是接收到的RTP包中的内存块
// AVC或者HEVC是新申请的内存块回调结束后内部不再使用该内存块
type OnAVPacket func(pkt base.AVPacket)
// 目前支持AVCHEVC和AAC MPEG4-GENERIC/44100/2业务方也可以自己实现IRTPUnpackerProtocol甚至是IRTPUnpackContainer
func DefaultRTPUnpackerFactory(payloadType base.AVPacketPT, clockRate int, maxSize int, onAVPacket OnAVPacket) IRTPUnpacker {
var protocol IRTPUnpackerProtocol
switch payloadType {
case base.AVPacketPTAAC:
protocol = NewRTPUnpackerAAC(payloadType, clockRate, onAVPacket)
case base.AVPacketPTAVC:
fallthrough
case base.AVPacketPTHEVC:
protocol = NewRTPUnpackerAVCHEVC(payloadType, clockRate, onAVPacket)
default:
nazalog.Fatalf("payload type not support yet. payloadType=%d", payloadType)
}
return NewRTPUnpackContainer(maxSize, protocol)
}