mirror of https://bitbucket.org/ausocean/av.git
making vlc seg faultttt!
This commit is contained in:
parent
7e3394fe0e
commit
69a7481671
|
@ -29,7 +29,7 @@ LICENSE
|
|||
package packets
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
_"fmt"
|
||||
"os"
|
||||
)
|
||||
|
||||
|
@ -59,28 +59,36 @@ func NewRtpToTsConverter() (c *rtpToTsConverter) {
|
|||
return
|
||||
}
|
||||
|
||||
func getOctectType(p *RtpPacket) byte {
|
||||
return p.Payload[0] & 0x1F
|
||||
}
|
||||
|
||||
func getStartBit(p *RtpPacket) byte {
|
||||
return (p.Payload[1] & 0x80)>>7
|
||||
}
|
||||
|
||||
func getEndBit(p *RtpPacket) byte {
|
||||
return (p.Payload[1] & 0x40)>>6
|
||||
}
|
||||
func (c* rtpToTsConverter) Convert() {
|
||||
file,_ := os.Create("video")
|
||||
pesPktChan := make(chan []byte, 10000)
|
||||
pesDataChan := make(chan byte, 15000)
|
||||
nalAccessChan := make(chan []byte, 100)
|
||||
data := make(chan byte,10000)
|
||||
payloadByteChan := make(chan byte, 15000)
|
||||
// Get nal units from incoming rtp
|
||||
pesPktChan := make(chan []byte, 10)
|
||||
pesDataChan := make(chan byte, 50000)
|
||||
nalAccessChan := make(chan []byte, 10)
|
||||
payloadByteChan := make(chan byte, 100000)
|
||||
// grab sps pps and sei
|
||||
var sps []byte
|
||||
var pps []byte
|
||||
var sei []byte
|
||||
|
||||
// Frist find sps
|
||||
for {
|
||||
rtpPacket := <-c.inputChan
|
||||
fragmentType := rtpPacket.Payload[0] & 0x1F
|
||||
if fragmentType == 7 {
|
||||
sps = make([]byte,4+len(rtpPacket.Payload))
|
||||
sps[0] = 0x00
|
||||
sps[1] = 0x00
|
||||
sps[2] = 0x00
|
||||
sps[3] = 0x01
|
||||
sps = make([]byte,len(rtpPacket.Payload))
|
||||
for i := range rtpPacket.Payload {
|
||||
sps[i+4] = rtpPacket.Payload[i]
|
||||
sps[i] = rtpPacket.Payload[i]
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -90,13 +98,21 @@ func (c* rtpToTsConverter) Convert() {
|
|||
rtpPacket := <-c.inputChan
|
||||
fragmentType := rtpPacket.Payload[0] & 0x1F
|
||||
if fragmentType == 8 {
|
||||
pps = make([]byte,4+len(rtpPacket.Payload))
|
||||
pps[0] = 0x00
|
||||
pps[1] = 0x00
|
||||
pps[2] = 0x00
|
||||
pps[3] = 0x01
|
||||
pps = make([]byte,len(rtpPacket.Payload))
|
||||
for i := range rtpPacket.Payload {
|
||||
pps[i+4] = rtpPacket.Payload[i]
|
||||
pps[i] = rtpPacket.Payload[i]
|
||||
}
|
||||
break
|
||||
}
|
||||
}
|
||||
// now find sei
|
||||
for {
|
||||
rtpPacket := <-c.inputChan
|
||||
fragmentType := rtpPacket.Payload[0] & 0x1F
|
||||
if fragmentType == 6 {
|
||||
sei = make([]byte,len(rtpPacket.Payload))
|
||||
for i := range rtpPacket.Payload {
|
||||
sei[i] = rtpPacket.Payload[i]
|
||||
}
|
||||
break
|
||||
}
|
||||
|
@ -105,50 +121,51 @@ func (c* rtpToTsConverter) Convert() {
|
|||
select {
|
||||
default:
|
||||
case rtpPacket := <-c.inputChan:
|
||||
threeNUBs := rtpPacket.Payload[0] & 0xE0
|
||||
fragmentType := rtpPacket.Payload[0] & 0x1F
|
||||
startBit := (rtpPacket.Payload[1] & 0x80)>>7
|
||||
fiveNUBs := rtpPacket.Payload[1] & 0x1F
|
||||
fragmentData := rtpPacket.Payload[2:]
|
||||
fmt.Printf("fragmentType: %v\n", fragmentType)
|
||||
if fragmentType == 28 {
|
||||
if startBit == 1 {
|
||||
if len(data) > 0 {
|
||||
dataArray := make([]byte, len(data))
|
||||
for ii:=0; len(data) > 0; ii++ {
|
||||
dataArray[ii] = <-data
|
||||
if getOctectType(&rtpPacket) == 28 {
|
||||
if getStartBit(&rtpPacket) == 1 {
|
||||
var buffer []byte
|
||||
// au delimiter
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, []byte{0x09,0x10}...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, sps...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, pps...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, sei...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, rtpPacket.Payload[0] & 0xE0 | rtpPacket.Payload[1] & 0x1F )
|
||||
buffer = append(buffer, rtpPacket.Payload[2:]...)
|
||||
for {
|
||||
rtpPacket := <-c.inputChan
|
||||
if getOctectType(&rtpPacket) != 28 || getStartBit(&rtpPacket) == 1 {
|
||||
nalAccessChan<-buffer
|
||||
file.Write(buffer)
|
||||
break
|
||||
}
|
||||
fmt.Printf("data array size: %v\n", len(dataArray))
|
||||
nalAccessChan<-dataArray
|
||||
file.Write(dataArray)
|
||||
buffer = append(buffer, rtpPacket.Payload[2:]...)
|
||||
if getEndBit(&rtpPacket) == 1 {
|
||||
nalAccessChan<-buffer
|
||||
file.Write(buffer)
|
||||
break
|
||||
}
|
||||
// load sps into data
|
||||
for ii := range sps {
|
||||
data<-sps[ii]
|
||||
}
|
||||
// load pps into data
|
||||
for ii := range pps {
|
||||
data<-pps[ii]
|
||||
}
|
||||
buffer := make([]byte,5+len(fragmentData))
|
||||
buffer[0] = 0x00
|
||||
buffer[1] = 0x00
|
||||
buffer[2] = 0x00
|
||||
buffer[3] = 0x01
|
||||
buffer[4] = threeNUBs | fiveNUBs
|
||||
for i := range fragmentData {
|
||||
buffer[i+5] = fragmentData[i]
|
||||
}
|
||||
// load data into data chan
|
||||
for ii := range buffer {
|
||||
data<-buffer[ii]
|
||||
}
|
||||
} else {
|
||||
if len(data) > 0 {
|
||||
for ii := range fragmentData {
|
||||
data<-fragmentData[ii]
|
||||
}
|
||||
}
|
||||
if getOctectType(&rtpPacket) == 1 {
|
||||
var buffer []byte
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, []byte{0x09,0x10}...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, sps...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, pps...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, sei...)
|
||||
buffer = append(buffer, []byte{0x00,0x00,0x01}...)
|
||||
buffer = append(buffer, rtpPacket.Payload...)
|
||||
nalAccessChan<-buffer
|
||||
file.Write(buffer)
|
||||
}
|
||||
}
|
||||
case nalUnit := <-nalAccessChan:
|
||||
|
|
Loading…
Reference in New Issue