hframe.cpp 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. #include "hframe.h"
  2. int HFrameBuf::push(HFrame* pFrame) {
  3. if (pFrame->isNull())
  4. return -10;
  5. frame_stats.push_cnt++;
  6. std::lock_guard<std::mutex> locker(mutex);
  7. if (frames.size() >= cache_num) {
  8. if (policy == HFrameBuf::DISCARD) {
  9. return -20; // note: cache full, discard frame
  10. }
  11. // note: cache full, remove front, push newer frame
  12. HFrame& frame = frames.front();
  13. frames.pop_front();
  14. free(frame.buf.len);
  15. if (frame.userdata) {
  16. ::free(frame.userdata);
  17. frame.userdata = NULL;
  18. }
  19. }
  20. int ret = 0;
  21. if (isNull()) {
  22. init(pFrame->buf.len * cache_num);
  23. ret = 1; // note: first push
  24. frame_info.w = pFrame->w;
  25. frame_info.h = pFrame->h;
  26. frame_info.type = pFrame->type;
  27. frame_info.bpp = pFrame->bpp;
  28. }
  29. HFrame frame;
  30. frame.buf.base = alloc(pFrame->buf.len);
  31. frame.buf.len = pFrame->buf.len;
  32. frame = *pFrame;
  33. frames.push_back(frame);
  34. frame_stats.push_ok_cnt++;
  35. return ret;
  36. }
  37. int HFrameBuf::pop(HFrame* pFrame) {
  38. frame_stats.pop_cnt++;
  39. std::lock_guard<std::mutex> locker(mutex);
  40. if (isNull())
  41. return -10;
  42. if (frames.size() == 0)
  43. return -20;
  44. HFrame& frame = frames.front();
  45. frames.pop_front();
  46. free(frame.buf.len);
  47. if (frame.isNull())
  48. return -30;
  49. *pFrame = frame;
  50. frame_stats.pop_ok_cnt++;
  51. return 0;
  52. }