[关闭]
@leaveye 2022-05-11T11:29:17.000000Z 字数 1236 阅读 239

debug

d2201 debug codec video decoder



Video Decode and Output

present

  1. loop:
  2. if nng_recv_queue.empty():
  3. continue
  4. pkt = nng_recv_queue.pop()
  5. ... some pts manner and maybe delay ...
  6. decoder_write(pkt)
  7. free(pkt)

to-be

  1. pkt = NULL
  2. pts_next = 0
  3. pts_last = 0
  4. while RUNNING:
  5. if pkt:
  6. // fps control
  7. local pts_this = pkt.pts
  8. local pts_step = pts_this - pts_last
  9. pts_step -= 1ms
  10. if pts_step > const_window_size:
  11. pts_next = get_now() - pts_step / 4
  12. local pts_delta = get_now() - pts_next
  13. while pts_delta > const_min_delay:
  14. if not RUNNING:
  15. ... force quit ...
  16. else if pts_delta > const_window_size:
  17. pts_next = get_now() - pts_step / 4
  18. else:
  19. ... short sleep, maybe 10 ms ...
  20. pts_delta = get_now() - pts_next
  21. pts_next += pts_step
  22. pts_last = pts_this
  23. decoder_write(pkt)
  24. free(pkt)
  25. continue
  26. if nng_recv_queue.empty():
  27. sleep 10 ms
  28. continue
  29. pkt = nng_recv_queue.pop()
  30. if pkt:
  31. free(pkt)

原理要点

可能的缺陷

需要稳定的帧间时间

如果编码帧时间戳按时间顺序分别是
此时,令
即:

表示在播放第 帧之前,应该等待多久。

表示在播放第 帧之前,应该等待多久。

然而算法中,使用 拿来当作播放第 帧后的等待时间。
这在 序列产生较大突变的时候可能会引入问题。幸运的是编码侧帧率最终由硬件时钟驱动,稳定性不错。暂时应可无视此问题。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注