Skip to content

Commit 3bf373c

Browse files
committed
0.20230818: fix 'DCT coefficient out of range'
1 parent 36578c8 commit 3bf373c

File tree

2 files changed

+38
-10
lines changed

2 files changed

+38
-10
lines changed

Makefile

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
APPNAME ?= jpegqs
22
MPFLAGS ?= -fopenmp
3-
CFLAGS ?= -Wall -O2 $(MPFLAGS) -DAPPNAME=$(APPNAME)
4-
LDFLAGS ?= -ljpeg -lm
3+
CFLAGS ?= -Wall -O3 $(MPFLAGS) -DAPPNAME=$(APPNAME)
4+
LDFLAGS ?= -ljpeg -lm -s
55
SRCS = src
6+
OBJS = $(SRCS)/idct.o $(SRCS)/libjpegqs.o
7+
OBJB = $(SRCS)/jpegqs.o
68

79
ifneq ($(shell uname -m), i386)
810
CFLAGS += -fPIC
@@ -16,16 +18,16 @@ PLIBS = lib$(APPNAME).a lib$(APPNAME).so.0
1618
all: $(PLIBS) $(PROGS)
1719

1820
clean:
19-
rm -rf $(PLIBS) $(PROGS) $(SRCS)/*.o
21+
rm -rf $(PLIBS) $(PROGS) $(OBJS) $(OBJB)
2022

21-
lib$(APPNAME).a: $(SRCS)/idct.o $(SRCS)/libjpegqs.o
23+
lib$(APPNAME).a: $(OBJS)
2224
$(AR) rcs $@ $^
2325

24-
lib$(APPNAME).so.0: $(SRCS)/idct.o $(SRCS)/libjpegqs.o
25-
$(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS) -s
26+
lib$(APPNAME).so.0: $(OBJS)
27+
$(CC) $(CFLAGS) -shared $^ -o $@ $(LDFLAGS)
2628

27-
$(APPNAME): $(SRCS)/jpegqs.o lib$(APPNAME).so.0
28-
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) -s
29+
$(APPNAME): $(OBJB) lib$(APPNAME).so.0
30+
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
2931

30-
$(APPNAME)-static: $(SRCS)/jpegqs.c lib$(APPNAME).a
31-
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS) -s
32+
$(APPNAME)-static: $(OBJB) lib$(APPNAME).a
33+
$(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)

src/libjpegqs.c

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -302,6 +302,32 @@ void quantsmooth_transform(j_decompress_ptr srcinfo, jvirt_barray_ptr *src_coef_
302302
}
303303
}
304304
} // iter
305+
306+
// fix a rare JERR_BAD_DCT_COEF ("DCT coefficient out of range") error
307+
// it doesn't take much time
308+
#ifdef _OPENMP
309+
# pragma omp parallel for schedule(dynamic)
310+
#endif
311+
for (blk_y = 0; blk_y < comp_height; blk_y++)
312+
{
313+
JDIMENSION blk_x;
314+
JBLOCKARRAY buffer = (*srcinfo->mem->access_virt_barray)
315+
((j_common_ptr)srcinfo, src_coef_arrays[ci], blk_y, 1, TRUE);
316+
317+
for (blk_x = 0; blk_x < comp_width; blk_x++)
318+
{
319+
JCOEFPTR coef = buffer[0][blk_x]; int i;
320+
for (i = 0; i < DCTSIZE2; i++)
321+
{
322+
// MAX_COEF_BITS = BITS_IN_JSAMPLE + 2
323+
int lim = (4 << BITS_IN_JSAMPLE) - 1;
324+
int a = coef[i];
325+
a = (a < -lim) ? -lim : (a < lim) ? a : lim;
326+
coef[i] = a;
327+
}
328+
}
329+
}
330+
305331
#undef IMAGEPTR
306332
free(image - 7);
307333
}

0 commit comments

Comments
 (0)