(r io.Reader)
| 107 | } |
| 108 | |
| 109 | func ReadPESHeader(r io.Reader) (header MpegTsPESHeader, err error) { |
| 110 | var flags uint8 |
| 111 | var length uint |
| 112 | |
| 113 | // packetStartCodePrefix(24) (0x000001) |
| 114 | header.PacketStartCodePrefix, err = util.ReadByteToUint24(r, true) |
| 115 | if err != nil { |
| 116 | return |
| 117 | } |
| 118 | |
| 119 | if header.PacketStartCodePrefix != 0x0000001 { |
| 120 | err = errors.New("read PacketStartCodePrefix is not 0x0000001") |
| 121 | return |
| 122 | } |
| 123 | |
| 124 | // streamID(8) |
| 125 | header.StreamID, err = util.ReadByteToUint8(r) |
| 126 | if err != nil { |
| 127 | return |
| 128 | } |
| 129 | |
| 130 | // pes_PacketLength(16) |
| 131 | header.PesPacketLength, err = util.ReadByteToUint16(r, true) |
| 132 | if err != nil { |
| 133 | return |
| 134 | } |
| 135 | |
| 136 | length = uint(header.PesPacketLength) |
| 137 | |
| 138 | // PES包长度可能为0,这个时候,需要自己去算 |
| 139 | // 0 <= len <= 65535 |
| 140 | // 如果当length为0,那么先设置为最大值,然后用LimitedReade去读,如果读到最后面剩下的字节数小于65536,才是正确的包大小. |
| 141 | // 一个包一般情况下不可能会读1<<31个字节. |
| 142 | if length == 0 { |
| 143 | length = 1 << 31 |
| 144 | } |
| 145 | |
| 146 | // lrPacket 和 lrHeader 位置指针是在同一位置的 |
| 147 | lrPacket := &io.LimitedReader{R: r, N: int64(length)} |
| 148 | lrHeader := lrPacket |
| 149 | |
| 150 | // constTen(2) |
| 151 | // pes_ScramblingControl(2) |
| 152 | // pes_Priority(1) |
| 153 | // dataAlignmentIndicator(1) |
| 154 | // copyright(1) |
| 155 | // originalOrCopy(1) |
| 156 | flags, err = util.ReadByteToUint8(lrHeader) |
| 157 | if err != nil { |
| 158 | return |
| 159 | } |
| 160 | |
| 161 | header.ConstTen = flags & 0xc0 |
| 162 | header.PesScramblingControl = flags & 0x30 |
| 163 | header.PesPriority = flags & 0x08 |
| 164 | header.DataAlignmentIndicator = flags & 0x04 |
| 165 | header.Copyright = flags & 0x02 |
| 166 | header.OriginalOrCopy = flags & 0x01 |
no test coverage detected