aboutsummaryrefslogtreecommitdiffstats
path: root/include/asterisk/frame.h
blob: 536f83c040ce9ca132714d26e1bac45dbf5a6ce0 (plain)
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
/*
 * Asterisk -- A telephony toolkit for Linux.
 *
 * Asterisk internal frame definitions.
 * 
 * Copyright (C) 1999, Mark Spencer
 *
 * Mark Spencer <markster@linux-support.net>
 *
 * This program is free software, distributed under the terms of
 * the GNU Lesser General Public License.  Other components of
 * Asterisk are distributed under The GNU General Public License
 * only.
 */

#ifndef _ASTERISK_FRAME_H
#define _ASTERISK_FRAME_H

#if defined(__cplusplus) || defined(c_plusplus)
extern "C" {
#endif

#include <endian.h>
#include <sys/types.h>

/* A frame of data read used to communicate between 
   between channels and applications */
struct ast_frame {
	int frametype;				/* Kind of frame */
	int subclass;				/* Subclass, frame dependent */
	int datalen;				/* Length of data */
	int timelen;				/* Amount of time associated with this frame */
	int mallocd;				/* Was the data malloc'd?  i.e. should we
								   free it when we discard the frame? */
	int offset;					/* How far into "data" the data really starts */
	char *src;					/* Optional source of frame for debugging */
	void *data;					/* Pointer to actual data */
	struct ast_frame *prev;		/* Next/Prev for linking stand alone frames */
	struct ast_frame *next;		/* Next/Prev for linking stand alone frames */
								/* Unused except if debugging is turned on, but left
								   in the struct so that it can be turned on without
								   requiring a recompile of the whole thing */
};

struct ast_frame_chain {
	/* XXX Should ast_frame chain's be just prt of frames, i.e. should they just link? XXX */
	struct ast_frame *fr;
	struct ast_frame_chain *next;
};

#define AST_FRIENDLY_OFFSET 	64		/* It's polite for a a new frame to
										   have at least this number of bytes
										   of offset before your real frame data
										   so that additional headers can be
										   added. */

#define AST_MALLOCD_HDR		(1 << 0)	/* Need the header be free'd? */
#define AST_MALLOCD_DATA	(1 << 1)	/* Need the data be free'd? */
#define AST_MALLOCD_SRC		(1 << 2)	/* Need the source be free'd? (haha!) */

/* Frame types */
#define AST_FRAME_DTMF		1		/* A DTMF digit, subclass is the digit */
#define AST_FRAME_VOICE		2		/* Voice data, subclass is AST_FORMAT_* */
#define AST_FRAME_VIDEO		3		/* Video frame, maybe?? :) */
#define AST_FRAME_CONTROL	4		/* A control frame, subclass is AST_CONTROL_* */
#define AST_FRAME_NULL		5		/* An empty, useless frame */
#define AST_FRAME_IAX		6		/* Inter Aterisk Exchange private frame type */
#define AST_FRAME_TEXT		7		/* Text messages */
#define AST_FRAME_IMAGE		8		/* Image Frames */
#define AST_FRAME_HTML		9		/* HTML Frame */

/* HTML subclasses */
#define AST_HTML_URL		1		/* Sending a URL */
#define AST_HTML_DATA		2		/* Data frame */
#define AST_HTML_BEGIN		4		/* Beginning frame */
#define AST_HTML_END		8		/* End frame */
#define AST_HTML_LDCOMPLETE	16		/* Load is complete */
#define AST_HTML_NOSUPPORT	17		/* Peer is unable to support HTML */
#define AST_HTML_LINKURL	18		/* Send URL, and track */

/* Data formats for capabilities and frames alike */
#define AST_FORMAT_G723_1	(1 << 0)	/* G.723.1 compression */
#define AST_FORMAT_GSM		(1 << 1)	/* GSM compression */
#define AST_FORMAT_ULAW		(1 << 2)	/* Raw mu-law data (G.711) */
#define AST_FORMAT_ALAW		(1 << 3)	/* Raw A-law data (G.711) */
#define AST_FORMAT_MP3		(1 << 4)	/* MPEG-2 layer 3 */
#define AST_FORMAT_ADPCM	(1 << 5)	/* ADPCM (whose?) */
#define AST_FORMAT_SLINEAR	(1 << 6)	/* Raw 16-bit Signed Linear (8000 Hz) PCM */
#define AST_FORMAT_LPC10	(1 << 7)	/* LPC10, 180 samples/frame */
#define AST_FORMAT_MAX_AUDIO (1 << 15)	/* Maximum audio format */
#define AST_FORMAT_JPEG		(1 << 16)	/* JPEG Images */
#define AST_FORMAT_PNG		(1 << 17)	/* PNG Images */
#define AST_FORMAT_H261		(1 << 18)	/* H.261 Video */
#define AST_FORMAT_H263		(1 << 19)	/* H.263 Video */

/* Control frame types */
#define AST_CONTROL_HANGUP		1			/* Other end has hungup */
#define AST_CONTROL_RING		2			/* Local ring */
#define AST_CONTROL_RINGING 	3			/* Remote end is ringing */
#define AST_CONTROL_ANSWER		4			/* Remote end has answered */
#define AST_CONTROL_BUSY		5			/* Remote end is busy */
#define AST_CONTROL_TAKEOFFHOOK 6			/* Make it go off hook */
#define AST_CONTROL_OFFHOOK		7			/* Line is off hook */
#define AST_CONTROL_CONGESTION	8			/* Congestion (circuits busy) */
#define AST_CONTROL_FLASH		9			/* Flash hook */
#define AST_CONTROL_WINK		10			/* Wink */
#define AST_CONTROL_OPTION		11			/* Set a low-level option */

/* Option identifiers and flags */
#define AST_OPTION_FLAG_REQUEST		0
#define AST_OPTION_FLAG_ACCEPT		1
#define AST_OPTION_FLAG_REJECT		2
#define AST_OPTION_FLAG_QUERY		4
#define AST_OPTION_FLAG_ANSWER		5
#define AST_OPTION_FLAG_WTF			6

#define AST_OPTION_TONE_VERIFY		1		/* Verify touchtones by muting audio
											   transmission (and reception) and
											   verify the tone is still present */

struct ast_option_header {
	/* Always keep in network byte order */
#if __BYTE_ORDER == __BIG_ENDIAN
        u_int16_t flag:3;
        u_int16_t option:13;
#else
#if __BYTE_ORDER == __LITTLE_ENDIAN
        u_int16_t option:13;
        u_int16_t flag:3;
#else
#error Byte order not defined
#endif
#endif
		u_int8_t data[0];
};

/* Request a frame be allocated.  source is an optional source of the frame, 
   len is the requested length, or "0" if the caller will supply the buffer */
struct ast_frame *ast_fralloc(char *source, int len);

/* Free a frame, and the memory it used if applicable */
void ast_frfree(struct ast_frame *fr);

/* Take a frame, and if it's not been malloc'd, make a malloc'd copy
   and if the data hasn't been malloced then make the
   data malloc'd.  If you need to store frames, say for queueing, then
   you should call this function. */
struct ast_frame *ast_frisolate(struct ast_frame *fr);

/* Dupliates a frame -- should only rarely be used, typically frisolate is
   good enough */
struct ast_frame *ast_frdup(struct ast_frame *fr);

void ast_frchain(struct ast_frame_chain *fc);

/* Read a frame from a stream or packet fd, as written by fd_write */
struct ast_frame *ast_fr_fdread(int fd);

/* Write a frame to an fd */
int ast_fr_fdwrite(int fd, struct ast_frame *frame);

/* Send a hangup (NULL equivalent) on an fd */
int ast_fr_fdhangup(int fd);

/* Get a format by its name */
extern int ast_getformatbyname(char *name);

/* Choose the best codec...  Uhhh...   Yah. */
extern int ast_best_codec(int fmts);

#if defined(__cplusplus) || defined(c_plusplus)
}
#endif


#endif