annotate src/ffmpeg/libavformat/sgi.c @ 808:e8776388b02a trunk

[svn] - add ffmpeg
author nenolod
date Mon, 12 Mar 2007 11:18:54 -0700
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
808
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
1 /*
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
2 * SGI image format
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
3 * Todd Kirby <doubleshot@pacbell.net>
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
4 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
5 * This file is part of FFmpeg.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
6 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
7 * FFmpeg is free software; you can redistribute it and/or
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
8 * modify it under the terms of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
9 * License as published by the Free Software Foundation; either
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
10 * version 2.1 of the License, or (at your option) any later version.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
11 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
12 * FFmpeg is distributed in the hope that it will be useful,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
15 * Lesser General Public License for more details.
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
16 *
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
17 * You should have received a copy of the GNU Lesser General Public
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
18 * License along with FFmpeg; if not, write to the Free Software
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
20 */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
21
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
22 #include "avformat.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
23 #include "avio.h"
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
24
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
25 /* #define DEBUG */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
26
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
27 /* sgi image file signature */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
28 #define SGI_MAGIC 474
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
29
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
30 #define SGI_HEADER_SIZE 512
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
31
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
32 #define SGI_GRAYSCALE 1
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
33 #define SGI_RGB 3
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
34 #define SGI_RGBA 4
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
35
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
36 #define SGI_SINGLE_CHAN 2
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
37 #define SGI_MULTI_CHAN 3
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
38
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
39 typedef struct SGIInfo{
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
40 short magic;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
41 char rle;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
42 char bytes_per_channel;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
43 unsigned short dimension;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
44 unsigned short xsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
45 unsigned short ysize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
46 unsigned short zsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
47 } SGIInfo;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
48
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
49
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
50 static int sgi_probe(AVProbeData *pd)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
51 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
52 /* test for sgi magic */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
53 if (pd->buf_size >= 2 && BE_16(&pd->buf[0]) == SGI_MAGIC) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
54 return AVPROBE_SCORE_MAX;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
55 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
56 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
57 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
58 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
59
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
60 /* read sgi header fields */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
61 static void read_sgi_header(ByteIOContext *f, SGIInfo *info)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
62 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
63 info->magic = (unsigned short) get_be16(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
64 info->rle = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
65 info->bytes_per_channel = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
66 info->dimension = (unsigned short)get_be16(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
67 info->xsize = (unsigned short) get_be16(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
68 info->ysize = (unsigned short) get_be16(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
69 info->zsize = (unsigned short) get_be16(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
70
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
71 if(info->zsize > 4096)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
72 info->zsize= 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
73
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
74 #ifdef DEBUG
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
75 printf("sgi header fields:\n");
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
76 printf(" magic: %d\n", info->magic);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
77 printf(" rle: %d\n", info->rle);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
78 printf(" bpc: %d\n", info->bytes_per_channel);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
79 printf(" dim: %d\n", info->dimension);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
80 printf(" xsize: %d\n", info->xsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
81 printf(" ysize: %d\n", info->ysize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
82 printf(" zsize: %d\n", info->zsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
83 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
84
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
85 return;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
86 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
87
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
88
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
89 /* read an uncompressed sgi image */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
90 static int read_uncompressed_sgi(const SGIInfo *si,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
91 AVPicture *pict, ByteIOContext *f)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
92 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
93 int x, y, z, chan_offset, ret = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
94 uint8_t *dest_row;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
95
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
96 /* skip header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
97 url_fseek(f, SGI_HEADER_SIZE, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
98
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
99 pict->linesize[0] = si->xsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
100
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
101 for (z = 0; z < si->zsize; z++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
102
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
103 #ifndef WORDS_BIGENDIAN
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
104 /* rgba -> bgra for rgba32 on little endian cpus */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
105 if (si->zsize == 4 && z != 3)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
106 chan_offset = 2 - z;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
107 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
108 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
109 chan_offset = z;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
110
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
111 for (y = si->ysize - 1; y >= 0; y--) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
112 dest_row = pict->data[0] + (y * si->xsize * si->zsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
113
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
114 for (x = 0; x < si->xsize; x++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
115 dest_row[chan_offset] = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
116 dest_row += si->zsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
117 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
118 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
119 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
120
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
121 return ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
122 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
123
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
124
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
125 /* expand an rle row into a channel */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
126 static int expand_rle_row(ByteIOContext *f, unsigned char *optr,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
127 int chan_offset, int pixelstride)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
128 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
129 unsigned char pixel, count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
130 int length = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
131
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
132 #ifndef WORDS_BIGENDIAN
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
133 /* rgba -> bgra for rgba32 on little endian cpus */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
134 if (pixelstride == 4 && chan_offset != 3) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
135 chan_offset = 2 - chan_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
136 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
137 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
138
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
139 optr += chan_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
140
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
141 while (1) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
142 pixel = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
143
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
144 if (!(count = (pixel & 0x7f))) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
145 return length;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
146 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
147 if (pixel & 0x80) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
148 while (count--) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
149 *optr = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
150 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
151 optr += pixelstride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
152 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
153 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
154 pixel = get_byte(f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
155
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
156 while (count--) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
157 *optr = pixel;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
158 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
159 optr += pixelstride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
160 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
161 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
162 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
163 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
164
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
165
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
166 /* read a run length encoded sgi image */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
167 static int read_rle_sgi(const SGIInfo *sgi_info,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
168 AVPicture *pict, ByteIOContext *f)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
169 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
170 uint8_t *dest_row;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
171 unsigned long *start_table;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
172 int y, z, xsize, ysize, zsize, tablen;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
173 long start_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
174 int ret = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
175
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
176 xsize = sgi_info->xsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
177 ysize = sgi_info->ysize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
178 zsize = sgi_info->zsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
179
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
180 /* skip header */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
181 url_fseek(f, SGI_HEADER_SIZE, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
182
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
183 /* size of rle offset and length tables */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
184 tablen = ysize * zsize * sizeof(long);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
185
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
186 start_table = (unsigned long *)av_malloc(tablen);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
187
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
188 if (!get_buffer(f, (uint8_t *)start_table, tablen)) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
189 ret = AVERROR_IO;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
190 goto fail;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
191 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
192
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
193 /* skip run length table */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
194 url_fseek(f, tablen, SEEK_CUR);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
195
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
196 for (z = 0; z < zsize; z++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
197 for (y = 0; y < ysize; y++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
198 dest_row = pict->data[0] + (ysize - 1 - y) * (xsize * zsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
199
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
200 start_offset = BE_32(&start_table[y + z * ysize]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
201
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
202 /* don't seek if already at the next rle start offset */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
203 if (url_ftell(f) != start_offset) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
204 url_fseek(f, start_offset, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
205 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
206
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
207 if (expand_rle_row(f, dest_row, z, zsize) != xsize) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
208 ret = AVERROR_INVALIDDATA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
209 goto fail;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
210 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
211 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
212 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
213
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
214 fail:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
215 av_free(start_table);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
216
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
217 return ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
218 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
219
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
220
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
221 static int sgi_read(ByteIOContext *f,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
222 int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
223 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
224 SGIInfo sgi_info, *s = &sgi_info;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
225 AVImageInfo info1, *info = &info1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
226 int ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
227
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
228 read_sgi_header(f, s);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
229
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
230 if (s->bytes_per_channel != 1) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
231 return AVERROR_INVALIDDATA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
232 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
233
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
234 /* check for supported image dimensions */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
235 if (s->dimension != 2 && s->dimension != 3) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
236 return AVERROR_INVALIDDATA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
237 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
238
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
239 if (s->zsize == SGI_GRAYSCALE) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
240 info->pix_fmt = PIX_FMT_GRAY8;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
241 } else if (s->zsize == SGI_RGB) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
242 info->pix_fmt = PIX_FMT_RGB24;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
243 } else if (s->zsize == SGI_RGBA) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
244 info->pix_fmt = PIX_FMT_RGBA32;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
245 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
246 return AVERROR_INVALIDDATA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
247 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
248
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
249 info->width = s->xsize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
250 info->height = s->ysize;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
251
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
252 ret = alloc_cb(opaque, info);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
253 if (ret)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
254 return ret;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
255
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
256 if (s->rle) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
257 return read_rle_sgi(s, &info->pict, f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
258 } else {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
259 return read_uncompressed_sgi(s, &info->pict, f);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
260 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
261
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
262 return 0; /* not reached */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
263 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
264
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
265 #ifdef CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
266 static void write_sgi_header(ByteIOContext *f, const SGIInfo *info)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
267 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
268 int i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
269
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
270 put_be16(f, SGI_MAGIC);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
271 put_byte(f, info->rle);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
272 put_byte(f, info->bytes_per_channel);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
273 put_be16(f, info->dimension);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
274 put_be16(f, info->xsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
275 put_be16(f, info->ysize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
276 put_be16(f, info->zsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
277
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
278 /* The rest are constant in this implementation */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
279 put_be32(f, 0L); /* pixmin */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
280 put_be32(f, 255L); /* pixmax */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
281 put_be32(f, 0L); /* dummy */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
282
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
283 /* name */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
284 for (i = 0; i < 80; i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
285 put_byte(f, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
286 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
287
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
288 put_be32(f, 0L); /* colormap */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
289
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
290 /* The rest of the 512 byte header is unused. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
291 for (i = 0; i < 404; i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
292 put_byte(f, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
293 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
294 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
295
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
296
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
297 static int rle_row(ByteIOContext *f, char *row, int stride, int rowsize)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
298 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
299 int length, count, i, x;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
300 char *start, repeat = 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
301
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
302 for (x = rowsize, length = 0; x > 0;) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
303 start = row;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
304 row += (2 * stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
305 x -= 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
306
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
307 while (x > 0 && (row[-2 * stride] != row[-1 * stride] ||
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
308 row[-1 * stride] != row[0])) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
309 row += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
310 x--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
311 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
312
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
313 row -= (2 * stride);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
314 x += 2;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
315
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
316 count = (row - start) / stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
317 while (count > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
318 i = count > 126 ? 126 : count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
319 count -= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
320
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
321 put_byte(f, 0x80 | i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
322 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
323
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
324 while (i > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
325 put_byte(f, *start);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
326 start += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
327 i--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
328 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
329 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
330 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
331
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
332 if (x <= 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
333 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
334 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
335
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
336 start = row;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
337 repeat = row[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
338
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
339 row += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
340 x--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
341
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
342 while (x > 0 && *row == repeat) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
343 row += stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
344 x--;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
345 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
346
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
347 count = (row - start) / stride;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
348 while (count > 0) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
349 i = count > 126 ? 126 : count;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
350 count -= i;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
351
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
352 put_byte(f, i);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
353 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
354
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
355 put_byte(f, repeat);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
356 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
357 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
358 };
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
359
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
360 length++;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
361
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
362 put_byte(f, 0);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
363 return (length);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
364 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
365
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
366
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
367 static int sgi_write(ByteIOContext *pb, AVImageInfo *info)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
368 {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
369 SGIInfo sgi_info, *si = &sgi_info;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
370 long *offsettab, *lengthtab;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
371 int i, y, z;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
372 int tablesize, chan_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
373 uint8_t *srcrow;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
374
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
375 si->xsize = info->width;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
376 si->ysize = info->height;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
377 si->rle = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
378 si->bytes_per_channel = 1;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
379
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
380 switch(info->pix_fmt) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
381 case PIX_FMT_GRAY8:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
382 si->dimension = SGI_SINGLE_CHAN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
383 si->zsize = SGI_GRAYSCALE;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
384 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
385 case PIX_FMT_RGB24:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
386 si->dimension = SGI_MULTI_CHAN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
387 si->zsize = SGI_RGB;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
388 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
389 case PIX_FMT_RGBA32:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
390 si->dimension = SGI_MULTI_CHAN;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
391 si->zsize = SGI_RGBA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
392 break;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
393 default:
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
394 return AVERROR_INVALIDDATA;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
395 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
396
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
397 write_sgi_header(pb, si);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
398
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
399 tablesize = si->zsize * si->ysize * sizeof(long);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
400
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
401 /* skip rle offset and length tables, write them at the end. */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
402 url_fseek(pb, tablesize * 2, SEEK_CUR);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
403 put_flush_packet(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
404
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
405 lengthtab = av_malloc(tablesize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
406 offsettab = av_malloc(tablesize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
407
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
408 for (z = 0; z < si->zsize; z++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
409
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
410 #ifndef WORDS_BIGENDIAN
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
411 /* rgba -> bgra for rgba32 on little endian cpus */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
412 if (si->zsize == 4 && z != 3)
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
413 chan_offset = 2 - z;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
414 else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
415 #endif
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
416 chan_offset = z;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
417
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
418 srcrow = info->pict.data[0] + chan_offset;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
419
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
420 for (y = si->ysize -1; y >= 0; y--) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
421 offsettab[(z * si->ysize) + y] = url_ftell(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
422 lengthtab[(z * si->ysize) + y] = rle_row(pb, srcrow,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
423 si->zsize, si->xsize);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
424 srcrow += info->pict.linesize[0];
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
425 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
426 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
427
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
428 url_fseek(pb, 512, SEEK_SET);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
429
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
430 /* write offset table */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
431 for (i = 0; i < (si->ysize * si->zsize); i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
432 put_be32(pb, offsettab[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
433 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
434
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
435 /* write length table */
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
436 for (i = 0; i < (si->ysize * si->zsize); i++) {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
437 put_be32(pb, lengthtab[i]);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
438 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
439
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
440 put_flush_packet(pb);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
441
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
442 av_free(lengthtab);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
443 av_free(offsettab);
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
444
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
445 return 0;
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
446 }
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
447 #endif // CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
448
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
449 AVImageFormat sgi_image_format = {
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
450 "sgi",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
451 "sgi,rgb,rgba,bw",
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
452 sgi_probe,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
453 sgi_read,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
454 (1 << PIX_FMT_GRAY8) | (1 << PIX_FMT_RGB24) | (1 << PIX_FMT_RGBA32),
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
455 #ifdef CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
456 sgi_write,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
457 #else
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
458 NULL,
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
459 #endif // CONFIG_MUXERS
e8776388b02a [svn] - add ffmpeg
nenolod
parents:
diff changeset
460 };