Asterisk - The Open Source Telephony Project GIT-master-a63eec2
Loading...
Searching...
No Matches
Data Structures | Macros | Functions | Variables
format_g726.c File Reference

Headerless G.726 (16/24/32/40kbps) data format for Asterisk. More...

#include "asterisk.h"
#include "asterisk/mod_format.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"
#include "asterisk/format_cache.h"
Include dependency graph for format_g726.c:

Go to the source code of this file.

Data Structures

struct  g726_desc
 

Macros

#define BUF_SIZE   (5*FRAME_TIME) /* max frame size in bytes ? */
 
#define FRAME_TIME   10 /* 10 ms size */
 
#define RATE_16   3
 
#define RATE_24   2
 
#define RATE_32   1
 
#define RATE_40   0
 

Functions

static void __reg_module (void)
 
static void __unreg_module (void)
 
struct ast_moduleAST_MODULE_SELF_SYM (void)
 
static int g726_16_open (struct ast_filestream *s)
 
static int g726_16_rewrite (struct ast_filestream *s, const char *comment)
 
static int g726_24_open (struct ast_filestream *s)
 
static int g726_24_rewrite (struct ast_filestream *s, const char *comment)
 
static int g726_32_open (struct ast_filestream *s)
 
static int g726_32_rewrite (struct ast_filestream *s, const char *comment)
 
static int g726_40_open (struct ast_filestream *s)
 
static int g726_40_rewrite (struct ast_filestream *s, const char *comment)
 
static int g726_open (struct ast_filestream *tmp, int rate)
 
static struct ast_frameg726_read (struct ast_filestream *s, int *whennext)
 
static int g726_seek (struct ast_filestream *fs, off_t sample_offset, int whence)
 
static off_t g726_tell (struct ast_filestream *fs)
 
static int g726_trunc (struct ast_filestream *fs)
 
static int g726_write (struct ast_filestream *s, struct ast_frame *f)
 
static int load_module (void)
 
static int unload_module (void)
 

Variables

static struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Raw G.726 (16/24/32/40kbps) data" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND }
 
static const struct ast_module_infoast_module_info = &__mod_info
 
static struct ast_format_def f_def []
 
static int frame_size [4]
 

Detailed Description

Headerless G.726 (16/24/32/40kbps) data format for Asterisk.

File name extensions:

Definition in file format_g726.c.

Macro Definition Documentation

◆ BUF_SIZE

#define BUF_SIZE   (5*FRAME_TIME) /* max frame size in bytes ? */

Definition at line 50 of file format_g726.c.

◆ FRAME_TIME

#define FRAME_TIME   10 /* 10 ms size */

Definition at line 48 of file format_g726.c.

◆ RATE_16

#define RATE_16   3

Definition at line 45 of file format_g726.c.

◆ RATE_24

#define RATE_24   2

Definition at line 44 of file format_g726.c.

◆ RATE_32

#define RATE_32   1

Definition at line 43 of file format_g726.c.

◆ RATE_40

#define RATE_40   0

Definition at line 42 of file format_g726.c.

Function Documentation

◆ __reg_module()

static void __reg_module ( void  )
static

Definition at line 289 of file format_g726.c.

◆ __unreg_module()

static void __unreg_module ( void  )
static

Definition at line 289 of file format_g726.c.

◆ AST_MODULE_SELF_SYM()

struct ast_module * AST_MODULE_SELF_SYM ( void  )

Definition at line 289 of file format_g726.c.

◆ g726_16_open()

static int g726_16_open ( struct ast_filestream s)
static

Definition at line 89 of file format_g726.c.

90{
91 return g726_open(s, RATE_16);
92}
#define RATE_16
Definition format_g726.c:45
static int g726_open(struct ast_filestream *tmp, int rate)
Definition format_g726.c:66

References g726_open(), and RATE_16.

◆ g726_16_rewrite()

static int g726_16_rewrite ( struct ast_filestream s,
const char *  comment 
)
static

Definition at line 109 of file format_g726.c.

110{
111 return g726_open(s, RATE_16);
112}

References g726_open(), and RATE_16.

◆ g726_24_open()

static int g726_24_open ( struct ast_filestream s)
static

Definition at line 84 of file format_g726.c.

85{
86 return g726_open(s, RATE_24);
87}
#define RATE_24
Definition format_g726.c:44

References g726_open(), and RATE_24.

◆ g726_24_rewrite()

static int g726_24_rewrite ( struct ast_filestream s,
const char *  comment 
)
static

Definition at line 104 of file format_g726.c.

105{
106 return g726_open(s, RATE_24);
107}

References g726_open(), and RATE_24.

◆ g726_32_open()

static int g726_32_open ( struct ast_filestream s)
static

Definition at line 79 of file format_g726.c.

80{
81 return g726_open(s, RATE_32);
82}
#define RATE_32
Definition format_g726.c:43

References g726_open(), and RATE_32.

◆ g726_32_rewrite()

static int g726_32_rewrite ( struct ast_filestream s,
const char *  comment 
)
static

Definition at line 99 of file format_g726.c.

100{
101 return g726_open(s, RATE_32);
102}

References g726_open(), and RATE_32.

◆ g726_40_open()

static int g726_40_open ( struct ast_filestream s)
static

Definition at line 74 of file format_g726.c.

75{
76 return g726_open(s, RATE_40);
77}
#define RATE_40
Definition format_g726.c:42

References g726_open(), and RATE_40.

◆ g726_40_rewrite()

static int g726_40_rewrite ( struct ast_filestream s,
const char *  comment 
)
static

Definition at line 94 of file format_g726.c.

95{
96 return g726_open(s, RATE_40);
97}

References g726_open(), and RATE_40.

◆ g726_open()

static int g726_open ( struct ast_filestream tmp,
int  rate 
)
static

Definition at line 66 of file format_g726.c.

67{
68 struct g726_desc *s = (struct g726_desc *)tmp->_private;
69 s->rate = rate;
70 ast_debug(1, "Created filestream G.726-%dk.\n", 40 - s->rate * 8);
71 return 0;
72}
#define ast_debug(level,...)
Log a DEBUG message.

References ast_filestream::_private, ast_debug, and g726_desc::rate.

Referenced by g726_16_open(), g726_16_rewrite(), g726_24_open(), g726_24_rewrite(), g726_32_open(), g726_32_rewrite(), g726_40_open(), and g726_40_rewrite().

◆ g726_read()

static struct ast_frame * g726_read ( struct ast_filestream s,
int *  whennext 
)
static

Definition at line 118 of file format_g726.c.

119{
120 size_t res;
121 struct g726_desc *fs = (struct g726_desc *)s->_private;
122
123 /* Send a frame from the file to the appropriate channel */
125 s->fr.samples = 8 * FRAME_TIME;
126 if ((res = fread(s->fr.data.ptr, 1, s->fr.datalen, s->f)) != s->fr.datalen) {
127 if (res) {
128 ast_log(LOG_WARNING, "Short read of %s data (expected %d bytes, read %zu): %s\n",
130 strerror(errno));
131 }
132 return NULL;
133 }
134 *whennext = s->fr.samples;
135 return &s->fr;
136}
#define ast_log
Definition astobj2.c:42
const char * ast_format_get_name(const struct ast_format *format)
Get the name associated with a format.
Definition format.c:334
#define FRAME_TIME
Definition format_g726.c:48
static int frame_size[4]
Definition format_g726.c:52
#define AST_FRAME_SET_BUFFER(fr, _base, _ofs, _datalen)
#define AST_FRIENDLY_OFFSET
Offset into a frame's data buffer.
#define LOG_WARNING
int errno
#define NULL
Definition resample.c:96
struct ast_frame fr
frame produced by read, typically
Definition mod_format.h:122
struct ast_format * format
struct ast_frame_subclass subclass
union ast_frame::@239 data

References ast_filestream::_private, ast_format_get_name(), AST_FRAME_SET_BUFFER, AST_FRIENDLY_OFFSET, ast_log, ast_filestream::buf, ast_frame::data, ast_frame::datalen, errno, ast_filestream::f, ast_frame_subclass::format, ast_filestream::fr, frame_size, FRAME_TIME, LOG_WARNING, NULL, ast_frame::ptr, g726_desc::rate, ast_frame::samples, and ast_frame::subclass.

◆ g726_seek()

static int g726_seek ( struct ast_filestream fs,
off_t  sample_offset,
int  whence 
)
static

Definition at line 156 of file format_g726.c.

