-
Notifications
You must be signed in to change notification settings - Fork 1
/
ringfifo.c
executable file
·191 lines (171 loc) · 5.07 KB
/
ringfifo.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
/*ringbuf .c*/
#include<stdio.h>
#include<ctype.h>
#include <stdlib.h>
#include <string.h>
#include "ringfifo.h"
#include "rtputils.h"
#include "sample_comm.h"
#define NMAX 64
int iput = 0; /* 环形缓冲区的当前放入位置 */
int iget = 0; /* 缓冲区的当前取出位置 */
int n = 0; /* 环形缓冲区中的元素总数量 */
struct ringbuf ringfifo[NMAX];
extern int UpdateSpsOrPps(unsigned char *data,int frame_type,int len);
/* 环形缓冲区的地址编号计算函数,如果到达唤醒缓冲区的尾部,将绕回到头部。
环形缓冲区的有效地址编号为:0到(NMAX-1)
*/
void ringmalloc(int size)
{
int i;
for(i =0; i<NMAX; i++)
{
ringfifo[i].buffer = malloc(size);
ringfifo[i].size = 0;
ringfifo[i].frame_type = 0;
// printf("FIFO INFO:idx:%d,len:%d,ptr:%x\n",i,ringfifo[i].size,(int)(ringfifo[i].buffer));
}
iput = 0; /* 环形缓冲区的当前放入位置 */
iget = 0; /* 缓冲区的当前取出位置 */
n = 0; /* 环形缓冲区中的元素总数量 */
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
void ringreset()
{
iput = 0; /* 环形缓冲区的当前放入位置 */
iget = 0; /* 缓冲区的当前取出位置 */
n = 0; /* 环形缓冲区中的元素总数量 */
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
void ringfree(void)
{
int i;
printf("begin free mem\n");
for(i =0; i<NMAX; i++)
{
// printf("FREE FIFO INFO:idx:%d,len:%d,ptr:%x\n",i,ringfifo[i].size,(int)(ringfifo[i].buffer));
free(ringfifo[i].buffer);
ringfifo[i].size = 0;
}
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
int addring(int i)
{
return (i+1) == NMAX ? 0 : i+1;
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
/* 从环形缓冲区中取一个元素 */
int ringget(struct ringbuf *getinfo)
{
int Pos;
if(n>0)
{
Pos = iget;
iget = addring(iget);
n--;
getinfo->buffer = (ringfifo[Pos].buffer);
getinfo->frame_type = ringfifo[Pos].frame_type;
getinfo->size = ringfifo[Pos].size;
//printf("Get FIFO INFO:idx:%d,len:%d,ptr:%x,type:%d\n",Pos,getinfo->size,(int)(getinfo->buffer),getinfo->frame_type);
return ringfifo[Pos].size;
}
else
{
//printf("Buffer is empty\n");
return 0;
}
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
/* 向环形缓冲区中放入一个元素*/
void ringput(unsigned char *buffer,int size,int encode_type)
{
if(n<NMAX)
{
memcpy(ringfifo[iput].buffer,buffer,size);
ringfifo[iput].size= size;
ringfifo[iput].frame_type = encode_type;
//printf("Put FIFO INFO:idx:%d,len:%d,ptr:%x,type:%d\n",iput,ringfifo[iput].size,(int)(ringfifo[iput].buffer),ringfifo[iput].frame_type);
iput = addring(iput);
n++;
}
else
{
// printf("Buffer is full\n");
}
}
/**************************************************************************************************
**
**
**
**************************************************************************************************/
#include "rtmpStream.h"
extern RTMP *rtmp;
extern RTMPMetadata MetaData;
HI_S32 HisiPutH264DataToBuffer(VENC_STREAM_S *pstStream)
{
HI_S32 i,j;
HI_S32 len=0,off=0,len2=2;
unsigned char *pstr;
int iframe=0;
for (i = 0; i < pstStream->u32PackCount; i++)
{
len+=pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset;
}
unsigned char *buffer = (unsigned char *)malloc(len);
if(n<NMAX)
{
for (i = 0; i < pstStream->u32PackCount; i++)
{
memcpy(buffer+off,pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset,pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset);
off+=pstStream->pstPack[i].u32Len-pstStream->pstPack[i].u32Offset;
pstr=pstStream->pstPack[i].pu8Addr+pstStream->pstPack[i].u32Offset;
if(pstr[4]==0x67)
{
//UpdateSps(ringfifo[iput].buffer+off,9);
//iframe=1;
//printf("sps frame\n");
}
else if(pstr[4]==0x68)
{
//UpdatePps(ringfifo[iput].buffer+off,4);
//printf("pps frame\n");
}
}
/*ringfifo[iput].size= len;
//printf("iframe=%d\n",iframe);
if(iframe)
{
ringfifo[iput].frame_type = FRAME_TYPE_I;
}
else
ringfifo[iput].frame_type = FRAME_TYPE_P;
iput = addring(iput);
n++;*/
/*FILE *fp = fopen("stream.h264", "ab");
fwrite(buffer, 1, len, fp);
fclose(fp); */
putH264BufferToRtmpStream(rtmp, &MetaData, buffer, len);
free(buffer);
}
return HI_SUCCESS;
}