a-oRTP  5.2.0
str_utils.h
1 /*
2  The oRTP library is an RTP (Realtime Transport Protocol - rfc3550) stack.
3  Copyright (C) 2001 Simon MORLAT simon.morlat@linphone.org
4 
5  This library is free software; you can redistribute it and/or
6  modify it under the terms of the GNU Lesser General Public
7  License as published by the Free Software Foundation; either
8  version 2.1 of the License, or (at your option) any later version.
9 
10  This library is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13  Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public
16  License along with this library; if not, write to the Free Software
17  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
18 */
19 
20 #ifndef STR_UTILS_H
21 #define STR_UTILS_H
22 
23 #include <ortp/port.h>
24 
25 typedef struct msgb {
26  struct msgb *b_prev;
27  struct msgb *b_next;
28  struct msgb *b_cont;
29  struct datab *b_datap;
30  unsigned char *b_rptr;
31  unsigned char *b_wptr;
32  uint32_t reserved1;
33  uint32_t reserved2;
34  uint32_t reserved3;
35  uint32_t reserved4;
36  uint32_t reserved5;
37  uint32_t reserved6;
38 } mblk_t;
39 
40 typedef struct datab {
41  unsigned char *db_base;
42  unsigned char *db_lim;
43  void (*db_freefn)(void *);
44  int db_ref;
45 } dblk_t;
46 
47 typedef struct _queue {
48  mblk_t _q_stopper;
49  int q_mcount; /*number of packet in the q */
50 } queue_t;
51 
52 typedef struct mblk_pool {
53  uint32_t nb_mblk;
54  mblk_t *pool[10];
55 } mblk_pool_t;
56 
57 /* details on reserved parameters
58 
59 reserved1 32bit < 32 bit timestamp >
60 
61 reserved2 32bit < 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8>
62 -> marker bit X
63 -> duplicate packet X
64 -> bit3 - no image resizer X
65 -> payload size X X X X X X X
66 -> video rotation X X X X X X X
67 -> precious flag bit X
68 -> PLC flag bit X X
69 -> screen sharing image X
70 -> stereo bit X
71 -> CSEQ bits X X X X X X X X X X X X X X X X
72 
73 reserved3 32bit < 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8>
74 -> rate - 19 bits X X X X X X X X X X X X X X X X X X X
75 -> VIDEO width X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
76 
77 reserved4 32bit < 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8>
78 -> VIDEO height X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
79 
80 reserved5 32bit < 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8>
81 -> VIDEO format X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
82 
83 reserved6 32bit < 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 8>
84 -> SSRC X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X X
85 
86  */
87 
88 #define mblk_set_timestamp_info(m, ts) (m)->reserved1 = (ts);
89 #define mblk_get_timestamp_info(m) ((m)->reserved1)
90 #define mblk_set_marker_info(m, bit) (m)->reserved2 = ((m)->reserved2 | bit)
91 #define mblk_get_marker_info(m) ((m)->reserved2 & 0x1)
92 #define mblk_set_duplicate_packet(m, bit) (m)->reserved2 = ((m)->reserved2 | (bit) << 1) /* this BIT is used in a-oRTP turn.c*/
93 #define mblk_get_duplicate_packet(m) (((m)->reserved2 >> 1) & 0x1) /* this BIT is used in a-oRTP turn.c*/
94 #define mblk_set_bit3unused(m, bit) (m)->reserved2 = ((m)->reserved2 | (bit & 0x1) << 2)
95 #define mblk_get_bit3unused(m) (((m)->reserved2 >> 2) & 0x1)
96 #define mblk_set_payload_type(m, bits) (m)->reserved2 = ((m)->reserved2 | (bits << 3))
97 #define mblk_get_payload_type(m) (((m)->reserved2 >> 3) & 0x7F)
98 #define mblk_set_rotation_deg(m, bits) (m)->reserved2 = ((m)->reserved2 | (bits << 3))
99 #define mblk_get_rotation_deg(m) (((m)->reserved2 >> 3) & 0x7F)
100 #define mblk_set_precious_flag(m, bit) (m)->reserved2 = (m)->reserved2 | ((bit & 0x1) << 10) /*use to prevent mirroring*/
101 #define mblk_get_precious_flag(m) (((m)->reserved2) >> 10 & 0x1)
102 #define mblk_set_plc(m, value) (m)->reserved2 = (m)->reserved2 | (((value) &0x3) << 11) /* value = offset of FEC message */
103 #define mblk_get_plc(m) (((m)->reserved2) >> 11 & 0x3)
104 #define mblk_set_screensharing(m, bit) (m)->reserved2 = ((m)->reserved2 | (bit & 0x1) << 13)
105 #define mblk_get_screensharing(m) (((m)->reserved2 >> 13) & 0x1)
106 #define mblk_set_stereo(m, bit) (m)->reserved2 = ((m)->reserved2 | (bit & 0x1) << 14)
107 #define mblk_get_stereo(m) (((m)->reserved2 >> 14) & 0x1)
108 #define mblk_set_cseq(m, value) (m)->reserved2 = (m)->reserved2 | (((value) &UINT32_C(0xFFFF)) << 16);
109 #define mblk_get_cseq(m) ((m)->reserved2 >> 16)
110 /* overlap with mblk_set_video_width :NOT USED AT THE SAME TIME */
111 #define mblk_set_rate(m, rate) (m)->reserved3 = ((m)->reserved3 | (rate & 0x5FFFF)) /* 19 bits, up to 384000 Khz */
112 #define mblk_get_rate(m) ((m)->reserved3 & 0x5FFFF)
113 
114 #define mblk_set_video_width(m, width) (m)->reserved3 = (width);
115 #define mblk_get_video_width(m) ((m)->reserved3)
116 #define mblk_set_video_height(m, height) (m)->reserved4 = (height);
117 #define mblk_get_video_height(m) ((m)->reserved4)
118 #define mblk_set_video_format(m, format) (m)->reserved5 = (format);
119 #define mblk_get_video_format(m) ((m)->reserved5)
120 #define mblk_set_ssrc(m, ssrc) (m)->reserved6 = (ssrc);
121 #define mblk_get_ssrc(m) ((m)->reserved6)
122 
123 #ifdef __cplusplus
124 extern "C" {
125 #endif
126 
127 void qinit(queue_t *q);
128 
129 void putq(queue_t *q, mblk_t *m);
130 
131 mblk_t *getq(queue_t *q);
132 
133 void insq(queue_t *q, mblk_t *emp, mblk_t *mp);
134 
135 void remq(queue_t *q, mblk_t *mp);
136 
137 mblk_t *peekq(queue_t *q);
138 
139 /* remove and free all messages in the q */
140 #define FLUSHALL 0
141 void flushq(queue_t *q, int how);
142 
143 void mblk_init(mblk_t *mp);
144 
145 /* allocates a mblk_t, that points to a datab_t, that points to a buffer of size size. */
146 mblk_t *allocb(int size, int align);
147 
148 /* allocates a mblk_t, that points to a datab_t, that points to buf; buf will be freed using freefn */
149 mblk_t *esballoc(uint8_t *buf, int size, int pri, void (*freefn)(void *));
150 
151 /* frees a mblk_t, and if the datab ref_count is 0, frees it and the buffer too */
152 void freeb(mblk_t *m);
153 
154 /* frees recursively (follow b_cont) a mblk_t, and if the datab
155 ref_count is 0, frees it and the buffer too */
156 void freemsg(mblk_t *mp);
157 
158 /* duplicates a mblk_t , buffer is not duplicated*/
159 mblk_t *dupb(mblk_t *m);
160 
161 /* duplicates a complex mblk_t, buffer is not duplicated */
162 mblk_t *dupmsg(mblk_t *m);
163 
164 /* returns the size of data of a message */
165 int msgdsize(const mblk_t *mp);
166 
167 /* concatenates all fragment of a complex message*/
168 void msgpullup(mblk_t *mp, int len);
169 
170 /* duplicates a single message, but with buffer included */
171 mblk_t *copyb(mblk_t *mp);
172 
173 /* duplicates a complex message with buffer included */
174 mblk_t *copymsg(mblk_t *mp);
175 
176 mblk_t *appendb(mblk_t *mp, const char *data, int size, bool_t pad);
177 void msgappend(mblk_t *mp, const char *data, int size, bool_t pad);
178 
179 mblk_t *concatb(mblk_t *mp, mblk_t *newm);
180 
181 #define qempty(q) (&(q)->_q_stopper == (q)->_q_stopper.b_next)
182 #define qfirst(q) ((q)->_q_stopper.b_next != &(q)->_q_stopper ? (q)->_q_stopper.b_next : NULL)
183 #define qbegin(q) ((q)->_q_stopper.b_next)
184 #define qlast(q) ((q)->_q_stopper.b_prev != &(q)->_q_stopper ? (q)->_q_stopper.b_prev : NULL)
185 #define qend(q, mp) ((mp) == &(q)->_q_stopper)
186 #define qnext(q, mp) ((mp)->b_next)
187 
188 typedef struct _msgb_allocator {
189  queue_t q;
191 
192 void msgb_allocator_init(msgb_allocator_t *pa);
193 mblk_t *msgb_allocator_alloc(msgb_allocator_t *pa, int size);
194 void msgb_allocator_uninit(msgb_allocator_t *pa);
195 
196 void ortp_pool_freemsg(mblk_pool_t *bpool);
197 mblk_t *ortp_pool_getmsg(mblk_pool_t *bpool, int size);
198 
199 #ifdef __cplusplus
200 }
201 #endif
202 
203 #endif
Definition: str_utils.h:188
Definition: str_utils.h:47
Definition: str_utils.h:40
Definition: str_utils.h:52
Definition: str_utils.h:25