1 /* $Id$ */
2 /*
3  * Copyright (C) 2011-2011 Teluu Inc. (http://www.teluu.com)
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program 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
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
18  */
19 #ifndef __PJMEDIA_SIGNATURES_H__
20 #define __PJMEDIA_SIGNATURES_H__
21 
22 /**
23  * @file pjmedia/signatures.h
24  * @brief Standard PJMEDIA object signatures
25  */
26 #include <pjmedia/types.h>
27 
28 PJ_BEGIN_DECL
29 
30 /**
31  * @defgroup PJMEDIA_SIG Object Signatures
32  * @ingroup PJMEDIA_BASE
33  * @brief Standard PJMEDIA object signatures
34  * @{
35  *
36  * Object signature is a 32-bit integral value similar to FOURCC to help
37  * identify PJMEDIA objects such as media ports, transports, codecs, etc.
38  * There are several uses of this signature, for example a media port can
39  * use the port object signature to verify that the given port instance
40  * is the one that it created, and a receiver of \ref PJMEDIA_EVENT can
41  * use the signature of the publisher to know which object emitted the
42  * event.
43  *
44  * The 32-bit value of an object signature is generated by the following
45  * macro:
46  *
47  * \verbatim
48    #define PJMEDIA_SIGNATURE(a,b,c,d)	(a<<24 | b<<16 | c<<8 | d)
49  * \endverbatim
50  *
51  * The following convention is used to maintain order to the signature
52  * values so that application can make use of it more effectively, and to
53  * avoid conflict between the values themselves. For each object type or
54  * class, a specific prefix will be assigned as signature, and a macro
55  * is created to build a signature for such object:
56  *
57  * \verbatim
58     Class               Signature  Signature creation and test macros
59     ---------------------------------------------------------------
60     Codec    		Cxxx	   PJMEDIA_SIG_CLASS_CODEC(b,c,d)
61 				   PJMEDIA_SIG_IS_CLASS_CODEC(sig)
62 
63     Audio codec 	CAxx	   PJMEDIA_SIG_CLASS_AUD_CODEC(c,d)
64 				   PJMEDIA_SIG_IS_CLASS_AUD_CODEC(sig)
65 
66     Video codec 	CVxx	   PJMEDIA_SIG_CLASS_VID_CODEC(c,d)
67 				   PJMEDIA_SIG_IS_CLASS_VID_CODEC(sig)
68 
69     Media port		Pxxx	   PJMEDIA_SIG_CLASS_PORT(b,c,d)
70 				   PJMEDIA_SIG_IS_CLASS_PORT(sig)
71 
72     Audio media port    PAxx	   PJMEDIA_SIG_CLASS_PORT_AUD(c,d)
73 				   PJMEDIA_SIG_IS_CLASS_PORT_AUD(sig)
74 
75     Video media port    PVxx	   PJMEDIA_SIG_CLASS_PORT_VID(c,d)
76 				   PJMEDIA_SIG_IS_CLASS_PORT_VID(sig)
77 
78     Video device	VDxx	   PJMEDIA_SIG_CLASS_VID_DEV(c,d)
79 				   PJMEDIA_SIG_IS_CLASS_VID_DEV(sig)
80 
81     Video other		VOxx	   PJMEDIA_SIG_CLASS_VID_OTHER(c,d)
82 				   PJMEDIA_SIG_IS_CLASS_VID_OTHER(sig)
83 
84     Application object	Axxx	   PJMEDIA_SIG_CLASS_APP(b,c,d)
85 				   PJMEDIA_SIG_IS_CLASS_APP(sig)
86 
87  * \endverbatim
88  *
89  * In addition, signatures created in application code should have lowercase
90  * letters to avoid conflict with built-in objects.
91  */
92 
93 /**
94  * Type to store object signature.
95  */
96 typedef pj_uint32_t pjmedia_obj_sig;
97 
98 /**
99  * A utility function to convert signature to four letters string.
100  *
101  * @param sig		The signature value.
102  * @param buf		Buffer to store the string, which MUST be at least
103  * 			five bytes long.
104  *
105  * @return		The string.
106  */
pjmedia_sig_name(pjmedia_obj_sig sig,char buf[])107 PJ_INLINE(const char*) pjmedia_sig_name(pjmedia_obj_sig sig, char buf[])
108 {
109     return pjmedia_fourcc_name(sig, buf);
110 }
111 
112 /**
113  * Macro to generate signature from four ASCII letters.
114  */
115 #define PJMEDIA_SIGNATURE(a,b,c,d)	PJMEDIA_FOURCC(a,b,c,d)
116 
117 /*************************************************************************
118  * Codec signature ('Cxxx'). Please keep the constant names sorted.
119  */
120 #define PJMEDIA_SIG_CLASS_CODEC(b,c,d)	PJMEDIA_SIGNATURE('C',b,c,d)
121 #define PJMEDIA_SIG_IS_CLASS_CODEC(sig)	((sig) >> 24 == 'C')
122 
123 /*************************************************************************
124  * Audio codec signatures ('CAxx'). Please keep the constant names sorted.
125  */
126 #define PJMEDIA_SIG_CLASS_AUD_CODEC(c,d) PJMEDIA_SIG_CLASS_CODEC('A',c,d)
127 #define PJMEDIA_SIG_IS_CLASS_AUD_CODEC(s) ((s)>>24=='C' && (s)>>16=='A')
128 
129 /*************************************************************************
130  * Video codec signatures ('CVxx'). Please keep the constant names sorted.
131  */
132 #define PJMEDIA_SIG_CLASS_VID_CODEC(c,d) PJMEDIA_SIG_CLASS_CODEC('V',c,d)
133 #define PJMEDIA_SIG_IS_CLASS_VID_CODEC(sig) ((s)>>24=='C' && (s)>>16=='V')
134 
135 #define PJMEDIA_SIG_VID_CODEC_FFMPEG	PJMEDIA_SIG_CLASS_VID_CODEC('F','F')
136 
137 /*************************************************************************
138  * Port signatures ('Pxxx'). Please keep the constant names sorted.
139  */
140 #define PJMEDIA_SIG_CLASS_PORT(b,c,d)	PJMEDIA_SIGNATURE('P',b,c,d)
141 #define PJMEDIA_SIG_IS_CLASS_PORT(sig)	((sig) >> 24 == 'P')
142 
143 /*************************************************************************
144  * Audio ports signatures ('PAxx'). Please keep the constant names sorted.
145  */
146 #define PJMEDIA_SIG_CLASS_PORT_AUD(c,d)	PJMEDIA_SIG_CLASS_PORT('A',c,d)
147 #define PJMEDIA_SIG_IS_CLASS_PORT_AUD(s) ((s)>>24=='P' && (s)>>16=='A')
148 
149 #define PJMEDIA_SIG_PORT_BIDIR		PJMEDIA_SIG_CLASS_PORT_AUD('B','D')
150 #define PJMEDIA_SIG_PORT_CONF		PJMEDIA_SIG_CLASS_PORT_AUD('C','F')
151 #define PJMEDIA_SIG_PORT_CONF_PASV	PJMEDIA_SIG_CLASS_PORT_AUD('C','P')
152 #define PJMEDIA_SIG_PORT_CONF_SWITCH	PJMEDIA_SIG_CLASS_PORT_AUD('C','S')
153 #define PJMEDIA_SIG_PORT_ECHO		PJMEDIA_SIG_CLASS_PORT_AUD('E','C')
154 #define PJMEDIA_SIG_PORT_MEM_CAPTURE	PJMEDIA_SIG_CLASS_PORT_AUD('M','C')
155 #define PJMEDIA_SIG_PORT_MEM_PLAYER	PJMEDIA_SIG_CLASS_PORT_AUD('M','P')
156 #define PJMEDIA_SIG_PORT_NULL		PJMEDIA_SIG_CLASS_PORT_AUD('N','U')
157 #define PJMEDIA_SIG_PORT_RESAMPLE	PJMEDIA_SIG_CLASS_PORT_AUD('R','E')
158 #define PJMEDIA_SIG_PORT_SPLIT_COMB	PJMEDIA_SIG_CLASS_PORT_AUD('S','C')
159 #define PJMEDIA_SIG_PORT_SPLIT_COMB_P	PJMEDIA_SIG_CLASS_PORT_AUD('S','P')
160 #define PJMEDIA_SIG_PORT_STEREO		PJMEDIA_SIG_CLASS_PORT_AUD('S','R')
161 #define PJMEDIA_SIG_PORT_STREAM		PJMEDIA_SIG_CLASS_PORT_AUD('S','T')
162 #define PJMEDIA_SIG_PORT_TONEGEN	PJMEDIA_SIG_CLASS_PORT_AUD('T','O')
163 #define PJMEDIA_SIG_PORT_WAV_PLAYER	PJMEDIA_SIG_CLASS_PORT_AUD('W','P')
164 #define PJMEDIA_SIG_PORT_WAV_PLAYLIST	PJMEDIA_SIG_CLASS_PORT_AUD('W','Y')
165 #define PJMEDIA_SIG_PORT_WAV_WRITER	PJMEDIA_SIG_CLASS_PORT_AUD('W','W')
166 
167 
168 /*************************************************************************
169  * Video ports signatures ('PVxx'). Please keep the constant names sorted.
170  */
171 #define PJMEDIA_SIG_CLASS_PORT_VID(c,d)	PJMEDIA_SIG_CLASS_PORT('V',c,d)
172 #define PJMEDIA_SIG_IS_CLASS_PORT_VID(s) ((s)>>24=='P' && (s)>>16=='V')
173 
174 /** AVI player signature. */
175 #define PJMEDIA_SIG_PORT_VID_AVI_PLAYER	PJMEDIA_SIG_CLASS_PORT_VID('A','V')
176 #define PJMEDIA_SIG_PORT_VID_STREAM	PJMEDIA_SIG_CLASS_PORT_VID('S','T')
177 #define PJMEDIA_SIG_PORT_VID_TEE	PJMEDIA_SIG_CLASS_PORT_VID('T','E')
178 
179 
180 /**************************************************************************
181  * Video device signatures ('VDxx'). Please keep the constant names sorted.
182  */
183 #define PJMEDIA_SIG_CLASS_VID_DEV(c,d)	PJMEDIA_SIGNATURE('V','D',c,d)
184 #define PJMEDIA_SIG_IS_CLASS_VID_DEV(s) ((s)>>24=='V' && (s)>>16=='D')
185 
186 #define PJMEDIA_SIG_VID_DEV_COLORBAR	PJMEDIA_SIG_CLASS_VID_DEV('C','B')
187 #define PJMEDIA_SIG_VID_DEV_SDL		PJMEDIA_SIG_CLASS_VID_DEV('S','D')
188 #define PJMEDIA_SIG_VID_DEV_V4L2	PJMEDIA_SIG_CLASS_VID_DEV('V','2')
189 #define PJMEDIA_SIG_VID_DEV_DSHOW	PJMEDIA_SIG_CLASS_VID_DEV('D','S')
190 #define PJMEDIA_SIG_VID_DEV_QT		PJMEDIA_SIG_CLASS_VID_DEV('Q','T')
191 #define PJMEDIA_SIG_VID_DEV_IOS		PJMEDIA_SIG_CLASS_VID_DEV('I','P')
192 
193 
194 /*********************************************************************
195  * Other video objects ('VOxx'). Please keep the constant names sorted.
196  */
197 #define PJMEDIA_SIG_CLASS_VID_OTHER(c,d) PJMEDIA_SIGNATURE('V','O',c,d)
198 #define PJMEDIA_SIG_IS_CLASS_VID_OTHER(s) ((s)>>24=='V' && (s)>>16=='O')
199 
200 #define PJMEDIA_SIG_VID_CONF		PJMEDIA_SIG_CLASS_VID_OTHER('C','F')
201 #define PJMEDIA_SIG_VID_PORT		PJMEDIA_SIG_CLASS_VID_OTHER('P','O')
202 
203 
204 /*********************************************************************
205  * Application class ('Axxx').
206  */
207 #define PJMEDIA_SIG_CLASS_APP(b,c,d)	PJMEDIA_SIGNATURE('A',b,c,d)
208 #define PJMEDIA_SIG_IS_CLASS_APP(s)	((s)>>24=='A')
209 
210 
211 /**
212  * @}  PJSIP_MSG
213  */
214 
215 
216 PJ_END_DECL
217 
218 #endif	/* __PJMEDIA_SIGNATURES_H__ */
219