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

Method ReadFrame

track/reader-av.go:68–161  ·  view source on GitHub ↗
(mode int)

Source from the content-addressed store, hash-verified

66}
67
68func (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 // 防止过快消费

Callers 1

PlayBlockMethod · 0.80

Calls 7

readFrameMethod · 0.95
StartReadMethod · 0.80
InfoMethod · 0.65
WarnMethod · 0.65
ReadMethod · 0.65
DebugMethod · 0.65
Uint32Method · 0.45

Tested by

no test coverage detected