mirror of https://github.com/q191201771/lal.git
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.
87 lines
2.2 KiB
Go
87 lines
2.2 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 mpegts
|
|
|
|
import (
|
|
"github.com/q191201771/naza/pkg/nazabits"
|
|
)
|
|
|
|
// Pes -----------------------------------------------------------
|
|
// <iso13818-1.pdf>
|
|
// <2.4.3.6 PES packet> <page 49/174>
|
|
// <Table E.1 - PES packet header example> <page 142/174>
|
|
// <F.0.2 PES packet> <page 144/174>
|
|
// packet_start_code_prefix [24b] *** always 0x00, 0x00, 0x01
|
|
// stream_id [8b] *
|
|
// PES_packet_length [16b] **
|
|
// '10' [2b]
|
|
// PES_scrambling_control [2b]
|
|
// PES_priority [1b]
|
|
// data_alignment_indicator [1b]
|
|
// copyright [1b]
|
|
// original_or_copy [1b] *
|
|
// PTS_DTS_flags [2b]
|
|
// ESCR_flag [1b]
|
|
// ES_rate_flag [1b]
|
|
// DSM_trick_mode_flag [1b]
|
|
// additional_copy_info_flag [1b]
|
|
// PES_CRC_flag [1b]
|
|
// PES_extension_flag [1b] *
|
|
// PES_header_data_length [8b] *
|
|
// -----------------------------------------------------------
|
|
type Pes struct {
|
|
pscp uint32
|
|
sid uint8
|
|
ppl uint16
|
|
pad1 uint8
|
|
ptsDtsFlag uint8
|
|
pad2 uint8
|
|
phdl uint8
|
|
pts uint64
|
|
dts uint64
|
|
}
|
|
|
|
func ParsePes(b []byte) (pes Pes, length int) {
|
|
br := nazabits.NewBitReader(b)
|
|
pes.pscp, _ = br.ReadBits32(24)
|
|
pes.sid, _ = br.ReadBits8(8)
|
|
pes.ppl, _ = br.ReadBits16(16)
|
|
|
|
pes.pad1, _ = br.ReadBits8(8)
|
|
pes.ptsDtsFlag, _ = br.ReadBits8(2)
|
|
pes.pad2, _ = br.ReadBits8(6)
|
|
pes.phdl, _ = br.ReadBits8(8)
|
|
|
|
_, _ = br.ReadBytes(uint(pes.phdl))
|
|
length = 9 + int(pes.phdl)
|
|
|
|
// 处理得不是特别标准
|
|
if pes.ptsDtsFlag&0x2 != 0 {
|
|
_, pes.pts = readPts(b[9:])
|
|
}
|
|
if pes.ptsDtsFlag&0x1 != 0 {
|
|
_, pes.dts = readPts(b[14:])
|
|
} else {
|
|
pes.dts = pes.pts
|
|
}
|
|
//pes.pts = (pes.pts - delay) / 90
|
|
//pes.dts = (pes.dts - delay) / 90
|
|
|
|
return
|
|
}
|
|
|
|
// read pts or dts
|
|
func readPts(b []byte) (fb uint8, pts uint64) {
|
|
fb = b[0] >> 4
|
|
pts |= uint64((b[0]>>1)&0x07) << 30
|
|
pts |= (uint64(b[1])<<8 | uint64(b[2])) >> 1 << 15
|
|
pts |= (uint64(b[3])<<8 | uint64(b[4])) >> 1
|
|
return
|
|
}
|