video_buf.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. #include "FreeRTOS.h"
  2. #include "board.h"
  3. #include "sysinfo.h"
  4. #include "chip.h"
  5. typedef enum {
  6. VBUF_STATUS_FREE = 0,
  7. VBUF_STATUS_USED,
  8. VBUF_STATUS_RENDERED,
  9. } VIDEO_BUFFER_STATUS;
  10. typedef struct {
  11. uint32_t addr;
  12. int status;
  13. }VideoBufInfo;
  14. static SemaphoreHandle_t vdisbuf_mutex = NULL;
  15. static VideoBufInfo vdisbufs[VIDEO_DISPLAY_BUF_NUM] = {0};
  16. void VideoDisplayBufInit(void)
  17. {
  18. int i;
  19. vdisbuf_mutex = xSemaphoreCreateRecursiveMutex();
  20. for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
  21. vdisbufs[i].addr = (uint32_t)pvPortMalloc(VIDEO_DISPLAY_WIDTH * VIDEO_DISPLAY_HEIGHT * 2);
  22. vdisbufs[i].status = VBUF_STATUS_FREE;
  23. }
  24. }
  25. int xVideoDisplayBufTake(uint32_t xTicksToWait)
  26. {
  27. return xSemaphoreTakeRecursive(vdisbuf_mutex, xTicksToWait);
  28. }
  29. void vVideoDisplayBufGive(void)
  30. {
  31. xSemaphoreGiveRecursive(vdisbuf_mutex);
  32. }
  33. uint32_t ulVideoDisplayBufGet(void)
  34. {
  35. uint32_t bufaddr = 0;
  36. int i;
  37. xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
  38. for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
  39. if (vdisbufs[i].status == VBUF_STATUS_FREE) {
  40. bufaddr = vdisbufs[i].addr;
  41. vdisbufs[i].status = VBUF_STATUS_USED;
  42. break;
  43. }
  44. }
  45. xSemaphoreGiveRecursive(vdisbuf_mutex);
  46. configASSERT(bufaddr != 0);
  47. return bufaddr;
  48. }
  49. uint32_t ulVideoDisplayBufGetSize(void)
  50. {
  51. return VIDEO_DISPLAY_WIDTH * VIDEO_DISPLAY_HEIGHT * 2;
  52. }
  53. void vVideoDisplayBufRender(uint32_t buf_addr)
  54. {
  55. int i, j;
  56. xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
  57. for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
  58. if (vdisbufs[i].addr == buf_addr) {
  59. for (j = 0; j < VIDEO_DISPLAY_BUF_NUM; j++) {
  60. if (vdisbufs[j].status == VBUF_STATUS_RENDERED)
  61. vdisbufs[j].status = VBUF_STATUS_FREE;
  62. }
  63. vdisbufs[i].status = VBUF_STATUS_RENDERED;
  64. break;
  65. }
  66. }
  67. xSemaphoreGiveRecursive(vdisbuf_mutex);
  68. }
  69. void vVideoDisplayBufFree(uint32_t buf_addr)
  70. {
  71. int i;
  72. xSemaphoreTakeRecursive(vdisbuf_mutex, portMAX_DELAY);
  73. for (i = 0; i < VIDEO_DISPLAY_BUF_NUM; i++) {
  74. if (vdisbufs[i].addr == buf_addr) {
  75. vdisbufs[i].status = VBUF_STATUS_FREE;
  76. break;
  77. }
  78. }
  79. xSemaphoreGiveRecursive(vdisbuf_mutex);
  80. }
  81. unsigned int ulVideoDisplayGetBufferAddr(int index)
  82. {
  83. configASSERT(index < VIDEO_DISPLAY_BUF_NUM);
  84. return vdisbufs[index].addr;
  85. }