1.参考笔记
<<webrtc QOS方法八(JitterBuffer)>>
代码版本M79
2.FrameBuffer--frame_buffer2.cc
上一篇《webrtc JetterBuffer 笔记-RtpFrameReferenceFinder》里最终找到参考帧的视频帧通过
OnCompleteFrame回调出来,进入了FrameBuffer进行缓存
先判断参考帧是否合法,缓存是否溢出,溢出的话,关键帧就可以清掉所有缓存,继续处理,非关键帧则丢帧
然后处理pid的顺序,如果pid乱序,但时间戳正常,关键帧可以继续处理
加入出现很大的跳帧,则清理缓存
接着更新参考帧信息 UpdateFrameInfoWithIncomingFrame
先拿当前帧和最新解码帧进行比较,正常应该是比当前最新解码帧要晚,早的话,要么就不解码,要么就已经解码过了
先将帧插入为满足的依赖表
然后遍历依赖表,减去为参考的依赖数,简历反向依赖关系
然后就可以回调完成的帧,然后通知解码器了
顺手往解码线程抛一个task
解码线程void VideoReceiveStream::StartNextDecode()
递归循环函数,核心就是获取下一帧,然后回调进行解码,然后继续获取下一帧。。。。。
FrameBuffer::NextFrame函数就是记录回调,然后阻塞等待下一帧,有超时时间
FrameBuffer::FindNextFrame(int64_t now_ms)函数会去拼凑superframe,对于h264来说,一个frame就是一帧,不需要再拼接,所以这个函数就是等待一帧
如果性能不够,来不及渲染,则放弃该帧,直到下一个I帧才能被继续解码出来