// 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" // AAC格式的流,尝试合成一个完整的帧 func (r *RTPUnpacker) unpackOneAAC() bool { first := r.list.head.next if first == nil { return false } // TODO chef: // 2. 只处理了一个RTP包含多个音频包的情况,没有处理一个音频包跨越多个RTP包的情况(是否有这种情况) // rfc3640 2.11. Global Structure of Payload Format // // +---------+-----------+-----------+---------------+ // | RTP | AU Header | Auxiliary | Access Unit | // | Header | Section | Section | Data Section | // +---------+-----------+-----------+---------------+ // // <----------RTP Packet Payload-----------> // // rfc3640 3.2.1. The AU Header Section // // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ // |AU-headers-length|AU-header|AU-header| |AU-header|padding| // | | (1) | (2) | | (n) | bits | // +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+- .. -+-+-+-+-+-+-+-+-+-+ // // rfc3640 3.3.6. High Bit-rate AAC // b := first.packet.Raw[first.packet.Header.payloadOffset:] //nazalog.Debugf("%d, %d, %s", len(pkt.Raw), pkt.Header.timestamp, hex.Dump(b)) // AU Header Section var auHeaderLength uint32 auHeaderLength = uint32(b[0])<<8 + uint32(b[1]) auHeaderLength = (auHeaderLength + 7) / 8 //nazalog.Debugf("auHeaderLength=%d", auHeaderLength) // no Auxiliary Section pauh := uint32(2) // AU Header pos pau := uint32(2) + auHeaderLength // AU pos auNum := uint32(auHeaderLength) / 2 for i := uint32(0); i < auNum; i++ { var auSize uint32 auSize = uint32(b[pauh])<<8 | uint32(b[pauh+1]&0xF8) // 13bit auSize /= 8 //auIndex := b[pauh+1] & 0x7 // raw AAC frame // pau, auSize //nazalog.Debugf("%d %d %s", auSize, auIndex, hex.Dump(b[pau:pau+auSize])) var outPkt base.AVPacket outPkt.Timestamp = first.packet.Header.Timestamp / uint32(r.clockRate/1000) outPkt.Timestamp += i * uint32((1024*1000)/r.clockRate) outPkt.Payload = b[pau : pau+auSize] outPkt.PayloadType = r.payloadType r.onAVPacket(outPkt) pauh += 2 pau += auSize } r.unpackedFlag = true r.unpackedSeq = first.packet.Header.Seq r.list.head.next = first.next r.list.size-- return true }