summaryrefslogtreecommitdiff
path: root/libavcodec/loco.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2014-12-31 02:41:01 +0100
committerMichael Niedermayer <michaelni@gmx.at>2014-12-31 04:49:48 +0100
commitd97b94f1af43c280c03e7d16830913911c67e94e (patch)
tree48555ac00de14d0f8545b3665fa89e7b95e77398 /libavcodec/loco.c
parent37b35feb64e4e0382cd5e4502dbf0f7ff9aa0b5f (diff)
downloadffmpeg-d97b94f1af43c280c03e7d16830913911c67e94e.tar.gz
avcodec/loco: Support LOCO reference encoder with odd width
Fixes Ticket1221 Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Diffstat (limited to 'libavcodec/loco.c')
-rw-r--r--libavcodec/loco.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/libavcodec/loco.c b/libavcodec/loco.c
index bf52c49889..88c66d9ae8 100644
--- a/libavcodec/loco.c
+++ b/libavcodec/loco.c
@@ -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: