#include "asterisk.h"
#include "asterisk/mod_format.h"
#include "asterisk/module.h"
#include "asterisk/endian.h"
Go to the source code of this file.
Data Structures | |
struct | h264_desc |
Defines | |
#define | BUF_SIZE 4096 |
Functions | |
static void | __reg_module (void) |
static void | __unreg_module (void) |
static int | h264_open (struct ast_filestream *s) |
static struct ast_frame * | h264_read (struct ast_filestream *s, int *whennext) |
static int | h264_seek (struct ast_filestream *fs, off_t sample_offset, int whence) |
static off_t | h264_tell (struct ast_filestream *fs) |
static int | h264_trunc (struct ast_filestream *fs) |
static int | h264_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_DEFAULT , .description = "Raw H.264 data" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "068e67f60f50dd9ee86464c05884a49d" , .load = load_module, .unload = unload_module, } |
static const struct ast_module_info * | ast_module_info = &__mod_info |
static struct ast_format | h264_f |
Definition in file format_h264.c.
#define BUF_SIZE 4096 |
Definition at line 40 of file format_h264.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 175 of file format_h264.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 175 of file format_h264.c.
static int h264_open | ( | struct ast_filestream * | s | ) | [static] |
Definition at line 45 of file format_h264.c.
References ast_log(), LOG_WARNING, and s.
00046 { 00047 unsigned int ts; 00048 int res; 00049 if ((res = fread(&ts, 1, sizeof(ts), s->f)) < sizeof(ts)) { 00050 ast_log(LOG_WARNING, "Empty file!\n"); 00051 return -1; 00052 } 00053 return 0; 00054 }
static struct ast_frame* h264_read | ( | struct ast_filestream * | s, | |
int * | whennext | |||
) | [static] |
Definition at line 56 of file format_h264.c.
References AST_FORMAT_H264, AST_FRAME_SET_BUFFER, AST_FRAME_VIDEO, AST_FRIENDLY_OFFSET, ast_log(), BUF_SIZE, errno, h264_desc::lastts, len(), LOG_WARNING, s, and ast_frame::ts.
00057 { 00058 int res; 00059 int mark=0; 00060 unsigned short len; 00061 unsigned int ts; 00062 struct h264_desc *fs = (struct h264_desc *)s->_private; 00063 00064 /* Send a frame from the file to the appropriate channel */ 00065 if ((res = fread(&len, 1, sizeof(len), s->f)) < 1) 00066 return NULL; 00067 len = ntohs(len); 00068 mark = (len & 0x8000) ? 1 : 0; 00069 len &= 0x7fff; 00070 if (len > BUF_SIZE) { 00071 ast_log(LOG_WARNING, "Length %d is too long\n", len); 00072 len = BUF_SIZE; /* XXX truncate */ 00073 } 00074 s->fr.frametype = AST_FRAME_VIDEO; 00075 s->fr.subclass = AST_FORMAT_H264; 00076 s->fr.mallocd = 0; 00077 AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, len); 00078 if ((res = fread(s->fr.data, 1, s->fr.datalen, s->f)) != s->fr.datalen) { 00079 if (res) 00080 ast_log(LOG_WARNING, "Short read (%d of %d) (%s)!\n", res, len, strerror(errno)); 00081 return NULL; 00082 } 00083 s->fr.samples = fs->lastts; 00084 s->fr.datalen = len; 00085 s->fr.subclass |= mark; 00086 s->fr.delivery.tv_sec = 0; 00087 s->fr.delivery.tv_usec = 0; 00088 if ((res = fread(&ts, 1, sizeof(ts), s->f)) == sizeof(ts)) { 00089 fs->lastts = ntohl(ts); 00090 *whennext = fs->lastts * 4/45; 00091 } else 00092 *whennext = 0; 00093 return &s->fr; 00094 }
static int h264_seek | ( | struct ast_filestream * | fs, | |
off_t | sample_offset, | |||
int | whence | |||
) | [static] |
static off_t h264_tell | ( | struct ast_filestream * | fs | ) | [static] |
Definition at line 143 of file format_h264.c.
References ast_filestream::f.
00144 { 00145 off_t offset = ftell(fs->f); 00146 return offset; /* XXX totally bogus, needs fixing */ 00147 }
static int h264_trunc | ( | struct ast_filestream * | fs | ) | [static] |
Definition at line 135 of file format_h264.c.
References ast_filestream::f.
00136 { 00137 /* Truncate file to current length */ 00138 if (ftruncate(fileno(fs->f), ftell(fs->f)) < 0) 00139 return -1; 00140 return 0; 00141 }
static int h264_write | ( | struct ast_filestream * | s, | |
struct ast_frame * | f | |||
) | [static] |
Definition at line 96 of file format_h264.c.
References AST_FORMAT_H264, AST_FRAME_VIDEO, ast_log(), errno, f, len(), LOG_WARNING, and s.
00097 { 00098 int res; 00099 unsigned int ts; 00100 unsigned short len; 00101 int mark; 00102 00103 if (f->frametype != AST_FRAME_VIDEO) { 00104 ast_log(LOG_WARNING, "Asked to write non-video frame!\n"); 00105 return -1; 00106 } 00107 mark = (f->subclass & 0x1) ? 0x8000 : 0; 00108 if ((f->subclass & ~0x1) != AST_FORMAT_H264) { 00109 ast_log(LOG_WARNING, "Asked to write non-h264 frame (%d)!\n", f->subclass); 00110 return -1; 00111 } 00112 ts = htonl(f->samples); 00113 if ((res = fwrite(&ts, 1, sizeof(ts), s->f)) != sizeof(ts)) { 00114 ast_log(LOG_WARNING, "Bad write (%d/4): %s\n", res, strerror(errno)); 00115 return -1; 00116 } 00117 len = htons(f->datalen | mark); 00118 if ((res = fwrite(&len, 1, sizeof(len), s->f)) != sizeof(len)) { 00119 ast_log(LOG_WARNING, "Bad write (%d/2): %s\n", res, strerror(errno)); 00120 return -1; 00121 } 00122 if ((res = fwrite(f->data, 1, f->datalen, s->f)) != f->datalen) { 00123 ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno)); 00124 return -1; 00125 } 00126 return 0; 00127 }
static int load_module | ( | void | ) | [static] |
Definition at line 163 of file format_h264.c.
References ast_format_register, AST_MODULE_LOAD_FAILURE, AST_MODULE_LOAD_SUCCESS, and h264_f.
00164 { 00165 if (ast_format_register(&h264_f)) 00166 return AST_MODULE_LOAD_FAILURE; 00167 return AST_MODULE_LOAD_SUCCESS; 00168 }
static int unload_module | ( | void | ) | [static] |
Definition at line 170 of file format_h264.c.
References ast_format_unregister(), h264_f, and ast_format::name.
00171 { 00172 return ast_format_unregister(h264_f.name); 00173 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_DEFAULT , .description = "Raw H.264 data" , .key = "This paragraph is copyright (c) 2006 by Digium, Inc. \In order for your module to load, it must return this \key via a function called \"key\". Any code which \includes this paragraph must be licensed under the GNU \General Public License version 2 or later (at your \option). In addition to Digium's general reservations \of rights, Digium expressly reserves the right to \allow other parties to license this paragraph under \different terms. Any use of Digium, Inc. trademarks or \logos (including \"Asterisk\" or \"Digium\") without \express written permission of Digium, Inc. is prohibited.\n" , .buildopt_sum = "068e67f60f50dd9ee86464c05884a49d" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 175 of file format_h264.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 175 of file format_h264.c.
struct ast_format h264_f [static] |