Browse Source

avcodec/pictordec: avoid pointers in picmemset()

Improves overall speed by about 3%
Testcase: 14124/clusterfuzz-testcase-minimized-ffmpeg_AV_CODEC_ID_PICTOR_fuzzer-5633887734071296

Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
tags/n4.2
Michael Niedermayer 6 years ago
parent
commit
3ed360ea5c
1 changed files with 18 additions and 11 deletions
  1. +18
    -11
      libavcodec/pictordec.c

+ 18
- 11
libavcodec/pictordec.c View File

@@ -63,22 +63,25 @@ static void picmemset(PicContext *s, AVFrame *frame, unsigned value, int run,
uint8_t *d;
int shift = *plane * bits_per_plane;
unsigned mask = ((1U << bits_per_plane) - 1) << shift;
int xl = *x;
int yl = *y;
int planel = *plane;
value <<= shift;

while (run > 0) {
int j;
for (j = 8-bits_per_plane; j >= 0; j -= bits_per_plane) {
d = frame->data[0] + *y * frame->linesize[0];
d[*x] |= (value >> j) & mask;
*x += 1;
if (*x == s->width) {
*y -= 1;
*x = 0;
if (*y < 0) {
*y = s->height - 1;
*plane += 1;
if (*plane >= s->nb_planes)
return;
d = frame->data[0] + yl * frame->linesize[0];
d[xl] |= (value >> j) & mask;
xl += 1;
if (xl == s->width) {
yl -= 1;
xl = 0;
if (yl < 0) {
yl = s->height - 1;
planel += 1;
if (planel >= s->nb_planes)
goto end;
value <<= bits_per_plane;
mask <<= bits_per_plane;
}
@@ -86,6 +89,10 @@ static void picmemset(PicContext *s, AVFrame *frame, unsigned value, int run,
}
run--;
}
end:
*x = xl;
*y = yl;
*plane = planel;
}

static const uint8_t cga_mode45_index[6][4] = {


Loading…
Cancel
Save