* SGI image format
* Todd Kirby <doubleshot@pacbell.net>
*
- * This library is free software; you can redistribute it and/or
+ * This file is part of FFmpeg.
+ *
+ * FFmpeg is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
+ * version 2.1 of the License, or (at your option) any later version.
*
- * This library is distributed in the hope that it will be useful,
+ * FFmpeg is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ * License along with FFmpeg; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avformat.h"
static int sgi_probe(AVProbeData *pd)
{
/* test for sgi magic */
- if (pd->buf_size >= 2 && BE_16(&pd->buf[0]) == SGI_MAGIC) {
+ if (pd->buf_size >= 2 && AV_RB16(&pd->buf[0]) == SGI_MAGIC) {
return AVPROBE_SCORE_MAX;
} else {
return 0;
info->ysize = (unsigned short) get_be16(f);
info->zsize = (unsigned short) get_be16(f);
+ if(info->zsize > 4096)
+ info->zsize= 0;
+
#ifdef DEBUG
printf("sgi header fields:\n");
printf(" magic: %d\n", info->magic);
/* read an uncompressed sgi image */
-static int read_uncompressed_sgi(const SGIInfo *si,
+static int read_uncompressed_sgi(const SGIInfo *si,
AVPicture *pict, ByteIOContext *f)
{
int x, y, z, chan_offset, ret = 0;
uint8_t *dest_row;
- /* skip header */
+ /* skip header */
url_fseek(f, SGI_HEADER_SIZE, SEEK_SET);
pict->linesize[0] = si->xsize;
#ifndef WORDS_BIGENDIAN
/* rgba -> bgra for rgba32 on little endian cpus */
- if (si->zsize == 4 && z != 3)
+ if (si->zsize == 4 && z != 3)
chan_offset = 2 - z;
else
#endif
chan_offset = z;
-
+
for (y = si->ysize - 1; y >= 0; y--) {
dest_row = pict->data[0] + (y * si->xsize * si->zsize);
for (x = 0; x < si->xsize; x++) {
- dest_row[chan_offset] = get_byte(f);
+ dest_row[chan_offset] = get_byte(f);
dest_row += si->zsize;
}
}
{
unsigned char pixel, count;
int length = 0;
-
+
#ifndef WORDS_BIGENDIAN
/* rgba -> bgra for rgba32 on little endian cpus */
if (pixelstride == 4 && chan_offset != 3) {
chan_offset = 2 - chan_offset;
}
#endif
-
+
optr += chan_offset;
while (1) {
/* read a run length encoded sgi image */
-static int read_rle_sgi(const SGIInfo *sgi_info,
+static int read_rle_sgi(const SGIInfo *sgi_info,
AVPicture *pict, ByteIOContext *f)
{
uint8_t *dest_row;
unsigned long *start_table;
- int y, z, xsize, ysize, zsize, tablen;
+ int y, z, xsize, ysize, zsize, tablen;
long start_offset;
int ret = 0;
ysize = sgi_info->ysize;
zsize = sgi_info->zsize;
- /* skip header */
+ /* skip header */
url_fseek(f, SGI_HEADER_SIZE, SEEK_SET);
/* size of rle offset and length tables */
goto fail;
}
- /* skip run length table */
+ /* skip run length table */
url_fseek(f, tablen, SEEK_CUR);
for (z = 0; z < zsize; z++) {
for (y = 0; y < ysize; y++) {
dest_row = pict->data[0] + (ysize - 1 - y) * (xsize * zsize);
- start_offset = BE_32(&start_table[y + z * ysize]);
+ start_offset = AV_RB32(&start_table[y + z * ysize]);
/* don't seek if already at the next rle start offset */
if (url_ftell(f) != start_offset) {
}
-static int sgi_read(ByteIOContext *f,
+static int sgi_read(ByteIOContext *f,
int (*alloc_cb)(void *opaque, AVImageInfo *info), void *opaque)
{
SGIInfo sgi_info, *s = &sgi_info;
return 0; /* not reached */
}
-#ifdef CONFIG_ENCODERS
+#ifdef CONFIG_MUXERS
static void write_sgi_header(ByteIOContext *f, const SGIInfo *info)
{
int i;
put_be16(f, SGI_MAGIC);
put_byte(f, info->rle);
- put_byte(f, info->bytes_per_channel);
+ put_byte(f, info->bytes_per_channel);
put_be16(f, info->dimension);
put_be16(f, info->xsize);
put_be16(f, info->ysize);
put_be16(f, info->zsize);
/* The rest are constant in this implementation */
- put_be32(f, 0L); /* pixmin */
- put_be32(f, 255L); /* pixmax */
- put_be32(f, 0L); /* dummy */
+ put_be32(f, 0L); /* pixmin */
+ put_be32(f, 255L); /* pixmax */
+ put_be32(f, 0L); /* dummy */
/* name */
for (i = 0; i < 80; i++) {
put_byte(f, 0);
}
- put_be32(f, 0L); /* colormap */
+ put_be32(f, 0L); /* colormap */
/* The rest of the 512 byte header is unused. */
for (i = 0; i < 404; i++) {
row += (2 * stride);
x -= 2;
- while (x > 0 && (row[-2 * stride] != row[-1 * stride] ||
+ while (x > 0 && (row[-2 * stride] != row[-1 * stride] ||
row[-1 * stride] != row[0])) {
row += stride;
x--;
i = count > 126 ? 126 : count;
count -= i;
- put_byte(f, 0x80 | i);
+ put_byte(f, 0x80 | i);
length++;
while (i > 0) {
put_byte(f, i);
length++;
- put_byte(f, repeat);
+ put_byte(f, repeat);
length++;
};
};
length++;
- put_byte(f, 0);
+ put_byte(f, 0);
return (length);
}
si->ysize = info->height;
si->rle = 1;
si->bytes_per_channel = 1;
-
+
switch(info->pix_fmt) {
case PIX_FMT_GRAY8:
si->dimension = SGI_SINGLE_CHAN;
return AVERROR_INVALIDDATA;
}
- write_sgi_header(pb, si);
+ write_sgi_header(pb, si);
tablesize = si->zsize * si->ysize * sizeof(long);
-
+
/* skip rle offset and length tables, write them at the end. */
url_fseek(pb, tablesize * 2, SEEK_CUR);
put_flush_packet(pb);
-
+
lengthtab = av_malloc(tablesize);
offsettab = av_malloc(tablesize);
#ifndef WORDS_BIGENDIAN
/* rgba -> bgra for rgba32 on little endian cpus */
- if (si->zsize == 4 && z != 3)
+ if (si->zsize == 4 && z != 3)
chan_offset = 2 - z;
else
#endif
chan_offset = z;
-
+
srcrow = info->pict.data[0] + chan_offset;
-
+
for (y = si->ysize -1; y >= 0; y--) {
offsettab[(z * si->ysize) + y] = url_ftell(pb);
lengthtab[(z * si->ysize) + y] = rle_row(pb, srcrow,
si->zsize, si->xsize);
- srcrow += info->pict.linesize[0];
+ srcrow += info->pict.linesize[0];
}
}
url_fseek(pb, 512, SEEK_SET);
-
+
/* write offset table */
for (i = 0; i < (si->ysize * si->zsize); i++) {
put_be32(pb, offsettab[i]);
}
-
+
/* write length table */
for (i = 0; i < (si->ysize * si->zsize); i++) {
put_be32(pb, lengthtab[i]);
}
put_flush_packet(pb);
-
+
av_free(lengthtab);
av_free(offsettab);
return 0;
}
-#endif // CONFIG_ENCODERS
+#endif // CONFIG_MUXERS
AVImageFormat sgi_image_format = {
"sgi",
"sgi,rgb,rgba,bw",
sgi_probe,
sgi_read,
- (1 << PIX_FMT_GRAY8) | (1 << PIX_FMT_RGB24) | (1 << PIX_FMT_RGBA32),
-#ifdef CONFIG_ENCODERS
+ (1 << PIX_FMT_GRAY8) | (1 << PIX_FMT_RGB24) | (1 << PIX_FMT_RGBA32),
+#ifdef CONFIG_MUXERS
sgi_write,
#else
NULL,
-#endif // CONFIG_ENCODERS
+#endif // CONFIG_MUXERS
};