Version 0.1.8 from FTP
[asterisk/asterisk.git] / include / asterisk / frame.h
1 /*
2  * Asterisk -- A telephony toolkit for Linux.
3  *
4  * Asterisk internal frame definitions.
5  * 
6  * Copyright (C) 1999, Mark Spencer
7  *
8  * Mark Spencer <markster@linux-support.net>
9  *
10  * This program is free software, distributed under the terms of
11  * the GNU Lesser General Public License.  Other components of
12  * Asterisk are distributed under The GNU General Public License
13  * only.
14  */
15
16 #ifndef _ASTERISK_FRAME_H
17 #define _ASTERISK_FRAME_H
18
19 #if defined(__cplusplus) || defined(c_plusplus)
20 extern "C" {
21 #endif
22
23 #include <endian.h>
24 #include <sys/types.h>
25
26 /* A frame of data read used to communicate between 
27    between channels and applications */
28 struct ast_frame {
29         int frametype;                          /* Kind of frame */
30         int subclass;                           /* Subclass, frame dependent */
31         int datalen;                            /* Length of data */
32         int timelen;                            /* Amount of time associated with this frame */
33         int mallocd;                            /* Was the data malloc'd?  i.e. should we
34                                                                    free it when we discard the frame? */
35         int offset;                                     /* How far into "data" the data really starts */
36         char *src;                                      /* Optional source of frame for debugging */
37         void *data;                                     /* Pointer to actual data */
38 };
39
40 struct ast_frame_chain {
41         /* XXX Should ast_frame chain's be just prt of frames, i.e. should they just link? XXX */
42         struct ast_frame *fr;
43         struct ast_frame_chain *next;
44 };
45
46 #define AST_FRIENDLY_OFFSET     64              /* It's polite for a a new frame to
47                                                                                    have at least this number of bytes
48                                                                                    of offset before your real frame data
49                                                                                    so that additional headers can be
50                                                                                    added. */
51
52 #define AST_MALLOCD_HDR         (1 << 0)        /* Need the header be free'd? */
53 #define AST_MALLOCD_DATA        (1 << 1)        /* Need the data be free'd? */
54 #define AST_MALLOCD_SRC         (1 << 2)        /* Need the source be free'd? (haha!) */
55
56 /* Frame types */
57 #define AST_FRAME_DTMF          1               /* A DTMF digit, subclass is the digit */
58 #define AST_FRAME_VOICE         2               /* Voice data, subclass is AST_FORMAT_* */
59 #define AST_FRAME_VIDEO         3               /* Video frame, maybe?? :) */
60 #define AST_FRAME_CONTROL       4               /* A control frame, subclass is AST_CONTROL_* */
61 #define AST_FRAME_NULL          5               /* An empty, useless frame */
62 #define AST_FRAME_IAX           6               /* Inter Aterisk Exchange private frame type */
63 #define AST_FRAME_TEXT          7               /* Text messages */
64 #define AST_FRAME_IMAGE         8               /* Image Frames */
65
66 /* Data formats for capabilities and frames alike */
67 #define AST_FORMAT_G723_1       (1 << 0)        /* G.723.1 compression */
68 #define AST_FORMAT_GSM          (1 << 1)        /* GSM compression */
69 #define AST_FORMAT_ULAW         (1 << 2)        /* Raw mu-law data (G.711) */
70 #define AST_FORMAT_ALAW         (1 << 3)        /* Raw A-law data (G.711) */
71 #define AST_FORMAT_MP3          (1 << 4)        /* MPEG-2 layer 3 */
72 #define AST_FORMAT_ADPCM        (1 << 5)        /* ADPCM (whose?) */
73 #define AST_FORMAT_SLINEAR      (1 << 6)        /* Raw 16-bit Signed Linear (8000 Hz) PCM */
74 #define AST_FORMAT_LPC10        (1 << 7)        /* LPC10, 180 samples/frame */
75 #define AST_FORMAT_MAX_AUDIO (1 << 15)  /* Maximum audio format */
76 #define AST_FORMAT_JPEG         (1 << 16)       /* JPEG Images */
77 #define AST_FORMAT_PNG          (1 << 17)       /* PNG Images */
78 #define AST_FORMAT_H261         (1 << 18)       /* H.261 Video */
79 #define AST_FORMAT_H263         (1 << 19)       /* H.263 Video */
80
81 /* Control frame types */
82 #define AST_CONTROL_HANGUP              1                       /* Other end has hungup */
83 #define AST_CONTROL_RING                2                       /* Local ring */
84 #define AST_CONTROL_RINGING     3                       /* Remote end is ringing */
85 #define AST_CONTROL_ANSWER              4                       /* Remote end has answered */
86 #define AST_CONTROL_BUSY                5                       /* Remote end is busy */
87 #define AST_CONTROL_TAKEOFFHOOK 6                       /* Make it go off hook */
88 #define AST_CONTROL_OFFHOOK             7                       /* Line is off hook */
89 #define AST_CONTROL_CONGESTION  8                       /* Congestion (circuits busy) */
90 #define AST_CONTROL_FLASH               9                       /* Flash hook */
91 #define AST_CONTROL_WINK                10                      /* Wink */
92 #define AST_CONTROL_OPTION              11                      /* Set a low-level option */
93
94 /* Option identifiers and flags */
95 #define AST_OPTION_FLAG_REQUEST         0
96 #define AST_OPTION_FLAG_ACCEPT          1
97 #define AST_OPTION_FLAG_REJECT          2
98 #define AST_OPTION_FLAG_QUERY           4
99 #define AST_OPTION_FLAG_ANSWER          5
100 #define AST_OPTION_FLAG_WTF                     6
101
102 #define AST_OPTION_TONE_VERIFY          1               /* Verify touchtones by muting audio
103                                                                                            transmission (and reception) and
104                                                                                            verify the tone is still present */
105
106 struct ast_option_header {
107         /* Always keep in network byte order */
108 #if __BYTE_ORDER == __BIG_ENDIAN
109         u_int16_t flag:3;
110         u_int16_t option:13;
111 #else
112 #if __BYTE_ORDER == __LITTLE_ENDIAN
113         u_int16_t option:13;
114         u_int16_t flag:3;
115 #else
116 #error Byte order not defined
117 #endif
118 #endif
119                 u_int8_t data[0];
120 };
121
122 /* Request a frame be allocated.  source is an optional source of the frame, 
123    len is the requested length, or "0" if the caller will supply the buffer */
124 struct ast_frame *ast_fralloc(char *source, int len);
125
126 /* Free a frame, and the memory it used if applicable */
127 void ast_frfree(struct ast_frame *fr);
128
129 /* Take a frame, and if it's not been malloc'd, make a malloc'd copy
130    and if the data hasn't been malloced then make the
131    data malloc'd.  If you need to store frames, say for queueing, then
132    you should call this function. */
133 struct ast_frame *ast_frisolate(struct ast_frame *fr);
134
135 /* Dupliates a frame -- should only rarely be used, typically frisolate is
136    good enough */
137 struct ast_frame *ast_frdup(struct ast_frame *fr);
138
139 void ast_frchain(struct ast_frame_chain *fc);
140
141 /* Read a frame from a stream or packet fd, as written by fd_write */
142 struct ast_frame *ast_fr_fdread(int fd);
143
144 /* Write a frame to an fd */
145 int ast_fr_fdwrite(int fd, struct ast_frame *frame);
146
147 /* Send a hangup (NULL equivalent) on an fd */
148 int ast_fr_fdhangup(int fd);
149
150 /* Get a format by its name */
151 extern int ast_getformatbyname(char *name);
152
153 #if defined(__cplusplus) || defined(c_plusplus)
154 }
155 #endif
156
157
158 #endif