From dae0d1e21cb7cefdd0b49ceb35388e6e3acc5e78 Mon Sep 17 00:00:00 2001 From: Peter Ross Date: Sat, 3 Oct 2009 05:18:32 +0000 Subject: Support decoding of uncompressed PCX scanlines Originally committed as revision 20153 to svn://svn.ffmpeg.org/ffmpeg/trunk --- libavcodec/pcx.c | 34 ++++++++++++++++++++-------------- 1 file changed, 20 insertions(+), 14 deletions(-) (limited to 'libavcodec/pcx.c') diff --git a/libavcodec/pcx.c b/libavcodec/pcx.c index 43d7a5a028..df6a8aa74a 100644 --- a/libavcodec/pcx.c +++ b/libavcodec/pcx.c @@ -43,19 +43,24 @@ static av_cold int pcx_init(AVCodecContext *avctx) { * @return advanced src pointer */ static const uint8_t *pcx_rle_decode(const uint8_t *src, uint8_t *dst, - unsigned int bytes_per_scanline) { + unsigned int bytes_per_scanline, int compressed) { unsigned int i = 0; unsigned char run, value; - while (i= 0xc0) { - run = value & 0x3f; + if (compressed) { + while (i= 0xc0) { + run = value & 0x3f; + value = *src++; + } + while (ipriv_data; AVFrame *picture = data; AVFrame * const p = &s->picture; - int xmin, ymin, xmax, ymax; + int compressed, xmin, ymin, xmax, ymax; unsigned int w, h, bits_per_pixel, bytes_per_line, nplanes, stride, y, x, bytes_per_scanline; uint8_t *ptr; uint8_t const *bufstart = buf; - if (buf[0] != 0x0a || buf[1] > 5 || buf[1] == 1 || buf[2] != 1) { + if (buf[0] != 0x0a || buf[1] > 5) { av_log(avctx, AV_LOG_ERROR, "this is not PCX encoded data\n"); return -1; } + compressed = buf[2]; xmin = AV_RL16(buf+ 4); ymin = AV_RL16(buf+ 6); xmax = AV_RL16(buf+ 8); @@ -151,7 +157,7 @@ static int pcx_decode_frame(AVCodecContext *avctx, void *data, int *data_size, uint8_t scanline[bytes_per_scanline]; for (y=0; y> (x&7), v = 0; -- cgit v1.2.3