Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- package main
- //import block====================================================================================================================================================================//
- import (
- "os"
- "net"
- "fmt"
- "golang.org/x/net/ipv4"
- "bytes"
- "bufio"
- "sync"
- "time"
- "strings"
- "encoding/binary"
- )
- //var declarations====================================================================================================================================================================//
- var (
- FilterPID = 0
- FilterFlag = false
- StreamLock = sync.RWMutex{}
- ProgramLock = sync.RWMutex{}
- Programs = make(map[uint16]uint16)
- Streams = make(map[uint16]uint16)
- RFILTER = ""
- )
- //Main function====================================================================================================================================================================//
- func main() {
- ArgLen := len(os.Args)
- var FPID = "0x0000"
- var ETH = "eth0"
- var SOURCE string
- var GROUP string
- var PORT string
- for i:= 0;i < ArgLen;i++ {
- val := os.Args[i]
- if strings.Contains(val, "-P") {
- FPID = os.Args[i+1]
- }
- if strings.Contains(val, "-I") {
- ETH = os.Args[i+1]
- }
- if strings.Contains(val, "-r") {
- RFILTER = os.Args[i+1]
- }
- if strings.Contains(val, "-s") {
- SOURCE = os.Args[i+1]
- }
- if strings.Contains(val, "-g") {
- GROUP = os.Args[i+1]
- }
- if strings.Contains(val, "-p") {
- PORT = os.Args[i+1]
- }
- if strings.Contains(val, "-h") {
- fmt.Println(`
- =====================
- *CLTSAnalyzer v0.9b *
- *Yashi Sharma @VIPER*
- *2017-03-27 *
- =====================
- Options:
- -P - Specify the PID to filter to. Defaults to 0(PAT)
- -I - Specify the interface to use. Defaults to 'eth0'
- -r - Specify a Regex filter to filter the output.
- -s - Specify Address to use as Source
- -g - Specify Address to use as Group
- -p - Specify Port
- -h - Display this help message
- WARNING: Using this on a high throughput PID(e. Video Streams) and outputting to the console can overrun the program. I recommend piping out to a file to reduce load.
- `)
- return
- }
- }
- //options block===================================================
- //Mainly for enabling debug output for now.===================================================
- //===================================================
- fmt.Sscanf(FPID, "0x%X", &FilterPID)
- en0, _:= net.InterfaceByName(ETH) // Get interface. This will be an option at some point
- fmt.Printf("Filter PID: 0x%X\n", FilterPID)
- fmt.Printf("Interface: %s\n", ETH)
- fmt.Printf("RegexFilter: %s\n", RFILTER)
- fmt.Printf("Source: %s\n", SOURCE)
- fmt.Printf("Group: %s\n", GROUP)
- fmt.Printf("Port: %s\n", PORT)
- c, _ := net.ListenPacket("udp4", "0.0.0.0:"+PORT) //Start up connection
- p := ipv4.NewPacketConn(c) //Actually connect to the SGP.
- if err := p.JoinSourceSpecificGroup(en0, &net.UDPAddr{IP: net.ParseIP(GROUP)}, &net.UDPAddr{IP: net.ParseIP(SOURCE)}); err != nil {
- fmt.Println(err)
- }
- for ;; { //loop until done.
- payload:= make([]byte, 5000) //Too big. Will get resized in 2 lines
- n, _, _ := c.ReadFrom(payload) // get real length of the payload
- payload = payload[:n] // Resize Payload and ultimately deallocate the unused reserved memory
- for ;len(payload)>0;payload= payload[188:] {
- go MTSDecode(payload[:188]) //start decoding the Payload, which is a misnomer, because it should be called "packet".
- }
- }
- if err := p.LeaveSourceSpecificGroup(en0, &net.UDPAddr{IP: net.ParseIP(GROUP)}, &net.UDPAddr{IP: net.ParseIP(SOURCE)}); err != nil { //Leave SGP join
- fmt.Println(err)
- }//*/
- fmt.Println("End") //Print "end" so people know you're done.
- }
- //Start Decode====================================================================================================================================================================//
- func MTSDecode(b []byte) { //gothread placeholder method
- packet := *bytes.NewBuffer(b) // Buffers make bytes easier to work with.
- responseStr := new(bytes.Buffer)
- responseWriter := bufio.NewWriter(responseStr)
- MpegTSHeaderAnalyze(packet, responseWriter) //start analysis
- responseWriter.Flush()
- fmt.Print(responseStr)
- }
- func getProgramMapping(PID uint16) uint16 {
- ProgramLock.RLock()
- defer ProgramLock.RUnlock()
- return Programs[PID]
- }
- func getStreamMapping(PID uint16) uint16 {
- StreamLock.RLock()
- defer StreamLock.RUnlock()
- return Streams[PID]
- }
- func setProgramMapping(PID uint16, value uint16) {
- ProgramLock.Lock()
- defer ProgramLock.Unlock()
- Programs[PID] = value
- }
- func setStreamMapping(PID uint16, value uint16) {
- StreamLock.Lock()
- defer StreamLock.Unlock()
- Streams[PID] = value
- }
- //Analyze TS Header====================================================================================================================================================================//
- func MpegTSHeaderAnalyze(packet bytes.Buffer, response *bufio.Writer) int {
- SYNC, _ := packet.ReadByte() //Sync Byte
- HeaderSecond, _ := packet.ReadByte() //Second part of the header
- HeaderThird, _ := packet.ReadByte()//third part of the header
- HeaderFourth, _ := packet.ReadByte() // Fourth part of the header
- TEI := HeaderSecond&0x80>>7 //Transport Error Indicator
- PUSI := HeaderSecond&0x40>>6 //Payload Unit Start Indicator
- TSPri := HeaderSecond&0x20>>5 //TS Private Data Indicator
- PID := binary.BigEndian.Uint16([]byte{HeaderSecond&0x1F, HeaderThird&0xFF}) //Program Identifier
- TSC := HeaderFourth&0xC0>>6 //Transport Scrambling Control
- AFC := HeaderFourth&0x30>>4 //Adaptation Field Control bit 1 = Adaptation Field Presence, Bit 2 = Payload Presence. b00 is reserved
- CC := HeaderFourth&0x0F //Continuity Counter
- //fmt.Fprintf(response, "%04X, %04X\n", PID, FilterPID)
- if PID == uint16(FilterPID) {
- FilterFlag = true
- }else {
- FilterFlag = false
- }
- StartTime := time.Now()
- if FilterFlag ==true { //Print if debug text enabled
- fmt.Fprintf(response, "\n###############################################################################################################################################################\n")
- fmt.Fprintf(response, "\n\tHeader: [Recieved Time: %s\t\tSync Byte: x%X\t\tTransport Error: b%X\t\tPayload Start: b%X\n\t\tTS Priority: b%X\t\tPID: x%X\t\tScrambling Control: d%d\t\tAdaptation Field Control: d%d\n\t\tContinuity Counter: d%d]\n", StartTime, SYNC, TEI, PUSI, TSPri, PID, TSC, AFC, CC)
- }
- if AFC == 0x02 || AFC == 0x03 { //b10 and b11
- MpegAdaptationFieldAnalyze(packet, response) //analyze Adaptation Field
- }
- if AFC == 0x01 || AFC == 0x03 { //b01 and b11
- if PID == 0x00 { //if PAT..
- MpegPATAnalyze(packet, response)//Analyze PSI. NEEDS TO BE REPLACED BY ANALYZE PAT HELPER++++++++++++++++++++++++++++++++++++++++++++++
- }
- if getProgramMapping(uint16(PID)) != 0x00 { //if PMT..
- MpegPMTAnalyze(packet, response)//Analyze PSI. NEEDS TO BE REPLACED BY ANALYZE PAT HELPER++++++++++++++++++++++++++++++++++++++++++++++
- }
- if getStreamMapping(uint16((PID))) == 0x86 { //if PMT..
- MpegSCTE35Analyze(packet, response )//Analyze PSI. NEEDS TO BE REPLACED BY ANALYZE PAT HELPER++++++++++++++++++++++++++++++++++++++++++++++
- }
- }
- EndTime := time.Now()
- DiffTime := EndTime.Sub(StartTime)
- if FilterFlag ==true { //Print if debug text enabled
- fmt.Fprintf(response, "\n\tDecode Time: %s\n", DiffTime)
- fmt.Fprintf(response, "###############################################################################################################################################################\n")
- }
- return 1 //return blah
- }
- //Adaptation Field Analyze====================================================================================================================================================================//
- func MpegAdaptationFieldAnalyze(packet bytes.Buffer, response *bufio.Writer) {
- AdaptationFieldLength, _ := packet.ReadByte() //Important! Determines the number of bytes following this one.
- if AdaptationFieldLength > 0 { //(Assuming the AFLen is longer than 0(Which does happen sometimes. RESEARCH THIS)
- HeaderSecond, _ := packet.ReadByte() //Second Byte. Provides the following:
- count := 1 //Byte count, starting after AFLen.
- DCI := HeaderSecond&0x80>>7 //Discontinuity indicator
- RAI := HeaderSecond&0x40>>6 //Random Access Indicator
- ESPri := HeaderSecond&0x20>>5 //Elementary Stream Private Data
- PCRFlag := HeaderSecond&0x10>>4 //PCR indicator
- OPCRFlag := HeaderSecond&0x08>>3 //Original PCR Indicator
- SpliceFlag := HeaderSecond&0x04>>2 //Splice Flag
- PrivFlag := HeaderSecond&0x02>>1 //Private Data Flag
- AExFlag := HeaderSecond&0x01 //Adaptation Extension Flag
- if PCRFlag == 1 { //If there is a PCR indicated..
- PCR := packet.Next(6)//PCR = 6 Bytes. 33/9 bits for the two different clocks
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\tPCR: x%X\n", PCR)//print if debug text
- }
- count += 6 //inc by 6 bytes
- }
- if OPCRFlag == 1 {// If there is an OPCR indicated..
- OPCR := packet.Next(6) //Same as PCR
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\tOPCR: x%X\n", OPCR)//Print if debug text
- }
- count += 6//inc by 6 bytes
- }
- AdFiNulls := packet.Next(int(AdaptationFieldLength)-count) //The remainder of the packet. Should equal xFF through and through. (Null stuffing section) (Its important for advancing the buffer.)
- if FilterFlag == true {
- fmt.Fprintf(response, "\tAdaptation: [Adaptation Field Length: x%X\t\tDiscontinuity: b%b\t\tRandom Access Indicator: b%b\t\tElementary Stream Priority: b%b\t\tPCR Flag: b%b\n\t\tOPCR Flag: b%b\t\tSplicing Flag: b%b\t\tPrivate Data Flag: b%b\t\tAdaptation Extension: b%b]\n",AdaptationFieldLength, DCI , RAI, ESPri, PCRFlag, OPCRFlag, SpliceFlag, PrivFlag, AExFlag)
- fmt.Fprintf(response, "\t\tAdaptation Field Extra Bytes: x%X\n", AdFiNulls) //print if debug text
- }
- }
- }
- //Analyze PSI====================================================================================================================================================================//
- func MpegPATAnalyze(packet bytes.Buffer, response *bufio.Writer ) {
- PointerField := packet.Next(1)
- for i:=0;i<int(PointerField[0]);i++ {
- packet.Next(1)
- }
- PATHeader := packet.Next(8)
- TableID := PATHeader[0]
- SectionSyntaxIndicator := PATHeader[1]&0x80>>7
- Zero := PATHeader[1]&0x40>>6
- Reserved := PATHeader[1]&0x30>>4
- SectionLength := binary.BigEndian.Uint16([]byte{PATHeader[1]&0x0F, PATHeader[2]})
- TSID := binary.BigEndian.Uint16([]byte{PATHeader[3], PATHeader[4]})
- Reserved2 := PATHeader[5]&0xC0>>6
- VersionNumber := PATHeader[5]&0x3E>>1
- CurrentNextIndicator := PATHeader[5]&0x01
- SectionNumber := PATHeader[6]
- LastSectionNumber := PATHeader[7]
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\tPAT: [Table ID: x%X\t\t Section Syntax Indicator: b%b\t\tZero: x%X\t\tReserved: b%b\n\t\t\t\tSection Length: d%d Bits\t\tTSID: x%X\t\tReserved2: b%b\t\tVersion Number: x%X\n\t\t\t\tCurrent Next Indicator: x%X\t\tSection Number: x%X\t\tLast Section Number: x%X]\n", TableID, SectionSyntaxIndicator, Zero, Reserved, SectionLength, TSID, Reserved2, VersionNumber, CurrentNextIndicator, SectionNumber, LastSectionNumber)
- }
- for count:=5;count<(int(SectionLength)-5);count += 4 {
- table := packet.Next(4)
- ProgramNumber := binary.BigEndian.Uint16([]byte{table[0], table[1]})
- ReservedMapped := table[2]&0xE0>>5
- MappedPID := binary.BigEndian.Uint16([]byte{table[2]&0x1F, table[3]})
- if getProgramMapping(MappedPID) == 0x00 { //if PMT..
- setProgramMapping(MappedPID, ProgramNumber)
- }
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\tDescriptor: [Program Number: x%X\t\tReserved: b%b\t\tPMT PID: x%X]\n", ProgramNumber, ReservedMapped, MappedPID)
- }
- }
- CRC32 := packet.Next(int(SectionLength)-count)
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\tCRC32: x%X\n", CRC32)
- }//*/
- }
- //Analyze PMT====================================================================================================================================================================//
- func MpegPMTAnalyze(packet bytes.Buffer, response *bufio.Writer ) {
- PointerField := packet.Next(1)
- for i:=0;i<int(PointerField[0]);i++ {
- packet.Next(1)
- }
- PATHeader := packet.Next(12)
- TableID := PATHeader[0]
- SectionSyntaxIndicator := PATHeader[1]&0x80>>7
- Zero := PATHeader[1]&0x40>>6
- Reserved := PATHeader[1]&0x30>>4
- SectionLength := binary.BigEndian.Uint16([]byte{PATHeader[1]&0x0F, PATHeader[2]})
- count := 0
- ProgramNumber := binary.BigEndian.Uint16([]byte{PATHeader[3], PATHeader[4]})
- Reserved2 := PATHeader[5]&0xC0>>6
- VersionNumber := PATHeader[5]&0x3E>>1
- CurrentNextIndicator := PATHeader[5]&0x01
- SectionNumber := PATHeader[6]
- LastSectionNumber := PATHeader[7]
- Reserved3 := PATHeader[8]&0xE0>>5
- PCRPID := binary.BigEndian.Uint16([]byte{PATHeader[8]&0x1F, PATHeader[9]})
- Reserved4 := PATHeader[10]&0xF0>>4
- ProgramInfoLength := binary.BigEndian.Uint16([]byte{PATHeader[10]&0x0F, PATHeader[11]})
- ProgramInfo := packet.Next(int(ProgramInfoLength))
- count +=9+int(ProgramInfoLength)
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\tPMT: [Table ID: x%X\t\t Section Syntax Indicator: b%b\t\tZero: x%X\t\tReserved: b%b\n\t\t\t\tSection Length: d%d Bits\t\tProgram Number: x%X\t\tReserved2: b%b\t\tVersion Number: x%X\n\t\t\t\tCurrent Next Indicator: x%X\t\tSection Number: x%X\t\tLast Section Number: x%X\t\tReserved: b%b\n\t\t\t\tPCR PID: x%X\t\tReserved: b%b\t\tProgram Info Length: d%d Bytes\t\tProgram Info: x%X]\n", TableID, SectionSyntaxIndicator, Zero, Reserved, SectionLength, ProgramNumber, Reserved2, VersionNumber, CurrentNextIndicator, SectionNumber, LastSectionNumber, Reserved3, PCRPID, Reserved4, ProgramInfoLength, ProgramInfo)
- }
- for ;count<(int(SectionLength)-4); {
- table := packet.Next(5)
- StreamType := table[0]
- StreamReserved1 := table[1]&0xE0>>5
- ESPID := binary.BigEndian.Uint16([]byte{table[1]&0x1F, table[2]})
- StreamReserved2 := table[3]&0xF0>>4
- ESInfoLen := binary.BigEndian.Uint16([]byte{table[3]&0x0F, table[4]})
- if getStreamMapping(ESPID) == 0x00 { //if PMT..
- setStreamMapping(ESPID, uint16(StreamType))
- }
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\tStream: [Stream Type: x%02X\t\tStream Reserved: b%03b\t\tElementary Stream PID: x%04X\t\tStream Reserved: b%04b\n\t\t\t\t\tElementary Stream Info Length: d%d]\n", StreamType, StreamReserved1, ESPID, StreamReserved2, ESInfoLen)
- }
- for i:=0;i<int(ESInfoLen); {
- Tag := packet.Next(1)[0]
- Len := packet.Next(1)[0]
- Data := packet.Next(int(Len))
- i+= 2+int(Len)
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tElementary Stream Descriptor: [Descriptor Tag: x%X\t\tDescriptor Length: d%d\t\tDescriptorData: x%X]\n", Tag, Len, Data)
- }
- }
- count = count + 5+int(ESInfoLen)
- }
- CRC32 := packet.Next(int(SectionLength)-count)
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\tCRC32: x%X\n", CRC32)
- }
- }
- //====================================================================================================================================================================//
- func MpegSCTE35Analyze(packet bytes.Buffer, response *bufio.Writer ) {
- PointerField := packet.Next(1)
- for i:=0;i<int(PointerField[0]);i++ {
- packet.Next(1)
- }
- SCTE35Header := packet.Next(14)
- TableID := SCTE35Header[0]
- SectionSyntaxIndicator := SCTE35Header[1]&0x80>>7
- Zero := SCTE35Header[1]&0x40>>6
- Reserved := SCTE35Header[1]&0x30>>4
- SectionLength := binary.BigEndian.Uint16([]byte{SCTE35Header[1]&0x0F, SCTE35Header[2]})
- count := 0
- ProtoVer := SCTE35Header[3]
- EncryptedFlag := SCTE35Header[4]&0x80>>7
- EncryptedAlg := SCTE35Header[4]&0x7E>>1
- PTSAdj := []byte{SCTE35Header[4]&0x01, SCTE35Header[5], SCTE35Header[6], SCTE35Header[7], SCTE35Header[8]}
- CWIndex := SCTE35Header[9]
- Tier := binary.BigEndian.Uint16([]byte{SCTE35Header[10], SCTE35Header[11]&0xF0})>>4
- SpliceCommandLen := binary.BigEndian.Uint16([]byte{SCTE35Header[11]&0x0F, SCTE35Header[12]})
- SpliceCommandType := SCTE35Header[13]
- count +=11
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\tSCTE35 Header: [Pointer Length: x%X\t\tTable ID: x%X\t\tSection Syntax Indicator: b%b\t\tZero: x%X\t\tReserved: b%b\n\t\t\t\tSection Length: d%d Bits\t\tProtocol Version: x%X\t\tEncrypted Packet Flag: b%b\t\tEncryption Algorithm: x%X\n\t\t\t\tPTS Adjustment: x%X\t\tCW Index: x%X\t\tTier: x%X\t\tSplice Command Length: d%d\n\t\t\t\tSplice Command Type: x%X]\n", PointerField, TableID, SectionSyntaxIndicator, Zero, Reserved, SectionLength, ProtoVer, EncryptedFlag, EncryptedAlg, PTSAdj, CWIndex, Tier, SpliceCommandLen, SpliceCommandType)
- }
- if SpliceCommandType == 0x0 {
- }
- if SpliceCommandType == 0x04 {
- }
- if SpliceCommandType == 0x05 {
- SpliceInsertAnalyze(packet, response)
- }
- if SpliceCommandType == 0x06 {
- SpliceTimeSignalAnalyze(packet, response)
- }
- if SpliceCommandType == 0x07 {
- }
- if SpliceCommandType == 0xFF {
- }
- _ = packet.Next(int(SpliceCommandLen))
- DescriptorLoopLength := binary.BigEndian.Uint16(packet.Next(2))
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\tSplice Descriptor Loop: [Descriptor Loop Length: d%d]\n",DescriptorLoopLength)
- }
- for i:=0;i<int(DescriptorLoopLength); {
- spliceDescriptorTag := packet.Next(1)[0]
- descriptorLength := packet.Next(1)[0]
- identifier := packet.Next(4)
- i=i+6
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tSplice Descriptor: [Descriptor Tag: x%X\t\tDescriptor Length: x%X\t\tIdentifier: x%X]\n", spliceDescriptorTag, descriptorLength, identifier)
- }
- if spliceDescriptorTag == 0x00 {
- AvailDescriptor(packet, response)
- } else if spliceDescriptorTag == 0x01 {
- DTMFDescriptor(packet, response)
- } else if spliceDescriptorTag == 0x02 {
- SegmentationDescriptor(packet, response)
- } else if spliceDescriptorTag == 0x03 {
- TimeDescriptor(packet, response)
- } else {
- fmt.Print()
- }
- }
- }
- //====================================================================================================================================================================//
- func AvailDescriptor(packet bytes.Buffer, response *bufio.Writer ) {
- ProviderAvailID := packet.Next(4)
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\tAvail Descriptor: [Identifier: x%X]\n", ProviderAvailID)
- }
- }
- //====================================================================================================================================================================//
- func DTMFDescriptor(packet bytes.Buffer, response *bufio.Writer ) {
- header := packet.Next(2)
- preroll := header[0]
- dtmfCount := header[1]&0xE0
- reserved := header[1]&0x1F
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\tDTMF Descriptor: [Preroll: x%X\t\tDTMF Count: x%X\t\tReserved: x%X]\n", preroll, dtmfCount, reserved)
- for i:=0;i<int(dtmfCount);i++ {
- //fmt.Fprintf(response, "\t\t\t\t\t\tDTMF Char: x%X]\n", packet.Next(1)[0])
- }
- }
- }
- //====================================================================================================================================================================//
- func SegmentationDescriptor(packet bytes.Buffer, response *bufio.Writer ) int {
- SegEventID := packet.Next(4)
- Second := packet.Next(1)[0]
- SegEventCancelFlag := Second&0x80>>7
- Reserved := Second&0xEF
- count := 5
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\tSegmentation Descriptor: [Segmentation Event ID: x%X\t\tSegmentation Event Cancel Flag: b%b\t\tReserved: b%b]\n",SegEventID, SegEventCancelFlag, Reserved)
- }
- if SegEventCancelFlag == 0 {
- Third := packet.Next(1)[0]
- ProgSegFlag := Third&0x80>>7
- SegDurFlag := Third&0x40>>6
- DNRFlag := Third&0x20>>5
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\tSegmentation Flags: [Program Segmentation Flag: b%b\t\tSegment Duration Flag: b%b\t\tDelivery Not Restricted Flag: b%b]\n", ProgSegFlag, SegDurFlag, DNRFlag)
- }
- if DNRFlag == 0 {
- WDAFlag := Third&0x10>>4
- NRBFlag := Third&0x08>>3
- ArchiveFlag := Third&0x04>>3
- DevRestrictions := Third&0x03
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\tDelivery Not Restricted SubFlags: [Web Delivery Allowed Flag: b%b\t\tNo Regional Blackout Flag: b%b\t\tArchive Allowed Flag: b%b\t\tDevice Restrictions: b%b]\n", WDAFlag, NRBFlag, ArchiveFlag, DevRestrictions)
- }
- } else {
- Reserved2 := Third&0x1F
- fmt.Fprintf(response, "\t\t\t\t\t\t\tReserved: b%b\n", Reserved2)
- }
- count++
- if ProgSegFlag == 0 {
- ComponentCount := packet.Next(1)[0]
- count++
- for i:=0;i<int(ComponentCount);i++ {
- ComponentTag := packet.Next(1)[0]
- Fourth := packet.Next(1)[0]
- Reserved3 := Fourth&0xF7
- PTSMain := packet.Next(4)
- PTSOffset := []byte{Fourth&0x01, PTSMain[0], PTSMain[1], PTSMain[2], PTSMain[3]}
- count = count +6
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\tProgram Segmentation Data: [Component Tag: b%X\t\tReserved: b%b\t\tPTS Offset: x%X]\n", ComponentTag, Reserved3, PTSOffset)
- }
- }
- }
- if SegDurFlag == 1 {
- SegDur := packet.Next(5)
- count+=5
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\t\tSegmentation duration: x%X\n", SegDur)
- }
- }
- SegUPIDType := packet.Next(1)[0]
- SegUPIDLen := packet.Next(1)[0]
- SegUPID := packet.Next(int(SegUPIDLen))
- SegTypeID := packet.Next(1)[0]
- SegNum := packet.Next(1)[0]
- SegExp := packet.Next(1)[0]
- count +=5
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\tSegmentation Data: [Segmentation UPID Type: x%X\t\tSegmentation UPID Length: x%X\t\tSegmentation UPID: x%X\t\tSegmentation Type ID: x%X\t\tSegment number: x%X\t\tSegments Expected: x%X\t\t]\n", SegUPIDType, SegUPIDLen, SegUPID, SegTypeID, SegNum, SegExp)
- }
- if SegTypeID == 0x34 || SegTypeID == 0x36 {
- SubSegNum := packet.Next(1)[0]
- SubSegExp := packet.Next(1)[0]
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\t\t\tSub Segment Data: [SubSegment Number: x%X\t\tSubSegments Expected: x%X]\n", SubSegNum, SubSegExp)
- }
- count +=2
- }
- }
- return count
- }
- //====================================================================================================================================================================//
- func TimeDescriptor(packet bytes.Buffer, response *bufio.Writer ) {
- }
- //====================================================================================================================================================================//
- func SpliceInsertAnalyze(packet bytes.Buffer, response *bufio.Writer ) {
- SCTE35Header := packet.Next(6)
- SpliceEventID := []byte{SCTE35Header[0], SCTE35Header[1], SCTE35Header[2], SCTE35Header[3]}
- SpliceEventCancel := SCTE35Header[4]&0x80>>7
- Reserved := SCTE35Header[4]&0xEF
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tSplice Insert: [Splice Event ID: x%08X\t\tSplice Event Cancel Flag: b%b\t\tReserved: b%07b]\n", SpliceEventID, SpliceEventCancel, Reserved)
- }
- if SpliceEventCancel == 0x00 {
- OONFlag := SCTE35Header[5]&0x80>>7
- SpliceFlag := SCTE35Header[5]&0x40>>6
- DurationFlag := SCTE35Header[5]&0x20>>5
- SpliceImmediateFlag := SCTE35Header[5]&0x10>>4
- Reserved2 := SCTE35Header[5]&0x0F
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tNew Splice Event: [Out Of Network Indicator: b%b\t\tSpliceFlag: b%b\t\tDurationFlag: b%b\t\tSplice Immediate Flag: b%b\n\t\t\t\t\t\tReserved: b%04b]\n", OONFlag, SpliceFlag, DurationFlag, SpliceImmediateFlag, Reserved2)
- }
- if SpliceFlag == 0x01 && SpliceImmediateFlag == 0x00 {
- SpliceTimeSignalAnalyze(packet, response)
- }
- if SpliceFlag == 0x00 {
- ComponentCount := int(packet.Next(1)[0])
- for ind := 0;ind<ComponentCount;ind++ {
- fmt.Printf("x%X", packet.Next(1)[0])
- }
- }
- }
- }
- func SpliceTimeSignalAnalyze(packet bytes.Buffer, response *bufio.Writer ) {
- Header := packet.Next(1)[0]
- TimeSpecifiedFlag := Header&0x80>>7
- if TimeSpecifiedFlag == 1 {
- TimestampData := packet.Next(4)
- Reserved := Header&0x7E>>1
- Timestamp := []byte{Header&0x01, TimestampData[0], TimestampData[1], TimestampData[2], TimestampData[3] }
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tSplice Time Signal Command : [Time Specified Flag: x%X\t\tReserved: b%b\t\tTimestamp: x%X\n]", TimeSpecifiedFlag, Reserved, Timestamp)
- }
- } else {
- Reserved := Header&0x7F
- if FilterFlag == true {
- fmt.Fprintf(response, "\t\t\t\t\tSplice Time Signal Command : [Time Specified Flag: x%X\t\tReserved: b%b\n]", TimeSpecifiedFlag, Reserved)
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement