uint32_t lx = *plx,
ly = *ply;
+ if (y >= avctx->height)
+ return AVERROR_INVALIDDATA;
+
switch (ptype) {
case 0:
while (run-- > 0) {
- if (y >= avctx->height)
- return AVERROR_INVALIDDATA;
-
dst[y * linesize + x] = clr;
lx = x;
ly = y;
if (x >= avctx->width) {
x = 0;
(y)++;
+ if (y >= avctx->height && run)
+ return AVERROR_INVALIDDATA;
}
}
break;
case 1:
while (run-- > 0) {
- if (y >= avctx->height)
- return AVERROR_INVALIDDATA;
-
dst[y * linesize + x] = dst[ly * linesize + lx];
lx = x;
ly = y;
if (x >= avctx->width) {
x = 0;
(y)++;
+ if (y >= avctx->height && run)
+ return AVERROR_INVALIDDATA;
}
}
clr = dst[ly * linesize + lx];
break;
case 2:
- while (run-- > 0) {
- if (y < 1 || y >= avctx->height)
- return AVERROR_INVALIDDATA;
+ if (y < 1)
+ return AVERROR_INVALIDDATA;
+ while (run-- > 0) {
clr = dst[y * linesize + x + off + 1];
dst[y * linesize + x] = clr;
lx = x;
if (x >= avctx->width) {
x = 0;
(y)++;
+ if (y >= avctx->height && run)
+ return AVERROR_INVALIDDATA;
}
}
break;
case 4:
+ if (y < 1 || (y == 1 && x == 0))
+ return AVERROR_INVALIDDATA;
+
while (run-- > 0) {
uint8_t *odst = (uint8_t *)dst;
-
- if (y < 1 || y >= avctx->height ||
- (y == 1 && x == 0))
- return AVERROR_INVALIDDATA;
+ int off1 = (ly * linesize + lx) * 4;
+ int off2 = ((y * linesize + x) + off) * 4;
if (x == 0) {
- z = backstep;
+ z = backstep * 4;
} else {
z = 0;
}
- r = odst[(ly * linesize + lx) * 4] +
- odst[((y * linesize + x) + off) * 4 + 4] -
- odst[((y * linesize + x) + off - z) * 4];
- g = odst[(ly * linesize + lx) * 4 + 1] +
- odst[((y * linesize + x) + off) * 4 + 5] -
- odst[((y * linesize + x) + off - z) * 4 + 1];
- b = odst[(ly * linesize + lx) * 4 + 2] +
- odst[((y * linesize + x) + off) * 4 + 6] -
- odst[((y * linesize + x) + off - z) * 4 + 2];
+ r = odst[off1] +
+ odst[off2 + 4] -
+ odst[off2 - z ];
+ g = odst[off1 + 1] +
+ odst[off2 + 5] -
+ odst[off2 - z + 1];
+ b = odst[off1 + 2] +
+ odst[off2 + 6] -
+ odst[off2 - z + 2];
clr = ((b & 0xFF) << 16) + ((g & 0xFF) << 8) + (r & 0xFF);
dst[y * linesize + x] = clr;
lx = x;
if (x >= avctx->width) {
x = 0;
(y)++;
+ if (y >= avctx->height && run)
+ return AVERROR_INVALIDDATA;
}
}
break;
case 5:
- while (run-- > 0) {
- if (y < 1 || y >= avctx->height ||
- (y == 1 && x == 0))
- return AVERROR_INVALIDDATA;
+ if (y < 1 || (y == 1 && x == 0))
+ return AVERROR_INVALIDDATA;
+ while (run-- > 0) {
if (x == 0) {
z = backstep;
} else {
if (x >= avctx->width) {
x = 0;
(y)++;
+ if (y >= avctx->height && run)
+ return AVERROR_INVALIDDATA;
}
}
break;