[Ffmpeg-devel] [PATCH] ported SGI decoder to the new API
Xiaohui Sun
sunxiaohui
Thu Apr 5 18:34:05 CEST 2007
Xiaohui Sun wrote:
patch updated.
> Hi
>
> On Thu, Apr 05, 2007 at 09:42:59AM +0800, Xiaohui Sun wrote:
> [...]
>
> > + * @param out_ptr output buffer
>
> this pointer does not point to the output buffer but rather to the line
> after the output buffer
done
>
>
> > + * @param in_buf input buffer
> > + * @param end_buf end of input buffer
> > + * @param s the current image state
> > + * @return 0 if no error, else return error number
> > + */
> > +static int read_rle_sgi(unsigned char* out_ptr, uint8_t *in_buf,
> > + uint8_t *end_buf, SgiState* s)
>
> s/end_buf/in_end/
done
>
>
> > +{
> > + uint8_t *dest_row = out_ptr;
> > + unsigned int len = s->height * s->depth * 4;
> > + uint8_t *start_table = in_buf;
> > + unsigned int y, z;
> > + unsigned int start_offset;
> > +
> > + /* size of RLE offset and length tables */
> > + if(len * 2 > end_buf - in_buf) {
> > + return AVERROR_INVALIDDATA;
> > + }
> > +
> > + in_buf -= SGI_HEADER_SIZE;
> > + for (z = 0; z < s->depth; z++) {
> > + for (y = 0; y < s->height; y++) {
> > + dest_row -= s->linesize;
> > + start_offset = bytestream_get_be32(&start_table);
> > + if(start_offset > end_buf - in_buf) {
> > + return AVERROR_INVALIDDATA;
> > + }
> > + if (expand_rle_row(in_buf + start_offset, end_buf,
> dest_row + z,
> > + dest_row + FFABS(s->linesize), s->depth) != s->width)
> > + return AVERROR_INVALIDDATA;
> > + }
>
> > + dest_row = out_ptr;
>
> if you move this line before the for() then you avoid the second such
> assignment above
done
>
>
> > + }
> > + return 0;
> > +}
> > +
> > +/**
> > + * read an uncompressed SGI image
> > + * @param out_ptr output buffer
>
> > + * @param end_ptr end ofoutput buffer
>
> typo also s/end_ptr/out_end/
done
>
>
> > + * @param in_buf input buffer
>
> > + * @param end_buf end of input buffer
>
> s/end_buf/in_end/
>
done
>
> [...]
> > + uint8_t *dest_row = end_ptr;
>
> this is uneeded
>
done
>
> > + uint8_t *ptr = in_buf;
> > + unsigned int offset = s->height * s->width;
> > +
> > + /* test buffer size */
> > + if (offset * s->depth > end_buf - in_buf) {
> > + return -1;
> > + }
> > +
> > + for (y = s->height - 1; y >= 0; y--) {
>
> > + dest_row = out_ptr + (y * FFABS(s->linesize));
>
> this looks wrong
changed
>
>
> > + for (x = s->width; x > 0; x--) {
> > + for(z = 0; z < s->depth; z ++) {
> > + bytestream_put_byte(&dest_row, *ptr);
> > + ptr += offset;
> > + }
>
> > + ptr = ++in_buf;
>
> if you move this assignment before the for loop then you avoid the second
> redundant assignment farther above
done
>
>
> [...]
> > + dimension = bytestream_get_be16(&in_buf);
> > + s->width = bytestream_get_be16(&in_buf);
> > + s->height = bytestream_get_be16(&in_buf);
> > + s->depth = bytestream_get_be16(&in_buf);
>
> these could be verticall aligned like
>
> dimension = bytestream_get_be16(&in_buf);
> s->width = bytestream_get_be16(&in_buf);
> s->height = bytestream_get_be16(&in_buf);
> s->depth = bytestream_get_be16(&in_buf);
>
> looks nicer ... (not really important though)
changed
>
>
> [...]
> > + /* name */
> > + memset(buf, 0, 80);
> > + buf += 80;
> > +
> > + /* colormap */
> > + bytestream_put_be32(&buf, 0L);
> > +
> > + /* the rest of the 512 byte header is unused */
> > + memset(buf, 0, 404);
> > + buf += 404;
>
> thats just a single memset() ...
>
>
> [...]
> > + if((length = ff_rle_encode(buf, end_buf - buf - 1,
> encode_buf, 1, width, 0, 0, 0x80, 0)) == -1) {
>
> if(... < 1)
>
done
>
> [...]
-------------- next part --------------
An embedded and charset-unspecified text was scrubbed...
Name: sgi_port.patch
URL: <http://lists.mplayerhq.hu/pipermail/ffmpeg-devel/attachments/20070406/8b92ce83/attachment.asc>
More information about the ffmpeg-devel
mailing list