On 01/15/2012 09:10 PM, Laurentiu Ion wrote:
> ---
> libavcodec/pictordec.c | 102
> +++++++++++++++++++++++++++---------------------
> 1 files changed, 58 insertions(+), 44 deletions(-)
>
> diff --git a/libavcodec/pictordec.c b/libavcodec/pictordec.c
> index 732583e..16d27ad 100644
> --- a/libavcodec/pictordec.c
> +++ b/libavcodec/pictordec.c
> @@ -33,6 +33,7 @@ typedef struct PicContext {
> AVFrame frame;
> int width, height;
> int nb_planes;
> + GetByteContext g;
> } PicContext;
>
> static void picmemset_8bpp(PicContext *s, int value, int run, int *x, int *y)
> @@ -55,7 +56,8 @@ static void picmemset_8bpp(PicContext *s, int value, int
> run, int *x, int *y)
> }
> }
>
> -static void picmemset(PicContext *s, int value, int run, int *x, int *y, int
> *plane, int bits_per_plane)
> +static void picmemset(PicContext *s, int value, int run,
> + int *x, int *y, int *plane, int bits_per_plane)
> {
> uint8_t *d;
> int shift = *plane * bits_per_plane;
> @@ -99,34 +101,35 @@ static int decode_frame(AVCodecContext *avctx,
> AVPacket *avpkt)
> {
> PicContext *s = avctx->priv_data;
> - int buf_size = avpkt->size;
> - const uint8_t *buf = avpkt->data;
> - const uint8_t *buf_end = avpkt->data + buf_size;
> uint32_t *palette;
> - int bits_per_plane, bpp, etype, esize, npal;
> - int i, x, y, plane;
> + int bits_per_plane, bpp, etype, esize, npal, pos_after_pal;
> + int i, x, y, plane, tmp;
>
> - if (buf_size < 11)
> + bytestream2_init(&s->g, avpkt->data, avpkt->size);
> +
> + if (bytestream2_get_bytes_left(&s->g) < 11)
> return AVERROR_INVALIDDATA;
>
> - if (bytestream_get_le16(&buf) != 0x1234)
> + if (bytestream2_get_le16(&s->g) != 0x1234)
> return AVERROR_INVALIDDATA;
> - s->width = bytestream_get_le16(&buf);
> - s->height = bytestream_get_le16(&buf);
> - buf += 4;
> - bits_per_plane = *buf & 0xF;
> - s->nb_planes = (*buf++ >> 4) + 1;
> - bpp = s->nb_planes ? bits_per_plane*s->nb_planes :
> bits_per_plane;
> + s->width = bytestream2_get_le16(&s->g);
> + s->height = bytestream2_get_le16(&s->g);
> + bytestream2_skip(&s->g, 4);
> + tmp = bytestream2_get_byte(&s->g);
> + bits_per_plane = tmp & 0xF;
> + s->nb_planes = (tmp >> 4) + 1;
> + bpp = s->nb_planes ? bits_per_plane*s->nb_planes
add spaces around the *
> + : bits_per_plane;
> if (bits_per_plane > 8 || bpp < 1 || bpp > 32) {
> av_log_ask_for_sample(s, "unsupported bit depth\n");
> return AVERROR_INVALIDDATA;
> }
>
> - if (*buf == 0xFF) {
> - buf += 2;
> - etype = bytestream_get_le16(&buf);
> - esize = bytestream_get_le16(&buf);
> - if (buf_end - buf < esize)
> + if (bytestream2_peek_byte(&s->g) == 0xFF) {
> + bytestream2_skip(&s->g, 2);
> + etype = bytestream2_get_le16(&s->g);
> + esize = bytestream2_get_le16(&s->g);
> + if (bytestream2_get_bytes_left(&s->g) < esize)
> return AVERROR_INVALIDDATA;
> } else {
> etype = -1;
> @@ -151,24 +154,29 @@ static int decode_frame(AVCodecContext *avctx,
> s->frame.pict_type = AV_PICTURE_TYPE_I;
> s->frame.palette_has_changed = 1;
>
> + pos_after_pal = bytestream2_tell(&s->g) + esize;
> palette = (uint32_t*)s->frame.data[1];
> - if (etype == 1 && esize > 1 && *buf < 6) {
> - int idx = *buf;
> + if (etype == 1 && esize > 1 && bytestream2_peek_byte(&s->g) < 6) {
> + int idx = bytestream2_peek_byte(&s->g);
you can use get_byte here instead of peek_byte
> npal = 4;
> for (i = 0; i < npal; i++)
> palette[i] = ff_cga_palette[ cga_mode45_index[idx][i] ];
> } else if (etype == 2) {
> npal = FFMIN(esize, 16);
> - for (i = 0; i < npal; i++)
> - palette[i] = ff_cga_palette[ FFMIN(buf[i], 16)];
> + for (i = 0; i < npal; i++) {
> + int pal_idx = bytestream2_get_byte(&s->g);
> + palette[i] = ff_cga_palette[ FFMIN(pal_idx, 16)];
remove the space before FFMIN
> + }
> } else if (etype == 3) {
> npal = FFMIN(esize, 16);
> - for (i = 0; i < npal; i++)
> - palette[i] = ff_ega_palette[ FFMIN(buf[i], 63)];
> + for (i = 0; i < npal; i++) {
> + int pal_idx = bytestream2_get_byte(&s->g);
> + palette[i] = ff_ega_palette[ FFMIN(pal_idx, 63)];
ditto. and align the =
> + }
> } else if (etype == 4 || etype == 5) {
> npal = FFMIN(esize / 3, 256);
> for (i = 0; i < npal; i++)
> - palette[i] = AV_RB24(buf + i*3) << 2;
> + palette[i] = bytestream2_get_be24(&s->g) << 2;
> } else {
> if (bpp == 1) {
> npal = 2;
> @@ -185,29 +193,35 @@ static int decode_frame(AVCodecContext *avctx,
> }
> // fill remaining palette entries
> memset(palette + npal, 0, AVPALETTE_SIZE - npal * 4);
> - buf += esize;
> -
> + // skip remaining palette bytes
> + bytestream2_seek(&s->g, pos_after_pal, SEEK_SET);
>
> x = 0;
> y = s->height - 1;
> plane = 0;
> - if (bytestream_get_le16(&buf)) {
> - while (buf_end - buf >= 6) {
> - const uint8_t *buf_pend = buf + FFMIN(AV_RL16(buf), buf_end -
> buf);
> - //ignore uncompressed block size reported at buf[2]
> - int marker = buf[4];
> - buf += 5;
> -
> - while (plane < s->nb_planes && buf_pend - buf >= 1) {
> + if (bytestream2_get_le16(&s->g)) {
> + while (bytestream2_get_bytes_left(&s->g) >= 6) {
> + int stop_size, marker, t1, t2;
> +
> + t1 = bytestream2_get_bytes_left(&s->g);
> + t2 = bytestream2_get_le16(&s->g);
> + stop_size = t1 - FFMIN(t1, t2);
align the =
> + // ignore uncompressed block size reported at buf[2]
change that to just "ignore uncompressed block size"
> + bytestream2_skip(&s->g, 2);
> + marker = bytestream2_get_byte(&s->g);
> +
> + while (plane < s->nb_planes
> + && bytestream2_get_bytes_left(&s->g) > stop_size) {
nit: put the && on the previous line
> int run = 1;
> - int val = *buf++;
> + int val = bytestream2_get_byte(&s->g);
> if (val == marker) {
> - run = *buf++;
> - if (run == 0)
> - run = bytestream_get_le16(&buf);
> - val = *buf++;
> + run = bytestream2_get_byte(&s->g);
> + if (run == 0) {
> + run = bytestream2_get_le16(&s->g);
> + }
unneeded braces
> + val = bytestream2_get_byte(&s->g);
> }
> - if (buf > buf_end)
> + if (!bytestream2_get_bytes_left(&s->g))
> break;
>
> if (bits_per_plane == 8) {
> @@ -221,12 +235,12 @@ static int decode_frame(AVCodecContext *avctx,
> }
> } else {
> av_log_ask_for_sample(s, "uncompressed image\n");
> - return buf_size;
> + return avpkt->size;
> }
>
> *data_size = sizeof(AVFrame);
> *(AVFrame*)data = s->frame;
> - return buf_size;
> + return avpkt->size;
> }
>
> static av_cold int decode_end(AVCodecContext *avctx)
the rest looks good.
Thanks,
Justin
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel