00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031 #include "asterisk.h"
00032
00033 ASTERISK_FILE_VERSION(__FILE__, "$Revision: 328209 $")
00034
00035 #include "asterisk/mod_format.h"
00036 #include "asterisk/module.h"
00037 #include "asterisk/image.h"
00038 #include "asterisk/endian.h"
00039
00040 static struct ast_frame *jpeg_read_image(int fd, int len)
00041 {
00042 struct ast_frame fr;
00043 int res;
00044 char buf[65536];
00045 if (len > sizeof(buf) || len < 0) {
00046 ast_log(LOG_WARNING, "JPEG image too large to read\n");
00047 return NULL;
00048 }
00049 res = read(fd, buf, len);
00050 if (res < len) {
00051 ast_log(LOG_WARNING, "Only read %d of %d bytes: %s\n", res, len, strerror(errno));
00052 }
00053 memset(&fr, 0, sizeof(fr));
00054 fr.frametype = AST_FRAME_IMAGE;
00055 fr.subclass.codec = AST_FORMAT_JPEG;
00056 fr.data.ptr = buf;
00057 fr.src = "JPEG Read";
00058 fr.datalen = len;
00059 return ast_frisolate(&fr);
00060 }
00061
00062 static int jpeg_identify(int fd)
00063 {
00064 char buf[10];
00065 int res;
00066 res = read(fd, buf, sizeof(buf));
00067 if (res < sizeof(buf))
00068 return 0;
00069 if (memcmp(buf + 6, "JFIF", 4))
00070 return 0;
00071 return 1;
00072 }
00073
00074 static int jpeg_write_image(int fd, struct ast_frame *fr)
00075 {
00076 int res=0;
00077 if (fr->frametype != AST_FRAME_IMAGE) {
00078 ast_log(LOG_WARNING, "Not an image\n");
00079 return -1;
00080 }
00081 if (fr->subclass.codec != AST_FORMAT_JPEG) {
00082 ast_log(LOG_WARNING, "Not a jpeg image\n");
00083 return -1;
00084 }
00085 if (fr->datalen) {
00086 res = write(fd, fr->data.ptr, fr->datalen);
00087 if (res != fr->datalen) {
00088 ast_log(LOG_WARNING, "Only wrote %d of %d bytes: %s\n", res, fr->datalen, strerror(errno));
00089 return -1;
00090 }
00091 }
00092 return res;
00093 }
00094
00095 static struct ast_imager jpeg_format = {
00096 .name = "jpg",
00097 .desc = "JPEG (Joint Picture Experts Group)",
00098 .exts = "jpg|jpeg",
00099 .format = AST_FORMAT_JPEG,
00100 .read_image = jpeg_read_image,
00101 .identify = jpeg_identify,
00102 .write_image = jpeg_write_image,
00103 };
00104
00105 static int load_module(void)
00106 {
00107 if (ast_image_register(&jpeg_format))
00108 return AST_MODULE_LOAD_FAILURE;
00109 return AST_MODULE_LOAD_SUCCESS;
00110 }
00111
00112 static int unload_module(void)
00113 {
00114 ast_image_unregister(&jpeg_format);
00115
00116 return 0;
00117 }
00118
00119 AST_MODULE_INFO(ASTERISK_GPL_KEY, AST_MODFLAG_LOAD_ORDER, "jpeg (joint picture experts group) image format",
00120 .load = load_module,
00121 .unload = unload_module,
00122 .load_pri = AST_MODPRI_APP_DEPEND
00123 );