diff options
author | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2001-05-26 20:39:49 +0000 |
---|---|---|
committer | markster <markster@f38db490-d61c-443f-a65b-d21fe96a405b> | 2001-05-26 20:39:49 +0000 |
commit | 89ac4df89311e3cc6864c0a9f866ee9bade3f6d7 (patch) | |
tree | 56436b58a2a794f2803e57a327c99ef62fe4b39f /formats/format_jpeg.c | |
parent | 3f668a01214ec834eaea41ca24d05d76e2f0cd84 (diff) |
Version 0.1.9 from FTP
git-svn-id: http://svn.digium.com/svn/asterisk/trunk@326 f38db490-d61c-443f-a65b-d21fe96a405b
Diffstat (limited to 'formats/format_jpeg.c')
-rwxr-xr-x | formats/format_jpeg.c | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/formats/format_jpeg.c b/formats/format_jpeg.c new file mode 100755 index 000000000..7e10af884 --- /dev/null +++ b/formats/format_jpeg.c @@ -0,0 +1,126 @@ +/* + * Asterisk -- A telephony toolkit for Linux. + * + * JPEG File format support. + * + * Copyright (C) 1999, Mark Spencer + * + * Mark Spencer <markster@linux-support.net> + * + * This program is free software, distributed under the terms of + * the GNU General Public License + */ + +#include <asterisk/channel.h> +#include <asterisk/file.h> +#include <asterisk/logger.h> +#include <asterisk/sched.h> +#include <asterisk/module.h> +#include <asterisk/image.h> +#include <arpa/inet.h> +#include <stdlib.h> +#include <sys/time.h> +#include <stdio.h> +#include <unistd.h> +#include <errno.h> +#include <string.h> +#include <pthread.h> +#include <endian.h> + + + +static char *desc = "JPEG (Joint Picture Experts Group) Image Format"; + + +static struct ast_frame *jpeg_read_image(int fd, int len) +{ + struct ast_frame fr; + int res; + char buf[65536]; + if (len > sizeof(buf)) { + ast_log(LOG_WARNING, "JPEG image too large to read\n"); + return NULL; + } + res = read(fd, buf, len); + if (res < len) { + ast_log(LOG_WARNING, "Only read %d of %d bytes: %s\n", res, len, strerror(errno)); + } + memset(&fr, 0, sizeof(fr)); + fr.frametype = AST_FRAME_IMAGE; + fr.subclass = AST_FORMAT_JPEG; + fr.data = buf; + fr.src = "JPEG Read"; + fr.datalen = len; + return ast_frisolate(&fr); +} + +static int jpeg_identify(int fd) +{ + char buf[10]; + int res; + res = read(fd, buf, sizeof(buf)); + if (res < sizeof(buf)) + return 0; + if (memcmp(buf + 6, "JFIF", 4)) + return 0; + return 1; +} + +static int jpeg_write_image(int fd, struct ast_frame *fr) +{ + int res=0; + if (fr->frametype != AST_FRAME_IMAGE) { + ast_log(LOG_WARNING, "Not an image\n"); + return -1; + } + if (fr->subclass != AST_FORMAT_JPEG) { + ast_log(LOG_WARNING, "Not a jpeg image\n"); + return -1; + } + if (fr->datalen) { + res = write(fd, fr->data, fr->datalen); + if (res != fr->datalen) { + ast_log(LOG_WARNING, "Only wrote %d of %d bytes: %s\n", res, fr->datalen); + return -1; + } + } + return res; +} + +static struct ast_imager jpeg_format = { + "jpg", + "JPEG (Joint Picture Experts Group)", + "jpg|jpeg", + AST_FORMAT_JPEG, + jpeg_read_image, + jpeg_identify, + jpeg_write_image, +}; + +int load_module() +{ + return ast_image_register(&jpeg_format); +} + +int unload_module() +{ + ast_image_unregister(&jpeg_format); + return 0; +} + +int usecount() +{ + /* We never really have any users */ + return 0; +} + +char *description() +{ + return desc; +} + + +char *key() +{ + return ASTERISK_GPL_KEY; +} |