diff --git a/libavcodec/loco.c b/libavcodec/loco.c index 9d0f144451..f91d8709b0 100644 --- a/libavcodec/loco.c +++ b/libavcodec/loco.c @@ -114,19 +114,19 @@ static inline int loco_get_rice(RICEContext *r) } /* LOCO main predictor - LOCO-I/JPEG-LS predictor */ -static inline int loco_predict(uint8_t* data, int stride, int step) +static inline int loco_predict(uint8_t* data, int stride) { int a, b, c; a = data[-stride]; - b = data[-step]; - c = data[-stride - step]; + b = data[-1]; + c = data[-stride - 1]; return mid_pred(a, a + b - c, b); } static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int height, - int stride, const uint8_t *buf, int buf_size, int step) + int stride, const uint8_t *buf, int buf_size) { RICEContext rc; int val; @@ -153,7 +153,7 @@ static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int heigh /* restore top line */ for (i = 1; i < width; i++) { val = loco_get_rice(&rc); - data[i * step] = data[i * step - step] + val; + data[i] = data[i - 1] + val; } data += stride; for (j = 1; j < height; j++) { @@ -163,7 +163,7 @@ static int loco_decode_plane(LOCOContext *l, uint8_t *data, int width, int heigh /* restore all other pixels */ for (i = 1; i < width; i++) { val = loco_get_rice(&rc); - data[i * step] = loco_predict(&data[i * step], stride, step) + val; + data[i] = loco_predict(&data[i], stride) + val; } data += stride; } @@ -171,19 +171,18 @@ 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) +static void rotate_faulty_loco(uint8_t *data, int width, int height, int stride) { int y; for (y=1; y=y) { memmove(data + y*stride, - data + y*(stride + step), - step*(width-y)); + data + y*(stride + 1), + (width-y)); if (y+1 < height) - memmove(data + y*stride + step*(width-y), - data + (y+1)*stride, - step*y); + memmove(data + y*stride + (width-y), + data + (y+1)*stride, y); } } } @@ -209,49 +208,49 @@ static int decode_frame(AVCodecContext *avctx, switch(l->mode) { case LOCO_CYUY2: case LOCO_YUY2: case LOCO_UYVY: decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height, - p->linesize[0], buf, buf_size, 1); + p->linesize[0], buf, buf_size); ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height, - p->linesize[1], buf, buf_size, 1); + p->linesize[1], buf, buf_size); ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height, - p->linesize[2], buf, buf_size, 1); + p->linesize[2], buf, buf_size); break; case LOCO_CYV12: case LOCO_YV12: decoded = loco_decode_plane(l, p->data[0], avctx->width, avctx->height, - p->linesize[0], buf, buf_size, 1); + p->linesize[0], buf, buf_size); ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[2], avctx->width / 2, avctx->height / 2, - p->linesize[2], buf, buf_size, 1); + p->linesize[2], buf, buf_size); ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[1], avctx->width / 2, avctx->height / 2, - p->linesize[1], buf, buf_size, 1); + p->linesize[1], buf, buf_size); break; case LOCO_CRGB: case LOCO_RGB: + decoded = loco_decode_plane(l, p->data[1] + p->linesize[1]*(avctx->height-1), avctx->width, avctx->height, + -p->linesize[1], buf, buf_size); + ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height, - -p->linesize[0], buf, buf_size, 3); + -p->linesize[0], buf, buf_size); ADVANCE_BY_DECODED; - decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 1, avctx->width, avctx->height, - -p->linesize[0], buf, buf_size, 3); - 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); + decoded = loco_decode_plane(l, p->data[2] + p->linesize[2]*(avctx->height-1), avctx->width, avctx->height, + -p->linesize[2], buf, buf_size); if (avctx->width & 1) - rotate_faulty_loco(p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height, -p->linesize[0], 3); + rotate_faulty_loco(p->data[1] + p->linesize[1]*(avctx->height-1), avctx->width, avctx->height, -p->linesize[1]); break; case LOCO_CRGBA: case LOCO_RGBA: + decoded = loco_decode_plane(l, p->data[1] + p->linesize[1]*(avctx->height-1), avctx->width, avctx->height, + -p->linesize[1], buf, buf_size); + ADVANCE_BY_DECODED; decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1), avctx->width, avctx->height, - -p->linesize[0], buf, buf_size, 4); + -p->linesize[0], buf, buf_size); ADVANCE_BY_DECODED; - decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 1, avctx->width, avctx->height, - -p->linesize[0], buf, buf_size, 4); + decoded = loco_decode_plane(l, p->data[2] + p->linesize[2]*(avctx->height-1), avctx->width, avctx->height, + -p->linesize[2], buf, buf_size); 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, 4); - ADVANCE_BY_DECODED; - decoded = loco_decode_plane(l, p->data[0] + p->linesize[0]*(avctx->height-1) + 3, avctx->width, avctx->height, - -p->linesize[0], buf, buf_size, 4); + decoded = loco_decode_plane(l, p->data[3] + p->linesize[3]*(avctx->height-1), avctx->width, avctx->height, + -p->linesize[3], buf, buf_size); break; default: av_assert0(0); @@ -302,7 +301,7 @@ static av_cold int decode_init(AVCodecContext *avctx) break; case LOCO_CRGB: case LOCO_RGB: - avctx->pix_fmt = AV_PIX_FMT_BGR24; + avctx->pix_fmt = AV_PIX_FMT_GBRP; break; case LOCO_CYV12: case LOCO_YV12: @@ -310,7 +309,7 @@ static av_cold int decode_init(AVCodecContext *avctx) break; case LOCO_CRGBA: case LOCO_RGBA: - avctx->pix_fmt = AV_PIX_FMT_BGRA; + avctx->pix_fmt = AV_PIX_FMT_GBRAP; break; default: av_log(avctx, AV_LOG_INFO, "Unknown colorspace, index = %i\n", l->mode); diff --git a/tests/ref/fate/loco-rgb b/tests/ref/fate/loco-rgb index 289e73f7ed..446f5d83cb 100644 --- a/tests/ref/fate/loco-rgb +++ b/tests/ref/fate/loco-rgb @@ -3,8 +3,8 @@ #codec_id 0: rawvideo #dimensions 0: 188x128 #sar 0: 0/1 -0, 0, 0, 1, 72192, 0x1847500c -0, 1, 1, 1, 72192, 0x1b0e2e87 -0, 2, 2, 1, 72192, 0x293276c8 -0, 3, 3, 1, 72192, 0x743b9705 -0, 4, 4, 1, 72192, 0xcc1b2530 +0, 0, 0, 1, 72192, 0xbe9f500c +0, 1, 1, 1, 72192, 0xafc82e87 +0, 2, 2, 1, 72192, 0x3a2476c8 +0, 3, 3, 1, 72192, 0x1fda9705 +0, 4, 4, 1, 72192, 0x46b82530