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 /* A frame of data read used to communicate between 
24    between channels and applications */
25 struct ast_frame {
26         int frametype;                          /* Kind of frame */
27         int subclass;                           /* Subclass, frame dependent */
28         int datalen;                            /* Length of data */
29         int timelen;                            /* Amount of time associated with this frame */
30         int mallocd;                            /* Was the data malloc'd?  i.e. should we
31                                                                    free it when we discard the frame? */
32         int offset;                                     /* How far into "data" the data really starts */
33         char *src;                                      /* Optional source of frame for debugging */
34         void *data;                                     /* Pointer to actual data */
35 };
36
37 struct ast_frame_chain {
38         /* XXX Should ast_frame chain's be just prt of frames, i.e. should they just link? XXX */
39         struct ast_frame *fr;
40         struct ast_frame_chain *next;
41 };
42
43 #define AST_FRIENDLY_OFFSET     64              /* It's polite for a a new frame to
44                                                                                    have at least this number of bytes
45                                                                                    of offset before your real frame data
46                                                                                    so that additional headers can be
47                                                                                    added. */
48
49 #define AST_MALLOCD_HDR         (1 << 0)        /* Need the header be free'd? */
50 #define AST_MALLOCD_DATA        (1 << 1)        /* Need the data be free'd? */
51 #define AST_MALLOCD_SRC         (1 << 2)        /* Need the source be free'd? (haha!) */
52
53 /* Frame types */
54 #define AST_FRAME_DTMF          1               /* A DTMF digit, subclass is the digit */
55 #define AST_FRAME_VOICE         2               /* Voice data, subclass is AST_FORMAT_* */
56 #define AST_FRAME_VIDEO         3               /* Video frame, maybe?? :) */
57 #define AST_FRAME_CONTROL       4               /* A control frame, subclass is AST_CONTROL_* */
58 #define AST_FRAME_NULL          5               /* An empty, useless frame */
59 #define AST_FRAME_IAX           6               /* Inter Aterisk Exchange private frame type */
60 #define AST_FRAME_TEXT          7               /* Text messages */
61 #define AST_FRAME_IMAGE         8               /* Image Frames */
62
63 /* Data formats for capabilities and frames alike */
64 #define AST_FORMAT_G723_1       (1 << 0)        /* G.723.1 compression */
65 #define AST_FORMAT_GSM          (1 << 1)        /* GSM compression */
66 #define AST_FORMAT_ULAW         (1 << 2)        /* Raw mu-law data (G.711) */
67 #define AST_FORMAT_ALAW         (1 << 3)        /* Raw A-law data (G.711) */
68 #define AST_FORMAT_MP3          (1 << 4)        /* MPEG-2 layer 3 */
69 #define AST_FORMAT_ADPCM        (1 << 5)        /* ADPCM (whose?) */
70 #define AST_FORMAT_SLINEAR      (1 << 6)        /* Raw 16-bit Signed Linear (8000 Hz) PCM */
71 #define AST_FORMAT_LPC10        (1 << 7)        /* LPC10, 180 samples/frame */
72 #define AST_FORMAT_MAX_AUDIO (1 << 15)  /* Maximum audio format */
73 #define AST_FORMAT_JPEG         (1 << 16)       /* JPEG Images */
74 #define AST_FORMAT_PNG          (1 << 17)       /* PNG Images */
75 #define AST_FORMAT_H261         (1 << 18)       /* H.261 Video */
76 #define AST_FORMAT_H263         (1 << 19)       /* H.263 Video */
77
78 /* Control frame types */
79 #define AST_CONTROL_HANGUP              1                       /* Other end has hungup */
80 #define AST_CONTROL_RING                2                       /* Local ring */
81 #define AST_CONTROL_RINGING     3                       /* Remote end is ringing */
82 #define AST_CONTROL_ANSWER              4                       /* Remote end has answered */
83 #define AST_CONTROL_BUSY                5                       /* Remote end is busy */
84 #define AST_CONTROL_TAKEOFFHOOK 6                       /* Make it go off hook */
85 #define AST_CONTROL_OFFHOOK             7                       /* Line is off hook */
86 #define AST_CONTROL_CONGESTION  8                       /* Congestion (circuits busy) */
87
88 /* Request a frame be allocated.  source is an optional source of the frame, 
89    len is the requested length, or "0" if the caller will supply the buffer */
90 struct ast_frame *ast_fralloc(char *source, int len);
91
92 /* Free a frame, and the memory it used if applicable */
93 void ast_frfree(struct ast_frame *fr);
94
95 /* Take a frame, and if it's not been malloc'd, make a malloc'd copy
96    and if the data hasn't been malloced then make the
97    data malloc'd.  If you need to store frames, say for queueing, then
98    you should call this function. */
99 struct ast_frame *ast_frisolate(struct ast_frame *fr);
100
101 /* Dupliates a frame -- should only rarely be used, typically frisolate is
102    good enough */
103 struct ast_frame *ast_frdup(struct ast_frame *fr);
104
105 void ast_frchain(struct ast_frame_chain *fc);
106
107 /* Read a frame from a stream or packet fd, as written by fd_write */
108 struct ast_frame *ast_fr_fdread(int fd);
109
110 /* Write a frame to an fd */
111 int ast_fr_fdwrite(int fd, struct ast_frame *frame);
112
113 /* Get a format by its name */
114 extern int ast_getformatbyname(char *name);
115
116 #if defined(__cplusplus) || defined(c_plusplus)
117 }
118 #endif
119
120
121 #endif