Initial Commit
This commit is contained in:
commit
f4fa723863
22 changed files with 1402 additions and 0 deletions
112
src/frame_queue.c
Normal file
112
src/frame_queue.c
Normal file
|
|
@ -0,0 +1,112 @@
|
|||
#include "frame_queue.h"
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
void frame_data_free(FrameData *frame) {
|
||||
if (!frame) {
|
||||
return;
|
||||
}
|
||||
|
||||
free(frame->pixels);
|
||||
memset(frame, 0, sizeof(*frame));
|
||||
}
|
||||
|
||||
int frame_queue_init(FrameQueue *queue) {
|
||||
if (!queue) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
memset(queue, 0, sizeof(*queue));
|
||||
queue->mutex = SDL_CreateMutex();
|
||||
queue->cond = SDL_CreateCond();
|
||||
|
||||
return (queue->mutex && queue->cond) ? 0 : -1;
|
||||
}
|
||||
|
||||
void frame_queue_clear(FrameQueue *queue) {
|
||||
if (!queue || !queue->mutex) {
|
||||
return;
|
||||
}
|
||||
|
||||
SDL_LockMutex(queue->mutex);
|
||||
while (queue->count > 0) {
|
||||
frame_data_free(&queue->frames[queue->head]);
|
||||
queue->head = (queue->head + 1) % FRAME_QUEUE_CAPACITY;
|
||||
queue->count -= 1;
|
||||
}
|
||||
queue->head = 0;
|
||||
SDL_UnlockMutex(queue->mutex);
|
||||
}
|
||||
|
||||
void frame_queue_destroy(FrameQueue *queue) {
|
||||
if (!queue) {
|
||||
return;
|
||||
}
|
||||
|
||||
frame_queue_clear(queue);
|
||||
if (queue->cond) {
|
||||
SDL_DestroyCond(queue->cond);
|
||||
}
|
||||
if (queue->mutex) {
|
||||
SDL_DestroyMutex(queue->mutex);
|
||||
}
|
||||
memset(queue, 0, sizeof(*queue));
|
||||
}
|
||||
|
||||
int frame_queue_push(FrameQueue *queue, FrameData *frame) {
|
||||
int tail;
|
||||
|
||||
if (!queue || !frame || !queue->mutex) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
SDL_LockMutex(queue->mutex);
|
||||
|
||||
if (queue->count == FRAME_QUEUE_CAPACITY) {
|
||||
frame_data_free(&queue->frames[queue->head]);
|
||||
queue->head = (queue->head + 1) % FRAME_QUEUE_CAPACITY;
|
||||
queue->count -= 1;
|
||||
}
|
||||
|
||||
tail = (queue->head + queue->count) % FRAME_QUEUE_CAPACITY;
|
||||
queue->frames[tail] = *frame;
|
||||
memset(frame, 0, sizeof(*frame));
|
||||
queue->count += 1;
|
||||
SDL_CondSignal(queue->cond);
|
||||
SDL_UnlockMutex(queue->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int frame_queue_pop_latest(FrameQueue *queue, FrameData *out) {
|
||||
int latest_index;
|
||||
|
||||
if (!queue || !out || !queue->mutex) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
SDL_LockMutex(queue->mutex);
|
||||
if (queue->count == 0) {
|
||||
SDL_UnlockMutex(queue->mutex);
|
||||
return 0;
|
||||
}
|
||||
|
||||
latest_index = (queue->head + queue->count - 1) % FRAME_QUEUE_CAPACITY;
|
||||
*out = queue->frames[latest_index];
|
||||
memset(&queue->frames[latest_index], 0, sizeof(queue->frames[latest_index]));
|
||||
|
||||
while (queue->count > 0) {
|
||||
if (queue->head == latest_index) {
|
||||
queue->head = 0;
|
||||
queue->count = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
frame_data_free(&queue->frames[queue->head]);
|
||||
queue->head = (queue->head + 1) % FRAME_QUEUE_CAPACITY;
|
||||
queue->count -= 1;
|
||||
}
|
||||
|
||||
SDL_UnlockMutex(queue->mutex);
|
||||
return 1;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue