initial commit
This commit is contained in:
94
common/ringbuffer/ringbuffer.h
Executable file
94
common/ringbuffer/ringbuffer.h
Executable file
@@ -0,0 +1,94 @@
|
||||
/*
|
||||
* =====================================================================================
|
||||
* Copyright (c), 2013-2020, Jz.
|
||||
* Filename: ringbuffer.h
|
||||
* Author: linux kernel,
|
||||
* Organization: jz
|
||||
*
|
||||
* =====================================================================================
|
||||
*/
|
||||
/*************************************************
|
||||
File name : ringbuffer.h
|
||||
Module : common
|
||||
Author : amir
|
||||
Created on : 2023-01-6
|
||||
Description :
|
||||
a ringbuffer to store data(copy)
|
||||
|
||||
Modify History:
|
||||
1. Date: Author: Modification:
|
||||
*************************************************/
|
||||
#ifndef __RINGBUFFER_H__
|
||||
#define __RINGBUFFER_H__
|
||||
#include <stdint.h>
|
||||
#include "list.h"
|
||||
#include "hmutex.h"
|
||||
#include "hbase.h"
|
||||
|
||||
enum{
|
||||
RING_LIST_FREE = 0,
|
||||
RING_LIST_USING,
|
||||
RING_LIST_MAX,
|
||||
};
|
||||
|
||||
typedef struct{
|
||||
struct list_head link;
|
||||
int8_t *pos;
|
||||
uint32_t size;
|
||||
uint32_t seq; /* start from 0, 不是视频的seq, ringbuffer 内部的seq */
|
||||
}ring_item;
|
||||
|
||||
typedef struct{
|
||||
struct list_head list[RING_LIST_MAX];
|
||||
hmutex_t mutex;
|
||||
hsem_t sem;
|
||||
int8_t *buffer;/* the buffer holding the data */
|
||||
uint32_t capacity;/* the capacity of the allocated buffer */
|
||||
int8_t *write;/* data is added at offset (write % size) */
|
||||
int8_t *read;/* data is extracted from off. (read % size) */
|
||||
ring_item *latest_item; /* 最新一个 item, seq 第一个为0, 并自增, 无的时候是 UINT32_MAX*/
|
||||
uint32_t last_drop_seq; /* 最后因buffer不足,被丢弃的seq*/
|
||||
}ringbuffer;
|
||||
|
||||
|
||||
ringbuffer * ringbuffer_init(uint32_t size);
|
||||
|
||||
void ringbuffer_deinit(ringbuffer *rb);
|
||||
|
||||
void ringbuffer_reset(ringbuffer *rb);
|
||||
|
||||
//put in data
|
||||
/*
|
||||
* 返回被最后丢掉的seq
|
||||
*/
|
||||
#define ringbuffer_put(_fifo, _data, _size) ringbuffer_put2(_fifo, _data, _size, NULL, 0)
|
||||
|
||||
//put in 2 data
|
||||
/*
|
||||
* 返回被最后新增的item
|
||||
*/
|
||||
ring_item *ringbuffer_put2(ringbuffer *rb, const char *data1, uint32_t data1_size, const char *data2, uint32_t data2_size);
|
||||
|
||||
//pop out data
|
||||
int32_t ringbuffer_pop(ringbuffer *rb, char *to, uint32_t *len);
|
||||
|
||||
//get the size of data in ringbuffer
|
||||
int32_t ringbuffer_size(ringbuffer *rb);
|
||||
|
||||
//get the hv_free size of data in ringbuffer
|
||||
|
||||
int32_t ringbuffer_get_freesize(ringbuffer *rb);
|
||||
|
||||
/*
|
||||
* 返回UINT32_MAX无数据
|
||||
*/
|
||||
uint32_t ringbuffer_get_lastseq_locked(ringbuffer *rb);
|
||||
|
||||
|
||||
//get the count of items in ringbuffer
|
||||
int32_t ringbuffer_item_count(ringbuffer *rb);
|
||||
|
||||
void ringbuffer_dump(ringbuffer *rb);
|
||||
|
||||
int32_t ringbuffer_test();
|
||||
#endif
|
||||
Reference in New Issue
Block a user