157{
158 off_t offset = 0, min = 0, cur, max, distance;
159
160 if ((cur = ftello(fs->f)) < 0) {
161 ast_log(AST_LOG_WARNING, "Unable to determine current position in g726 filestream %p: %s\n", fs, strerror(errno));
162 return -1;
163 }
164
165 if (fseeko(fs->f, 0, SEEK_END) < 0) {
166 ast_log(AST_LOG_WARNING, "Unable to seek to end of g726 filestream %p: %s\n", fs, strerror(errno));
167 return -1;
168 }
169
170 if ((max = ftello(fs->f)) < 0) {
171 ast_log(AST_LOG_WARNING, "Unable to determine max position in g726 filestream %p: %s\n", fs, strerror(errno));
172 return -1;
173 }
174
175 /* have to fudge to frame here, so not fully to sample */
176 distance = sample_offset / 2;
177 if (whence == SEEK_SET) {
178 offset = distance;
179 } else if (whence == SEEK_CUR || whence == SEEK_FORCECUR) {
180 offset = distance + cur;
181 } else if (whence == SEEK_END) {
182 offset = max - distance;
183 }
184
185 if (whence != SEEK_FORCECUR) {
186 offset = offset > max ? max : offset;
187 offset = offset < min ? min : offset;
188 }
189 return fseeko(fs->f, offset, SEEK_SET);
190}
#define min(a, b)
Definition f2c.h:197
#define max(a, b)
Definition f2c.h:198
#define SEEK_FORCECUR
Definition file.h:51
#define AST_LOG_WARNING

References ast_log, AST_LOG_WARNING, errno, ast_filestream::f, max, min, and SEEK_FORCECUR.

◆ g726_tell()

static off_t g726_tell ( struct ast_filestream fs)
static

Definition at line 197 of file format_g726.c.

198{
199 return ftello(fs->f) << 1;
200}

References ast_filestream::f.

◆ g726_trunc()

static int g726_trunc ( struct ast_filestream fs)
static

Definition at line 192 of file format_g726.c.

193{
194 return -1;
195}

◆ g726_write()

static int g726_write ( struct ast_filestream s,
struct ast_frame f 
)
static

Definition at line 138 of file format_g726.c.

139{
140 int res;
141 struct g726_desc *fs = (struct g726_desc *)s->_private;
142
143 if (f->datalen % frame_size[fs->rate]) {
144 ast_log(LOG_WARNING, "Invalid data length %d, should be multiple of %d\n",
145 f->datalen, frame_size[fs->rate]);
146 return -1;
147 }
148 if ((res = fwrite(f->data.ptr, 1, f->datalen, s->f)) != f->datalen) {
149 ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n",
150 res, frame_size[fs->rate], strerror(errno));
151 return -1;
152 }
153 return 0;
154}

References ast_filestream::_private, ast_log, ast_frame::data, ast_frame::datalen, errno, ast_filestream::f, frame_size, LOG_WARNING, ast_frame::ptr, and g726_desc::rate.

◆ load_module()

static int load_module ( void  )
static

Definition at line 269 of file format_g726.c.

270{
271 int i;
272
273 for (i = 0; f_def[i].desc_size ; i++) {
275 if (ast_format_def_register(&f_def[i])) { /* errors are fatal */
276 ast_log(LOG_WARNING, "Failed to register format %s.\n", f_def[i].name);
279 }
280 }
282}
struct ast_format * ast_format_g726
Built-in cached g726 format.
static int unload_module(void)
static struct ast_format_def f_def[]
static const char name[]
Definition format_mp3.c:68
#define ast_format_def_register(f)
Definition mod_format.h:136
@ AST_MODULE_LOAD_SUCCESS
Definition module.h:70
@ AST_MODULE_LOAD_DECLINE
Module has failed to load, may be in an inconsistent state.
Definition module.h:78
struct ast_format * format
Definition mod_format.h:48

References ast_format_def_register, ast_format_g726, ast_log, AST_MODULE_LOAD_DECLINE, AST_MODULE_LOAD_SUCCESS, ast_format_def::desc_size, f_def, ast_format_def::format, LOG_WARNING, name, and unload_module().

◆ unload_module()

static int unload_module ( void  )
static

Definition at line 258 of file format_g726.c.

259{
260 int i;
261
262 for (i = 0; f_def[i].desc_size ; i++) {
264 ast_log(LOG_WARNING, "Failed to unregister format %s.\n", f_def[i].name);
265 }
266 return(0);
267}
int ast_format_def_unregister(const char *name)
Unregisters a file format.
Definition file.c:163

References ast_format_def_unregister(), ast_log, ast_format_def::desc_size, f_def, LOG_WARNING, and name.

Referenced by load_module().

Variable Documentation

◆ __mod_info

struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_ORDER , .description = "Raw G.726 (16/24/32/40kbps) data" , .key = ASTERISK_GPL_KEY , .buildopt_sum = AST_BUILDOPT_SUM, .support_level = AST_MODULE_SUPPORT_CORE, .load = load_module, .unload = unload_module, .load_pri = AST_MODPRI_APP_DEPEND }
static

Definition at line 289 of file format_g726.c.

◆ ast_module_info

const struct ast_module_info* ast_module_info = &__mod_info
static

Definition at line 289 of file format_g726.c.

◆ f_def

struct ast_format_def f_def[]
static

Definition at line 202 of file format_g726.c.

202 {
203 {
204 .name = "g726-40",
205 .exts = "g726-40",
206 .open = g726_40_open,
207 .rewrite = g726_40_rewrite,
208 .write = g726_write,
209 .seek = g726_seek,
210 .trunc = g726_trunc,
211 .tell = g726_tell,
212 .read = g726_read,
213 .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET,
214 .desc_size = sizeof(struct g726_desc),
215 },
216 {
217 .name = "g726-32",
218 .exts = "g726-32",
219 .open = g726_32_open,
220 .rewrite = g726_32_rewrite,
221 .write = g726_write,
222 .seek = g726_seek,
223 .trunc = g726_trunc,
224 .tell = g726_tell,
225 .read = g726_read,
226 .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET,
227 .desc_size = sizeof(struct g726_desc),
228 },
229 {
230 .name = "g726-24",
231 .exts = "g726-24",
232 .open = g726_24_open,
233 .rewrite = g726_24_rewrite,
234 .write = g726_write,
235 .seek = g726_seek,
236 .trunc = g726_trunc,
237 .tell = g726_tell,
238 .read = g726_read,
239 .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET,
240 .desc_size = sizeof(struct g726_desc),
241 },
242 {
243 .name = "g726-16",
244 .exts = "g726-16",
245 .open = g726_16_open,
246 .rewrite = g726_16_rewrite,
247 .write = g726_write,
248 .seek = g726_seek,
249 .trunc = g726_trunc,
250 .tell = g726_tell,
251 .read = g726_read,
252 .buf_size = BUF_SIZE + AST_FRIENDLY_OFFSET,
253 .desc_size = sizeof(struct g726_desc),
254 },
255 { .desc_size = 0 } /* terminator */
256};
static struct ast_frame * g726_read(struct ast_filestream *s, int *whennext)
static int g726_32_open(struct ast_filestream *s)
Definition format_g726.c:79
static int g726_write(struct ast_filestream *s, struct ast_frame *f)
static int g726_40_rewrite(struct ast_filestream *s, const char *comment)
Definition format_g726.c:94
static int g726_40_open(struct ast_filestream *s)
Definition format_g726.c:74
#define BUF_SIZE
Definition format_g726.c:50
static int g726_16_open(struct ast_filestream *s)
Definition format_g726.c:89
static int g726_24_rewrite(struct ast_filestream *s, const char *comment)
static int g726_16_rewrite(struct ast_filestream *s, const char *comment)
static int g726_32_rewrite(struct ast_filestream *s, const char *comment)
Definition format_g726.c:99
static int g726_trunc(struct ast_filestream *fs)
static int g726_24_open(struct ast_filestream *s)
Definition format_g726.c:84
static off_t g726_tell(struct ast_filestream *fs)
static int g726_seek(struct ast_filestream *fs, off_t sample_offset, int whence)

Referenced by load_module(), and unload_module().

◆ frame_size

int frame_size[4]
static

Definition at line 52 of file format_g726.c.

52 {
53 FRAME_TIME * 5,
54 FRAME_TIME * 4,
55 FRAME_TIME * 3,
56 FRAME_TIME * 2
57};

Referenced by after_bridge_move_channel(), ast_websocket_read(), ast_websocket_write(), g726_read(), and g726_write().