Browse Source

avcodec/loco: Support LOCO reference encoder with odd width

Fixes Ticket1221

Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
tags/n2.6
Michael Niedermayer 10 years ago
parent
commit
d97b94f1af
1 changed files with 19 additions and 0 deletions
  1. +19
    -0
      libavcodec/loco.c

+ 19
- 0
libavcodec/loco.c View File

@@ -168,6 +168,23 @@ static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int heigh
return (get_bits_count(&rc.gb) + 7) >> 3;
}

static void rotate_faulty_loco(uint8_t *data, int width, int height, int stride, int step)
{
int y;

for (y=1; y<height; y++) {
if (width>=y) {
memmove(data + y*stride,
data + y*(stride + step),
step*(width-y));
if (y+1 < height)
memmove(data + y*stride + step*(width-y),
data + (y+1)*stride,
step*y);
}
}
}

static int decode_frame(AVCodecContext *avctx,
void *data, int *got_frame,
AVPacket *avpkt)
@@ -216,6 +233,8 @@ static int decode_frame(AVCodecContext *avctx,
ADVANCE_BY_DECODED;
decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 2, avctx->width, avctx->height,
-p->linesize[0], buf, buf_size, 3);
if (avctx->width & 1)
rotate_faulty_loco(p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height, -p->linesize[0], 3);
break;
case LOCO_CRGBA:
case LOCO_RGBA:


Loading…
Cancel
Save