Mercurial > libavformat.hg
annotate pnm.c @ 1607:edb923014029 libavformat
do not base frame rate guess on just one duration
author | michael |
---|---|
date | Fri, 29 Dec 2006 21:16:21 +0000 |
parents | 0899bfe4105c |
children |
rev | line source |
---|---|
20 | 1 /* |
2 * PNM image format | |
3 * Copyright (c) 2002, 2003 Fabrice Bellard. | |
4 * | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
5 * This file is part of FFmpeg. |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
6 * |
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
7 * FFmpeg is free software; you can redistribute it and/or |
20 | 8 * modify it under the terms of the GNU Lesser General Public |
9 * License as published by the Free Software Foundation; either | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
10 * version 2.1 of the License, or (at your option) any later version. |
20 | 11 * |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
12 * FFmpeg is distributed in the hope that it will be useful, |
20 | 13 * but WITHOUT ANY WARRANTY; without even the implied warranty of |
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
15 * Lesser General Public License for more details. | |
16 * | |
17 * You should have received a copy of the GNU Lesser General Public | |
1358
0899bfe4105c
Change license headers to say 'FFmpeg' instead of 'this program/this library'
diego
parents:
896
diff
changeset
|
18 * License along with FFmpeg; if not, write to the Free Software |
896
edbe5c3717f9
Update licensing information: The FSF changed postal address.
diego
parents:
885
diff
changeset
|
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
20 | 20 */ |
21 #include "avformat.h" | |
22 | |
885 | 23 static inline int pnm_space(int c) |
20 | 24 { |
25 return (c == ' ' || c == '\n' || c == '\r' || c == '\t'); | |
26 } | |
27 | |
885 | 28 static void pnm_get(ByteIOContext *f, char *str, int buf_size) |
20 | 29 { |
30 char *s; | |
31 int c; | |
885 | 32 |
20 | 33 /* skip spaces and comments */ |
34 for(;;) { | |
35 c = url_fgetc(f); | |
36 if (c == '#') { | |
37 do { | |
38 c = url_fgetc(f); | |
39 } while (c != '\n' && c != URL_EOF); | |
40 } else if (!pnm_space(c)) { | |
41 break; | |
42 } | |
43 } | |
885 | 44 |
20 | 45 s = str; |
46 while (c != URL_EOF && !pnm_space(c)) { | |
47 if ((s - str) < buf_size - 1) | |
48 *s++ = c; | |
49 c = url_fgetc(f); | |
50 } | |
51 *s = '\0'; | |
52 } | |
53 | |
885 | 54 static int pnm_read1(ByteIOContext *f, |
20 | 55 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque, |
56 int allow_yuv) | |
57 { | |
58 int i, n, linesize, h; | |
59 char buf1[32]; | |
60 unsigned char *ptr; | |
61 AVImageInfo info1, *info = &info1; | |
62 int ret; | |
63 | |
64 pnm_get(f, buf1, sizeof(buf1)); | |
65 if (!strcmp(buf1, "P4")) { | |
66 info->pix_fmt = PIX_FMT_MONOWHITE; | |
67 } else if (!strcmp(buf1, "P5")) { | |
885 | 68 if (allow_yuv) |
20 | 69 info->pix_fmt = PIX_FMT_YUV420P; |
70 else | |
71 info->pix_fmt = PIX_FMT_GRAY8; | |
72 } else if (!strcmp(buf1, "P6")) { | |
73 info->pix_fmt = PIX_FMT_RGB24; | |
74 } else { | |
75 return AVERROR_INVALIDDATA; | |
76 } | |
77 pnm_get(f, buf1, sizeof(buf1)); | |
78 info->width = atoi(buf1); | |
79 if (info->width <= 0) | |
80 return AVERROR_INVALIDDATA; | |
81 pnm_get(f, buf1, sizeof(buf1)); | |
82 info->height = atoi(buf1); | |
83 if (info->height <= 0) | |
84 return AVERROR_INVALIDDATA; | |
85 if (info->pix_fmt != PIX_FMT_MONOWHITE) { | |
86 pnm_get(f, buf1, sizeof(buf1)); | |
87 } | |
88 | |
89 /* more check if YUV420 */ | |
90 if (info->pix_fmt == PIX_FMT_YUV420P) { | |
91 if ((info->width & 1) != 0) | |
92 return AVERROR_INVALIDDATA; | |
93 h = (info->height * 2); | |
94 if ((h % 3) != 0) | |
95 return AVERROR_INVALIDDATA; | |
96 h /= 3; | |
97 info->height = h; | |
98 } | |
885 | 99 |
20 | 100 ret = alloc_cb(opaque, info); |
101 if (ret) | |
102 return ret; | |
885 | 103 |
20 | 104 switch(info->pix_fmt) { |
105 default: | |
106 return AVERROR_INVALIDDATA; | |
107 case PIX_FMT_RGB24: | |
108 n = info->width * 3; | |
109 goto do_read; | |
110 case PIX_FMT_GRAY8: | |
111 n = info->width; | |
112 goto do_read; | |
113 case PIX_FMT_MONOWHITE: | |
114 n = (info->width + 7) >> 3; | |
115 do_read: | |
116 ptr = info->pict.data[0]; | |
117 linesize = info->pict.linesize[0]; | |
118 for(i = 0; i < info->height; i++) { | |
119 get_buffer(f, ptr, n); | |
120 ptr += linesize; | |
121 } | |
122 break; | |
123 case PIX_FMT_YUV420P: | |
124 { | |
125 unsigned char *ptr1, *ptr2; | |
126 | |
127 n = info->width; | |
128 ptr = info->pict.data[0]; | |
129 linesize = info->pict.linesize[0]; | |
130 for(i = 0; i < info->height; i++) { | |
131 get_buffer(f, ptr, n); | |
132 ptr += linesize; | |
133 } | |
134 ptr1 = info->pict.data[1]; | |
135 ptr2 = info->pict.data[2]; | |
136 n >>= 1; | |
137 h = info->height >> 1; | |
138 for(i = 0; i < h; i++) { | |
139 get_buffer(f, ptr1, n); | |
140 get_buffer(f, ptr2, n); | |
141 ptr1 += info->pict.linesize[1]; | |
142 ptr2 += info->pict.linesize[2]; | |
143 } | |
144 } | |
145 break; | |
146 } | |
147 return 0; | |
148 } | |
149 | |
885 | 150 static int pnm_read(ByteIOContext *f, |
20 | 151 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque) |
152 { | |
153 return pnm_read1(f, alloc_cb, opaque, 0); | |
154 } | |
155 | |
885 | 156 static int pgmyuv_read(ByteIOContext *f, |
20 | 157 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque) |
158 { | |
159 return pnm_read1(f, alloc_cb, opaque, 1); | |
160 } | |
161 | |
162 static int pnm_write(ByteIOContext *pb, AVImageInfo *info) | |
163 { | |
164 int i, h, h1, c, n, linesize; | |
165 char buf[100]; | |
65 | 166 uint8_t *ptr, *ptr1, *ptr2; |
20 | 167 |
168 h = info->height; | |
169 h1 = h; | |
170 switch(info->pix_fmt) { | |
171 case PIX_FMT_MONOWHITE: | |
172 c = '4'; | |
173 n = (info->width + 7) >> 3; | |
174 break; | |
175 case PIX_FMT_GRAY8: | |
176 c = '5'; | |
177 n = info->width; | |
178 break; | |
179 case PIX_FMT_RGB24: | |
180 c = '6'; | |
181 n = info->width * 3; | |
182 break; | |
183 case PIX_FMT_YUV420P: | |
184 c = '5'; | |
185 n = info->width; | |
186 h1 = (h * 3) / 2; | |
187 break; | |
188 default: | |
189 return AVERROR_INVALIDDATA; | |
190 } | |
885 | 191 snprintf(buf, sizeof(buf), |
20 | 192 "P%c\n%d %d\n", |
193 c, info->width, h1); | |
194 put_buffer(pb, buf, strlen(buf)); | |
195 if (info->pix_fmt != PIX_FMT_MONOWHITE) { | |
885 | 196 snprintf(buf, sizeof(buf), |
20 | 197 "%d\n", 255); |
198 put_buffer(pb, buf, strlen(buf)); | |
199 } | |
885 | 200 |
20 | 201 ptr = info->pict.data[0]; |
202 linesize = info->pict.linesize[0]; | |
203 for(i=0;i<h;i++) { | |
204 put_buffer(pb, ptr, n); | |
205 ptr += linesize; | |
206 } | |
885 | 207 |
20 | 208 if (info->pix_fmt == PIX_FMT_YUV420P) { |
209 h >>= 1; | |
210 n >>= 1; | |
211 ptr1 = info->pict.data[1]; | |
212 ptr2 = info->pict.data[2]; | |
213 for(i=0;i<h;i++) { | |
214 put_buffer(pb, ptr1, n); | |
215 put_buffer(pb, ptr2, n); | |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
216 ptr1 += info->pict.linesize[1]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
217 ptr2 += info->pict.linesize[2]; |
20 | 218 } |
219 } | |
220 put_flush_packet(pb); | |
221 return 0; | |
222 } | |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
223 |
885 | 224 static int pam_read(ByteIOContext *f, |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
225 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
226 { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
227 int i, n, linesize, h, w, depth, maxval; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
228 char buf1[32], tuple_type[32]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
229 unsigned char *ptr; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
230 AVImageInfo info1, *info = &info1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
231 int ret; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
232 |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
233 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
234 if (strcmp(buf1, "P7") != 0) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
235 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
236 w = -1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
237 h = -1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
238 maxval = -1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
239 depth = -1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
240 tuple_type[0] = '\0'; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
241 for(;;) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
242 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
243 if (!strcmp(buf1, "WIDTH")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
244 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
245 w = strtol(buf1, NULL, 10); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
246 } else if (!strcmp(buf1, "HEIGHT")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
247 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
248 h = strtol(buf1, NULL, 10); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
249 } else if (!strcmp(buf1, "DEPTH")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
250 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
251 depth = strtol(buf1, NULL, 10); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
252 } else if (!strcmp(buf1, "MAXVAL")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
253 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
254 maxval = strtol(buf1, NULL, 10); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
255 } else if (!strcmp(buf1, "TUPLETYPE")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
256 pnm_get(f, buf1, sizeof(buf1)); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
257 pstrcpy(tuple_type, sizeof(tuple_type), buf1); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
258 } else if (!strcmp(buf1, "ENDHDR")) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
259 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
260 } else { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
261 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
262 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
263 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
264 /* check that all tags are present */ |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
265 if (w <= 0 || h <= 0 || maxval <= 0 || depth <= 0 || tuple_type[0] == '\0') |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
266 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
267 info->width = w; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
268 info->height = h; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
269 if (depth == 1) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
270 if (maxval == 1) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
271 info->pix_fmt = PIX_FMT_MONOWHITE; |
885 | 272 else |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
273 info->pix_fmt = PIX_FMT_GRAY8; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
274 } else if (depth == 3) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
275 info->pix_fmt = PIX_FMT_RGB24; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
276 } else if (depth == 4) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
277 info->pix_fmt = PIX_FMT_RGBA32; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
278 } else { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
279 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
280 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
281 ret = alloc_cb(opaque, info); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
282 if (ret) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
283 return ret; |
885 | 284 |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
285 switch(info->pix_fmt) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
286 default: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
287 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
288 case PIX_FMT_RGB24: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
289 n = info->width * 3; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
290 goto do_read; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
291 case PIX_FMT_GRAY8: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
292 n = info->width; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
293 goto do_read; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
294 case PIX_FMT_MONOWHITE: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
295 n = (info->width + 7) >> 3; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
296 do_read: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
297 ptr = info->pict.data[0]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
298 linesize = info->pict.linesize[0]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
299 for(i = 0; i < info->height; i++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
300 get_buffer(f, ptr, n); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
301 ptr += linesize; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
302 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
303 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
304 case PIX_FMT_RGBA32: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
305 ptr = info->pict.data[0]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
306 linesize = info->pict.linesize[0]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
307 for(i = 0; i < info->height; i++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
308 int j, r, g, b, a; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
309 |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
310 for(j = 0;j < w; j++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
311 r = get_byte(f); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
312 g = get_byte(f); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
313 b = get_byte(f); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
314 a = get_byte(f); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
315 ((uint32_t *)ptr)[j] = (a << 24) | (r << 16) | (g << 8) | b; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
316 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
317 ptr += linesize; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
318 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
319 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
320 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
321 return 0; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
322 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
323 |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
324 static int pam_write(ByteIOContext *pb, AVImageInfo *info) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
325 { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
326 int i, h, w, n, linesize, depth, maxval; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
327 const char *tuple_type; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
328 char buf[100]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
329 uint8_t *ptr; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
330 |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
331 h = info->height; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
332 w = info->width; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
333 switch(info->pix_fmt) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
334 case PIX_FMT_MONOWHITE: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
335 n = (info->width + 7) >> 3; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
336 depth = 1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
337 maxval = 1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
338 tuple_type = "BLACKANDWHITE"; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
339 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
340 case PIX_FMT_GRAY8: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
341 n = info->width; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
342 depth = 1; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
343 maxval = 255; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
344 tuple_type = "GRAYSCALE"; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
345 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
346 case PIX_FMT_RGB24: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
347 n = info->width * 3; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
348 depth = 3; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
349 maxval = 255; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
350 tuple_type = "RGB"; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
351 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
352 case PIX_FMT_RGBA32: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
353 n = info->width * 4; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
354 depth = 4; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
355 maxval = 255; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
356 tuple_type = "RGB_ALPHA"; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
357 break; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
358 default: |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
359 return AVERROR_INVALIDDATA; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
360 } |
885 | 361 snprintf(buf, sizeof(buf), |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
362 "P7\nWIDTH %d\nHEIGHT %d\nDEPTH %d\nMAXVAL %d\nTUPLETYPE %s\nENDHDR\n", |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
363 w, h, depth, maxval, tuple_type); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
364 put_buffer(pb, buf, strlen(buf)); |
885 | 365 |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
366 ptr = info->pict.data[0]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
367 linesize = info->pict.linesize[0]; |
885 | 368 |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
369 if (info->pix_fmt == PIX_FMT_RGBA32) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
370 int j; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
371 unsigned int v; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
372 |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
373 for(i=0;i<h;i++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
374 for(j=0;j<w;j++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
375 v = ((uint32_t *)ptr)[j]; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
376 put_byte(pb, (v >> 16) & 0xff); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
377 put_byte(pb, (v >> 8) & 0xff); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
378 put_byte(pb, (v) & 0xff); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
379 put_byte(pb, (v >> 24) & 0xff); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
380 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
381 ptr += linesize; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
382 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
383 } else { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
384 for(i=0;i<h;i++) { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
385 put_buffer(pb, ptr, n); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
386 ptr += linesize; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
387 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
388 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
389 put_flush_packet(pb); |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
390 return 0; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
391 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
392 |
20 | 393 static int pnm_probe(AVProbeData *pd) |
394 { | |
395 const char *p = pd->buf; | |
396 if (pd->buf_size >= 8 && | |
397 p[0] == 'P' && | |
398 p[1] >= '4' && p[1] <= '6' && | |
320
4b01f2d7a90c
Patch for PPM probing by (Rob Joyce <rjoyce at twcny dot rr dot com>)
michael
parents:
200
diff
changeset
|
399 pnm_space(p[2]) ) |
200 | 400 return AVPROBE_SCORE_MAX - 1; /* to permit pgmyuv probe */ |
20 | 401 else |
402 return 0; | |
403 } | |
404 | |
405 static int pgmyuv_probe(AVProbeData *pd) | |
406 { | |
407 if (match_ext(pd->filename, "pgmyuv")) | |
408 return AVPROBE_SCORE_MAX; | |
409 else | |
410 return 0; | |
411 } | |
412 | |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
413 static int pam_probe(AVProbeData *pd) |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
414 { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
415 const char *p = pd->buf; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
416 if (pd->buf_size >= 8 && |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
417 p[0] == 'P' && |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
418 p[1] == '7' && |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
419 p[2] == '\n') |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
420 return AVPROBE_SCORE_MAX; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
421 else |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
422 return 0; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
423 } |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
424 |
20 | 425 AVImageFormat pnm_image_format = { |
426 "pnm", | |
427 NULL, | |
428 pnm_probe, | |
429 pnm_read, | |
430 0, | |
431 NULL, | |
432 }; | |
433 | |
434 AVImageFormat pbm_image_format = { | |
435 "pbm", | |
436 "pbm", | |
437 NULL, | |
438 NULL, | |
439 (1 << PIX_FMT_MONOWHITE), | |
440 pnm_write, | |
441 }; | |
442 | |
443 AVImageFormat pgm_image_format = { | |
444 "pgm", | |
445 "pgm", | |
446 NULL, | |
447 NULL, | |
448 (1 << PIX_FMT_GRAY8), | |
449 pnm_write, | |
450 }; | |
451 | |
452 AVImageFormat ppm_image_format = { | |
453 "ppm", | |
454 "ppm", | |
455 NULL, | |
456 NULL, | |
457 (1 << PIX_FMT_RGB24), | |
458 pnm_write, | |
459 }; | |
460 | |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
461 AVImageFormat pam_image_format = { |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
462 "pam", |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
463 "pam", |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
464 pam_probe, |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
465 pam_read, |
885 | 466 (1 << PIX_FMT_MONOWHITE) | (1 << PIX_FMT_GRAY8) | (1 << PIX_FMT_RGB24) | |
109
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
467 (1 << PIX_FMT_RGBA32), |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
468 pam_write, |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
469 }; |
c82a6062485e
added new netpbm pam format support (needed for alpha plane support)
bellard
parents:
65
diff
changeset
|
470 |
20 | 471 AVImageFormat pgmyuv_image_format = { |
472 "pgmyuv", | |
200 | 473 "pgmyuv", |
20 | 474 pgmyuv_probe, |
475 pgmyuv_read, | |
476 (1 << PIX_FMT_YUV420P), | |
477 pnm_write, | |
478 }; |