@@ -31,6 +31,7 @@ class MpegTsPacketizer(private val psiManager: PsiManager) {
3131
3232 companion object {
3333 const val packetSize = 188
34+ const val headerSize = 4
3435 }
3536
3637 private var pesContinuity = 0
@@ -72,23 +73,28 @@ class MpegTsPacketizer(private val psiManager: PsiManager) {
7273 packets.add(buffer.toByteArray())
7374 }
7475 is Pes -> {
75- var adaptationFieldControl = AdaptationFieldControl . ADAPTATION_PAYLOAD
76- writeHeader(buffer, true , mpegTsPayload.pid, adaptationFieldControl, pesContinuity)
76+ val data = mpegTsPayload.bufferData
77+
7778 val isAudio = psiManager.getAudioPid().toInt() == mpegTsPayload.pid
7879 val pcr = if (isAudio && ! mpegTsPayload.isKeyFrame) null else TimeUtils .getCurrentTimeMicro()
7980 val adaptationField = AdaptationField (
8081 discontinuityIndicator = false ,
8182 randomAccessIndicator = mpegTsPayload.isKeyFrame, // only video can be true
8283 pcr = pcr
8384 )
84- buffer.put(adaptationField.getData())
85+ val adaptationData = adaptationField.getData()
86+ val isSmall = data.remaining() < buffer.remaining() - headerSize - adaptationData.size - mpegTsPayload.headerLength
87+ var adaptationFieldControl = if (isSmall) AdaptationFieldControl .PAYLOAD else AdaptationFieldControl .ADAPTATION_PAYLOAD
88+ writeHeader(buffer, true , mpegTsPayload.pid, adaptationFieldControl, pesContinuity)
89+ buffer.put(adaptationData)
8590 mpegTsPayload.writeHeader(buffer)
8691
87- val data = mpegTsPayload.bufferData
88- if (data.remaining() < buffer.remaining()) { // small packet
92+ if (isSmall) {
8993 buffer.put(data)
9094 val stuffingSize = buffer.remaining()
91- writeStuffingBytes(buffer, stuffingSize, false )
95+ writeStuffingBytes(buffer, stuffingSize, true )
96+ packets.add(buffer.toByteArray())
97+ pesContinuity = (pesContinuity + 1 ) and 0xF
9298 return @forEachIndexed
9399 }
94100 while (data.hasRemaining()) {
0 commit comments