You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

174 lines
4.1KB

  1. /*
  2. * Generic frame queue
  3. * Copyright (c) 2016 Nicolas George
  4. *
  5. * This file is part of FFmpeg.
  6. *
  7. * FFmpeg is free software; you can redistribute it and/or
  8. * modify it under the terms of the GNU Lesser General Public License
  9. * as published by the Free Software Foundation; either
  10. * version 2.1 of the License, or (at your option) any later version.
  11. *
  12. * FFmpeg is distributed in the hope that it will be useful,
  13. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. * GNU Lesser General Public License for more details.
  16. *
  17. * You should have received a copy of the GNU Lesser General Public License
  18. * along with FFmpeg; if not, write to the Free Software Foundation, Inc.,
  19. * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  20. */
  21. #ifndef AVFILTER_FRAMEQUEUE_H
  22. #define AVFILTER_FRAMEQUEUE_H
  23. /**
  24. * FFFrameQueue: simple AVFrame queue API
  25. *
  26. * Note: this API is not thread-safe. Concurrent access to the same queue
  27. * must be protected by a mutex or any synchronization mechanism.
  28. */
  29. #include "libavutil/frame.h"
  30. typedef struct FFFrameBucket {
  31. AVFrame *frame;
  32. } FFFrameBucket;
  33. /**
  34. * Structure to hold global options and statistics for frame queues.
  35. *
  36. * This structure is intended to allow implementing global control of the
  37. * frame queues, including memory consumption caps.
  38. *
  39. * It is currently empty.
  40. */
  41. typedef struct FFFrameQueueGlobal {
  42. } FFFrameQueueGlobal;
  43. /**
  44. * Queue of AVFrame pointers.
  45. */
  46. typedef struct FFFrameQueue {
  47. /**
  48. * Array of allocated buckets, used as a circular buffer.
  49. */
  50. FFFrameBucket *queue;
  51. /**
  52. * Size of the array of buckets.
  53. */
  54. size_t allocated;
  55. /**
  56. * Tail of the queue.
  57. * It is the index in the array of the next frame to take.
  58. */
  59. size_t tail;
  60. /**
  61. * Number of currently queued frames.
  62. */
  63. size_t queued;
  64. /**
  65. * Pre-allocated bucket for queues of size 1.
  66. */
  67. FFFrameBucket first_bucket;
  68. /**
  69. * Total number of frames entered in the queue.
  70. */
  71. uint64_t total_frames_head;
  72. /**
  73. * Total number of frames dequeued from the queue.
  74. * queued = total_frames_head - total_frames_tail
  75. */
  76. uint64_t total_frames_tail;
  77. /**
  78. * Total number of samples entered in the queue.
  79. */
  80. uint64_t total_samples_head;
  81. /**
  82. * Total number of samples dequeued from the queue.
  83. * queued_samples = total_samples_head - total_samples_tail
  84. */
  85. uint64_t total_samples_tail;
  86. } FFFrameQueue;
  87. /**
  88. * Init a global structure.
  89. */
  90. void ff_framequeue_global_init(FFFrameQueueGlobal *fqg);
  91. /**
  92. * Init a frame queue and attach it to a global structure.
  93. */
  94. void ff_framequeue_init(FFFrameQueue *fq, FFFrameQueueGlobal *fqg);
  95. /**
  96. * Free the queue and all queued frames.
  97. */
  98. void ff_framequeue_free(FFFrameQueue *fq);
  99. /**
  100. * Add a frame.
  101. * @return >=0 or an AVERROR code.
  102. */
  103. int ff_framequeue_add(FFFrameQueue *fq, AVFrame *frame);
  104. /**
  105. * Take the first frame in the queue.
  106. * Must not be used with empty queues.
  107. */
  108. AVFrame *ff_framequeue_take(FFFrameQueue *fq);
  109. /**
  110. * Access a frame in the queue, without removing it.
  111. * The first frame is numbered 0; the designated frame must exist.
  112. */
  113. AVFrame *ff_framequeue_peek(FFFrameQueue *fq, size_t idx);
  114. /**
  115. * Get the number of queued frames.
  116. */
  117. static inline size_t ff_framequeue_queued_frames(const FFFrameQueue *fq)
  118. {
  119. return fq->queued;
  120. }
  121. /**
  122. * Get the number of queued samples.
  123. */
  124. static inline uint64_t ff_framequeue_queued_samples(const FFFrameQueue *fq)
  125. {
  126. return fq->total_samples_head - fq->total_samples_tail;
  127. }
  128. /**
  129. * Update the statistics after a frame accessed using ff_framequeue_peek()
  130. * was modified.
  131. * Currently used only as a marker.
  132. */
  133. static inline void ff_framequeue_update_peeked(FFFrameQueue *fq, size_t idx)
  134. {
  135. }
  136. /**
  137. * Update the sample count in the queue.
  138. *
  139. * This function must be used when the first frame was accessed using
  140. * ff_framequeue_peek() and samples were removed from it.
  141. */
  142. static inline void ff_framequeue_skip_samples(FFFrameQueue *fq, size_t n)
  143. {
  144. fq->total_samples_tail += n;
  145. }
  146. #endif /* AVFILTER_FRAMEQUEUE_H */