Esempio n. 1
0
File: parser.go Progetto: sraaron/ts
func extract(fname string, outdir string, pid int) {
	var pkts chan *ts.TsPkt
	pkts = ts.ParseFile(fname)

	of := filepath.Join(outdir, strconv.Itoa(pid)+".es")
	f, err := os.Create(of)
	if err != nil {
		panic(err)
	}
	defer f.Close()

	for pkt := range pkts {
		if pkt.Pid == pid {
			f.Write(pkt.Data)
		}
	}
}
Esempio n. 2
0
File: parser.go Progetto: sraaron/ts
func parse(fname string, outdir string, psiOnly bool) {
	var pkts chan *ts.TsPkt

	Root = outdir

	// PCR PID -> PCR values
	var progPcrList = make(map[int][]ts.PcrInfo)
	var extraPcrList = make(map[int][]ts.PcrInfo)

	pkts = ts.ParseFile(fname)
	psiParser := ts.NewPsiParser()
	psiParseDone := false
	for pkt := range pkts {
		if ok := psiParser.Parse(pkt); ok {
			psiParseDone = true
			break
		}
	}
	// TODO: non existent PMT will not trigger ParseDone automatically
	if psiParseDone == false {
		psiParser.ParseDone()
	}
	psiParser.Finish()
	psiParser.Report(outdir)

	if psiOnly {
		return
	}

	streams := psiParser.GetStreams()

	pcrs := psiParser.GetPcrs()
	for pcrPid, _ := range pcrs {
		// Default PCR list length: 1500 = 25Hz * 60s
		progPcrList[pcrPid] = make([]ts.PcrInfo, 0)
	}

	records := make(map[int]ts.Record)
	for pid, s := range streams {
		records[pid] = ts.CreateRecord(pid, ts.GetStreamType(s), outdir)
	}

	pkts = ts.ParseFile(fname)
	for pkt := range pkts {
		if pcr, ok := pkt.PCR(); ok {
			if pids, ok := pcrs[pkt.Pid]; ok {
				// Save the PCR value
				progPcrList[pkt.Pid] = append(
					progPcrList[pkt.Pid],
					ts.PcrInfo{pkt.Pos, pcr})
				for _, pid := range pids {
					records[pid].NotifyTime(pcr, pkt.Pos)
				}
			} else {
				// extra PCR
				if _, ok := extraPcrList[pkt.Pid]; !ok {
					extraPcrList[pkt.Pid] = make([]ts.PcrInfo, 0)
				}
				extraPcrList[pkt.Pid] = append(
					extraPcrList[pkt.Pid],
					ts.PcrInfo{pkt.Pos, pcr})
			}
		}

		if record, ok := records[pkt.Pid]; ok {
			record.Process(pkt)
		}
	}

	for pcrPid, pcrList := range progPcrList {
		ts.CheckPcrInterval(outdir, "", pcrPid, pcrList)
	}

	for pcrPid, pcrList := range extraPcrList {
		ts.CheckPcrInterval(outdir, "extra", pcrPid, pcrList)
	}

	for _, record := range records {
		record.Flush()
		record.Report(outdir)
	}

	// verify(psiParser.Info)
}