MCPcopy Create free account
hub / github.com/Monibuca/engine / Feed

Method Feed

codec/mpegts/mpegts.go:522–578  ·  view source on GitHub ↗
(ts io.Reader)

Source from the content-addressed store, hash-verified

520 return
521}
522func (s *MpegTsStream) Feed(ts io.Reader) (err error) {
523 var reader bytes.Reader
524 var lr io.LimitedReader
525 lr.R = &reader
526 var tsHeader MpegTsHeader
527 tsData := make([]byte, TS_PACKET_SIZE)
528 for {
529 _, err = io.ReadFull(ts, tsData)
530 if err == io.EOF {
531 // 文件结尾 把最后面的数据发出去
532 for _, pesPkt := range s.PESBuffer {
533 if pesPkt != nil {
534 s.PESChan <- pesPkt
535 }
536 }
537 return nil
538 } else if err != nil {
539 return
540 }
541 reader.Reset(tsData)
542 lr.N = TS_PACKET_SIZE
543 if tsHeader, err = ReadTsHeader(&lr); err != nil {
544 return
545 }
546 if tsHeader.Pid == PID_PAT {
547 if s.PAT, err = ReadPAT(&lr); err != nil {
548 return
549 }
550 continue
551 }
552 if len(s.PMT.Stream) == 0 {
553 for _, v := range s.PAT.Program {
554 if v.ProgramMapPID == tsHeader.Pid {
555 if s.PMT, err = ReadPMT(&lr); err != nil {
556 return
557 }
558 for _, v := range s.PMT.Stream {
559 s.PESBuffer[v.ElementaryPID] = nil
560 }
561 }
562 continue
563 }
564 } else if pesPkt, ok := s.PESBuffer[tsHeader.Pid]; ok {
565 if tsHeader.PayloadUnitStartIndicator == 1 {
566 if pesPkt != nil {
567 s.PESChan <- pesPkt
568 }
569 pesPkt = &MpegTsPESPacket{}
570 s.PESBuffer[tsHeader.Pid] = pesPkt
571 if pesPkt.Header, err = ReadPESHeader(&lr); err != nil {
572 return
573 }
574 }
575 io.Copy(&pesPkt.Payload, &lr)
576 }
577 }
578}

Callers

nothing calls this directly

Calls 5

ReadTsHeaderFunction · 0.85
ReadPATFunction · 0.85
ReadPMTFunction · 0.85
ReadPESHeaderFunction · 0.85
ResetMethod · 0.65

Tested by

no test coverage detected