| 66 | } |
| 67 | |
| 68 | func (r *AVRingReader) ReadFrame(mode int) (err error) { |
| 69 | r.mode = mode |
| 70 | switch r.State { |
| 71 | case READSTATE_INIT: |
| 72 | r.Info("start read", zap.Int("mode", mode)) |
| 73 | startRing := r.Track.Ring |
| 74 | if r.Track.IDRing != nil { |
| 75 | startRing = r.Track.IDRing |
| 76 | } else { |
| 77 | r.Warn("no IDRring") |
| 78 | } |
| 79 | switch mode { |
| 80 | case SUBMODE_REAL: |
| 81 | if r.Track.IDRing != nil { |
| 82 | r.State = READSTATE_FIRST |
| 83 | } else { |
| 84 | r.State = READSTATE_NORMAL |
| 85 | } |
| 86 | case SUBMODE_NOJUMP: |
| 87 | r.State = READSTATE_NORMAL |
| 88 | case SUBMODE_BUFFER: |
| 89 | if r.Track.HistoryRing != nil { |
| 90 | startRing = r.Track.HistoryRing |
| 91 | r.Info("buffer mode", zap.Duration("time", r.Track.LastValue.Timestamp-r.Track.HistoryRing.Value.Timestamp)) |
| 92 | } |
| 93 | r.State = READSTATE_NORMAL |
| 94 | case SUBMODE_WAITKEY: |
| 95 | startRing = r.Track.Ring |
| 96 | if startRing == r.Track.IDRing { |
| 97 | r.State = READSTATE_NORMAL |
| 98 | } else { |
| 99 | r.State = READSTATE_WAITKEY |
| 100 | } |
| 101 | } |
| 102 | if err = r.StartRead(startRing); err != nil { |
| 103 | return |
| 104 | } |
| 105 | r.startTime = time.Now() |
| 106 | if r.FirstTs == 0 { |
| 107 | r.FirstTs = r.Value.Timestamp |
| 108 | } |
| 109 | r.SkipTs = r.FirstTs - r.StartTs |
| 110 | r.FirstSeq = r.Value.Sequence |
| 111 | r.Info("first frame read", zap.Duration("firstTs", r.FirstTs), zap.Uint32("firstSeq", r.FirstSeq)) |
| 112 | case READSTATE_FIRST: |
| 113 | if r.Track.IDRing.Value.Sequence != r.FirstSeq { |
| 114 | if err = r.Read(r.Track.IDRing); err != nil { |
| 115 | return |
| 116 | } |
| 117 | r.SkipTs = r.Value.Timestamp - r.beforeJump - r.StartTs - 10*time.Millisecond |
| 118 | r.Info("jump", zap.Uint32("skipSeq", r.Track.IDRing.Value.Sequence-r.FirstSeq), zap.Duration("skipTs", r.SkipTs)) |
| 119 | r.State = READSTATE_NORMAL |
| 120 | } else { |
| 121 | if err = r.readFrame(); err != nil { |
| 122 | return |
| 123 | } |
| 124 | r.beforeJump = r.Value.Timestamp - r.FirstTs |
| 125 | // 防止过快消费 |