(ts io.Reader)
| 520 | return |
| 521 | } |
| 522 | func (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 | } |
nothing calls this directly
no test coverage detected