#include "asterisk.h"
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <sys/time.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>
#include "asterisk/lock.h"
#include "asterisk/channel.h"
#include "asterisk/file.h"
#include "asterisk/logger.h"
#include "asterisk/sched.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_LOAD_FIRST | AST_MODFLAG_BUILDSUM, .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 = "361d7bb937402d51e4658efb5b4d76e4" , .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 53 of file format_h264.c.
static void __reg_module | ( | void | ) | [static] |
Definition at line 189 of file format_h264.c.
static void __unreg_module | ( | void | ) | [static] |
Definition at line 189 of file format_h264.c.
static int h264_open | ( | struct ast_filestream * | s | ) | [static] |
Definition at line 58 of file format_h264.c.
References ast_log(), LOG_WARNING, and s.
00059 { 00060 unsigned int ts; 00061 int res; 00062 if ((res = fread(&ts, 1, sizeof(ts), s->f)) < sizeof(ts)) { 00063 ast_log(LOG_WARNING, "Empty file!\n"); 00064 return -1; 00065 } 00066 return 0; 00067 }
static struct ast_frame* h264_read | ( | struct ast_filestream * | s, | |
int * | whennext | |||
) | [static] |
Definition at line 69 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.
00070 { 00071 int res; 00072 int mark=0; 00073 unsigned short len; 00074 unsigned int ts; 00075 struct h264_desc *fs = (struct h264_desc *)s->_private; 00076 00077 /* Send a frame from the file to the appropriate channel */ 00078 if ((res = fread(&len, 1, sizeof(len), s->f)) < 1) 00079 return NULL; 00080 len = ntohs(len); 00081 mark = (len & 0x8000) ? 1 : 0; 00082 len &= 0x7fff; 00083 if (len > BUF_SIZE) { 00084 ast_log(LOG_WARNING, "Length %d is too long\n", len); 00085 len = BUF_SIZE; /* XXX truncate */ 00086 } 00087 s->fr.frametype = AST_FRAME_VIDEO; 00088 s->fr.subclass = AST_FORMAT_H264; 00089 s->fr.mallocd = 0; 00090 AST_FRAME_SET_BUFFER(&s->fr, s->buf, AST_FRIENDLY_OFFSET, len); 00091 if ((res = fread(s->fr.data, 1, s->fr.datalen, s->f)) != s->fr.datalen) { 00092 if (res) 00093 ast_log(LOG_WARNING, "Short read (%d of %d) (%s)!\n", res, len, strerror(errno)); 00094 return NULL; 00095 } 00096 s->fr.samples = fs->lastts; 00097 s->fr.datalen = len; 00098 s->fr.subclass |= mark; 00099 s->fr.delivery.tv_sec = 0; 00100 s->fr.delivery.tv_usec = 0; 00101 if ((res = fread(&ts, 1, sizeof(ts), s->f)) == sizeof(ts)) { 00102 fs->lastts = ntohl(ts); 00103 *whennext = fs->lastts * 4/45; 00104 } else 00105 *whennext = 0; 00106 return &s->fr; 00107 }
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 156 of file format_h264.c.
References ast_filestream::f, and offset.
00157 { 00158 off_t offset = ftell(fs->f); 00159 return offset; /* XXX totally bogus, needs fixing */ 00160 }
static int h264_trunc | ( | struct ast_filestream * | fs | ) | [static] |
Definition at line 148 of file format_h264.c.
References ast_filestream::f.
00149 { 00150 /* Truncate file to current length */ 00151 if (ftruncate(fileno(fs->f), ftell(fs->f)) < 0) 00152 return -1; 00153 return 0; 00154 }
static int h264_write | ( | struct ast_filestream * | s, | |
struct ast_frame * | f | |||
) | [static] |
Definition at line 109 of file format_h264.c.
References AST_FORMAT_H264, AST_FRAME_VIDEO, ast_log(), errno, f, len(), LOG_WARNING, and s.
00110 { 00111 int res; 00112 unsigned int ts; 00113 unsigned short len; 00114 int mark; 00115 00116 if (f->frametype != AST_FRAME_VIDEO) { 00117 ast_log(LOG_WARNING, "Asked to write non-video frame!\n"); 00118 return -1; 00119 } 00120 mark = (f->subclass & 0x1) ? 0x8000 : 0; 00121 if ((f->subclass & ~0x1) != AST_FORMAT_H264) { 00122 ast_log(LOG_WARNING, "Asked to write non-h264 frame (%d)!\n", f->subclass); 00123 return -1; 00124 } 00125 ts = htonl(f->samples); 00126 if ((res = fwrite(&ts, 1, sizeof(ts), s->f)) != sizeof(ts)) { 00127 ast_log(LOG_WARNING, "Bad write (%d/4): %s\n", res, strerror(errno)); 00128 return -1; 00129 } 00130 len = htons(f->datalen | mark); 00131 if ((res = fwrite(&len, 1, sizeof(len), s->f)) != sizeof(len)) { 00132 ast_log(LOG_WARNING, "Bad write (%d/2): %s\n", res, strerror(errno)); 00133 return -1; 00134 } 00135 if ((res = fwrite(f->data, 1, f->datalen, s->f)) != f->datalen) { 00136 ast_log(LOG_WARNING, "Bad write (%d/%d): %s\n", res, f->datalen, strerror(errno)); 00137 return -1; 00138 } 00139 return 0; 00140 }
static int load_module | ( | void | ) | [static] |
Definition at line 176 of file format_h264.c.
References ast_format_register, and h264_f.
00177 { 00178 return ast_format_register(&h264_f); 00179 }
static int unload_module | ( | void | ) | [static] |
Definition at line 181 of file format_h264.c.
References ast_format_unregister(), h264_f, and ast_format::name.
00182 { 00183 return ast_format_unregister(h264_f.name); 00184 }
struct ast_module_info __mod_info = { .name = AST_MODULE, .flags = AST_MODFLAG_LOAD_FIRST | AST_MODFLAG_BUILDSUM, .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 = "361d7bb937402d51e4658efb5b4d76e4" , .load = load_module, .unload = unload_module, } [static] |
Definition at line 189 of file format_h264.c.
const struct ast_module_info* ast_module_info = &__mod_info [static] |
Definition at line 189 of file format_h264.c.
struct ast_format h264_f [static] |