#ifndef __SYNC_QUEUE_H_
#define __SYNC_QUEUE_H_
#include
#include
#include
#include
#include
//用于视频帧之间信息同步,
typedef struct SyncData_tag {
}SyncData;
typedef struct QNode {
int64_t pts;
SyncData data;
struct QNode *next;
}QNode, *QueuePtr;
typedef struct {
QueuePtr front;
QueuePtr rear;
pthread_mutex_t mutex;
}linkQueue;
int init_queue(linkQueue *q); //初始化队列
int destroy_queue(linkQueue *q); //销毁队列
int en_queue(linkQueue *q, int64_t pts, const SyncData &d); //从队列尾插入,头节点是空着的
int de_queue(linkQueue *q, int64_t pts, SyncData *d); //根据pts取数据
void dump_queue(linkQueue *q);
//实现的这个队列的作用是在视频帧之间同步信息,只能是C语言的
#endif
#include "sync_queue.h"
void *Malloc(size_t s)
{
void *ptr = malloc(s);
memset(ptr, 0x0, s);
return ptr;
}
int init_queue(linkQueue *q)
{
q->front = q->rear = (QueuePtr)malloc(sizeof(QNode));
if (!q->front) {
return -1;
}
q->front->next = NULL;
pthread_mutex_init(&q->mutex, NULL);
return 0;
}
int destroy_queue(linkQueue *q)
{
pthread_mutex_lock(&q->mutex);
while (q->front) {
q->rear = q->front->next;
free(q->front);
q->front = q->rear;
}
pthread_mutex_unlock(&q->mutex);
return 0;
}
int en_queue(linkQueue *q, int64_t pts, const SyncData &d)
{
QueuePtr p = (QueuePtr)Malloc(sizeof(QNode));
if (!p) {
return -1;
}
pthread_mutex_lock(&q->mutex);
p->pts = pts;
p->data = d;
p->next = NULL;
q->rear->next = p; //从队列尾插入
q->rear = p; //调整队列尾
pthread_mutex_unlock(&q->mutex);
return 0;
}
int de_queue(linkQueue *q, const int64_t pts, SyncData *d)
{
if (q->front == q->rear) {
return 1;
}
pthread_mutex_lock(&q->mutex);
if (q->front == q->rear) {
pthread_mutex_unlock(&q->mutex);
return 1;
}
int found = 0;
QueuePtr p = q->front;
while (p->next) {
if (p->next->pts == pts) { //先找到对应的节点
*d = p->next->data;
QueuePtr n = p->next;
p->next = p->next->next; //移除节点关系链
if (q->rear == n) {
q->rear = q->front;
}
free(n); //实际删除节点
found = 1;
}
p = p->next;
}
if (found == 0) {
return 2;
}
pthread_mutex_unlock(&q->mutex);
return 0;
}
void dump_queue(linkQueue *q)
{
QueuePtr p = q->front->next;
while (p) {
printf("%ld->", p->pts);
p = p->next;
}
printf("n");
}
int main()
{
linkQueue q;
init_queue(&q);
SyncData v;
int64_t pts = 128;
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
en_queue(&q, pts++, v);
SyncData get;
de_queue(&q, 131, &get);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
de_queue(&q, 128, &get);
de_queue(&q, 256, &get);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
en_queue(&q, pts--, v);
dump_queue(&q);
return 0;
}
验证对列正确性:
128->129->130->132->133->134->135->136->137->138->139->140->141->
128->129->130->132->133->134->135->136->137->138->139->140->141->142->
128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->
128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->
128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->
128->129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->
129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->
129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->
129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->
129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->135->
129->130->132->133->134->135->136->137->138->139->140->141->142->141->140->139->138->137->136->135->134->



