update MANY more files with proper copyright/license info (thanks Ian!)
[asterisk/asterisk.git] / formats / format_jpeg.c
1 /*
2  * Asterisk -- An open source telephony toolkit.
3  *
4  * Copyright (C) 1999 - 2005, Digium, Inc.
5  *
6  * Mark Spencer <markster@digium.com>
7  *
8  * See http://www.asterisk.org for more information about
9  * the Asterisk project. Please do not directly contact
10  * any of the maintainers of this project for assistance;
11  * the project provides a web site, mailing lists and IRC
12  * channels for your use.
13  *
14  * This program is free software, distributed under the terms of
15  * the GNU General Public License Version 2. See the LICENSE file
16  * at the top of the source tree.
17  */
18
19 /*
20  *
21  * JPEG File format support.
22  * 
23  */
24  
25 #include <sys/types.h>
26 #include <netinet/in.h>
27 #include <arpa/inet.h>
28 #include <stdlib.h>
29 #include <sys/time.h>
30 #include <stdio.h>
31 #include <unistd.h>
32 #include <errno.h>
33 #include <string.h>
34
35 #include "asterisk.h"
36
37 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
38
39 #include "asterisk/channel.h"
40 #include "asterisk/file.h"
41 #include "asterisk/logger.h"
42 #include "asterisk/sched.h"
43 #include "asterisk/module.h"
44 #include "asterisk/image.h"
45 #include "asterisk/lock.h"
46 #include "asterisk/endian.h"
47
48 static char *desc = "JPEG (Joint Picture Experts Group) Image Format";
49
50
51 static struct ast_frame *jpeg_read_image(int fd, int len)
52 {
53         struct ast_frame fr;
54         int res;
55         char buf[65536];
56         if (len > sizeof(buf)) {
57                 ast_log(LOG_WARNING, "JPEG image too large to read\n");
58                 return NULL;
59         }
60         res = read(fd, buf, len);
61         if (res < len) {
62                 ast_log(LOG_WARNING, "Only read %d of %d bytes: %s\n", res, len, strerror(errno));
63         }
64         memset(&fr, 0, sizeof(fr));
65         fr.frametype = AST_FRAME_IMAGE;
66         fr.subclass = AST_FORMAT_JPEG;
67         fr.data = buf;
68         fr.src = "JPEG Read";
69         fr.datalen = len;
70         return ast_frisolate(&fr);
71 }
72
73 static int jpeg_identify(int fd)
74 {
75         char buf[10];
76         int res;
77         res = read(fd, buf, sizeof(buf));
78         if (res < sizeof(buf))
79                 return 0;
80         if (memcmp(buf + 6, "JFIF", 4))
81                 return 0;
82         return 1;
83 }
84
85 static int jpeg_write_image(int fd, struct ast_frame *fr)
86 {
87         int res=0;
88         if (fr->frametype != AST_FRAME_IMAGE) {
89                 ast_log(LOG_WARNING, "Not an image\n");
90                 return -1;
91         }
92         if (fr->subclass != AST_FORMAT_JPEG) {
93                 ast_log(LOG_WARNING, "Not a jpeg image\n");
94                 return -1;
95         }
96         if (fr->datalen) {
97                 res = write(fd, fr->data, fr->datalen);
98                 if (res != fr->datalen) {
99                         ast_log(LOG_WARNING, "Only wrote %d of %d bytes: %s\n", res, fr->datalen, strerror(errno));
100                         return -1;
101                 }
102         }
103         return res;
104 }
105
106 static struct ast_imager jpeg_format = {
107         "jpg",
108         "JPEG (Joint Picture Experts Group)",
109         "jpg|jpeg",
110         AST_FORMAT_JPEG,
111         jpeg_read_image,
112         jpeg_identify,
113         jpeg_write_image,
114 };
115
116 int load_module()
117 {
118         return ast_image_register(&jpeg_format);
119 }
120
121 int unload_module()
122 {
123         ast_image_unregister(&jpeg_format);
124         return 0;
125 }       
126
127 int usecount()
128 {
129         /* We never really have any users */
130         return 0;
131 }
132
133 char *description()
134 {
135         return desc;
136 }
137
138
139 char *key()
140 {
141         return ASTERISK_GPL_KEY;
142 }