fix invalid TID=0 in writeAggregationUnit of rtph265 encoder (#782)

* fix invalid TID=0 in writeAggregationUnit of rtph265 encoder

* return error in case of invalid NALUs

---------

Co-authored-by: aler9 <46489434+aler9@users.noreply.github.com>
This commit is contained in:
Parallelc
2025-05-22 04:48:45 +08:00
committed by GitHub
parent bd07e2e04f
commit 2694ed941f
2 changed files with 25 additions and 9 deletions

View File

@@ -212,13 +212,25 @@ func (e *Encoder) lenAggregationUnit(nalus [][]byte, addNALU []byte) int {
func (e *Encoder) writeAggregationUnit(nalus [][]byte, marker bool) ([]*rtp.Packet, error) { func (e *Encoder) writeAggregationUnit(nalus [][]byte, marker bool) ([]*rtp.Packet, error) {
payload := make([]byte, e.lenAggregationUnit(nalus, nil)) payload := make([]byte, e.lenAggregationUnit(nalus, nil))
// header layerID := byte(0xFF)
h := uint16(48) << 9 temporalID := byte(0xFF)
payload[0] = byte(h >> 8)
payload[1] = byte(h)
pos := 2 pos := 2
for _, nalu := range nalus { for _, nalu := range nalus {
if len(nalu) < 2 {
return nil, fmt.Errorf("invalid NALU")
}
// select lowest layerID & temporalID
nalLayerID := ((nalu[0] & 0x01) << 5) | ((nalu[1] >> 3) & 0x1F)
nalTemporalID := nalu[1] & 0x07
if nalLayerID < layerID {
layerID = nalLayerID
}
if nalTemporalID < temporalID {
temporalID = nalTemporalID
}
// size // size
naluLen := len(nalu) naluLen := len(nalu)
payload[pos] = uint8(naluLen >> 8) payload[pos] = uint8(naluLen >> 8)
@@ -230,6 +242,10 @@ func (e *Encoder) writeAggregationUnit(nalus [][]byte, marker bool) ([]*rtp.Pack
pos += naluLen pos += naluLen
} }
// header
payload[0] = (48 << 1) | (layerID & 0x20)
payload[1] = ((layerID & 0x1F) << 3) | (temporalID & 0x07)
pkt := &rtp.Packet{ pkt := &rtp.Packet{
Header: rtp.Header{ Header: rtp.Header{
Version: rtpVersion, Version: rtpVersion,

View File

@@ -56,9 +56,9 @@ var cases = []struct {
{ {
"aggregated", "aggregated",
[][]byte{ [][]byte{
{0x07, 0x07}, {0x07, 0x57},
{0x08, 0x08}, {0x08, 0x66},
{0x09, 0x09}, {0x09, 0x75},
}, },
[]*rtp.Packet{ []*rtp.Packet{
{ {
@@ -70,8 +70,8 @@ var cases = []struct {
SSRC: 0x9dbb7812, SSRC: 0x9dbb7812,
}, },
Payload: []byte{ Payload: []byte{
0x60, 0x00, 0x00, 0x02, 0x07, 0x07, 0x00, 0x02, 0x60, 0x65, 0x00, 0x02, 0x07, 0x57, 0x00, 0x02,
0x08, 0x08, 0x00, 0x02, 0x09, 0x09, 0x08, 0x66, 0x00, 0x02, 0x09, 0x75,
}, },
}, },
}, },