MCPcopy Create free account
hub / github.com/Monibuca/engine / WritePESPacket

Method WritePESPacket

memory-ts.go:31–144  ·  view source on GitHub ↗
(frame *mpegts.MpegtsPESFrame, packet mpegts.MpegTsPESPacket)

Source from the content-addressed store, hash-verified

29}
30
31func (ts *MemoryTs) WritePESPacket(frame *mpegts.MpegtsPESFrame, packet mpegts.MpegTsPESPacket) (err error) {
32 if packet.Header.PacketStartCodePrefix != 0x000001 {
33 err = errors.New("packetStartCodePrefix != 0x000001")
34 return
35 }
36 pesHeadItem := ts.Get(32)
37 pesHeadItem.Value.Reset()
38 _, err = mpegts.WritePESHeader(&pesHeadItem.Value, packet.Header)
39 if err != nil {
40 return
41 }
42 pesBuffers := append(net.Buffers{pesHeadItem.Value}, packet.Buffers...)
43 defer pesHeadItem.Recycle()
44 pesPktLength := util.SizeOfBuffers(pesBuffers)
45 buffer := ts.Get((pesPktLength/mpegts.TS_PACKET_SIZE+1)*6 + pesPktLength)
46 bwTsHeader := &buffer.Value
47 bigLen := bwTsHeader.Len()
48 bwTsHeader.Reset()
49 ts.BLL.Push(buffer)
50 var tsHeaderLength int
51 for i := 0; len(pesBuffers) > 0; i++ {
52 if bigLen < mpegts.TS_PACKET_SIZE {
53 if i == 0 {
54 ts.Recycle()
55 }
56 headerItem := ts.Get(mpegts.TS_PACKET_SIZE)
57 ts.BLL.Push(headerItem)
58 bwTsHeader = &headerItem.Value
59 bwTsHeader.Reset()
60 }
61 bigLen -= mpegts.TS_PACKET_SIZE
62 pesPktLength = util.SizeOfBuffers(pesBuffers)
63 tsHeader := mpegts.MpegTsHeader{
64 SyncByte: 0x47,
65 TransportErrorIndicator: 0,
66 PayloadUnitStartIndicator: 0,
67 TransportPriority: 0,
68 Pid: frame.Pid,
69 TransportScramblingControl: 0,
70 AdaptionFieldControl: 1,
71 ContinuityCounter: frame.ContinuityCounter,
72 }
73
74 frame.ContinuityCounter++
75 frame.ContinuityCounter = frame.ContinuityCounter % 16
76
77 // 每一帧的开头,当含有pcr的时候,包含调整字段
78 if i == 0 {
79 tsHeader.PayloadUnitStartIndicator = 1
80
81 // 当PCRFlag为1的时候,包含调整字段
82 if frame.IsKeyFrame {
83 tsHeader.AdaptionFieldControl = 0x03
84 tsHeader.AdaptationFieldLength = 7
85 tsHeader.PCRFlag = 1
86 tsHeader.RandomAccessIndicator = 1
87 tsHeader.ProgramClockReferenceBase = frame.ProgramClockReferenceBase
88 }

Callers 2

WriteAudioFrameMethod · 0.95
WriteVideoFrameMethod · 0.95

Calls 10

WritePESHeaderFunction · 0.92
SizeOfBuffersFunction · 0.92
WriteTsHeaderFunction · 0.92
NewMethod · 0.80
ResetMethod · 0.65
RecycleMethod · 0.65
LenMethod · 0.65
PushMethod · 0.65
WriteMethod · 0.65
GetMethod · 0.45

Tested by

no test coverage detected