(frame *mpegts.MpegtsPESFrame, packet mpegts.MpegTsPESPacket)
| 29 | } |
| 30 | |
| 31 | func (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 | } |
no test coverage detected