Browse code

Don't use ff_cropTbl[] for IDCT.

Results of IDCT can by far outreach the range of ff_cropTbl[], leading
to overreads and potentially crashes.

Found-by: Mateusz "j00ru" Jurczyk and Gynvael Coldwind
CC: libav-stable@libav.org

Ronald S. Bultje authored on 2012/03/06 09:01:19
Showing 9 changed files
... ...
@@ -366,18 +366,17 @@ void ff_put_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
366 366
                              int line_size)
367 367
 {
368 368
     int i;
369
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
370 369
 
371 370
     /* read the pixels */
372 371
     for(i=0;i<8;i++) {
373
-        pixels[0] = cm[block[0]];
374
-        pixels[1] = cm[block[1]];
375
-        pixels[2] = cm[block[2]];
376
-        pixels[3] = cm[block[3]];
377
-        pixels[4] = cm[block[4]];
378
-        pixels[5] = cm[block[5]];
379
-        pixels[6] = cm[block[6]];
380
-        pixels[7] = cm[block[7]];
372
+        pixels[0] = av_clip_uint8(block[0]);
373
+        pixels[1] = av_clip_uint8(block[1]);
374
+        pixels[2] = av_clip_uint8(block[2]);
375
+        pixels[3] = av_clip_uint8(block[3]);
376
+        pixels[4] = av_clip_uint8(block[4]);
377
+        pixels[5] = av_clip_uint8(block[5]);
378
+        pixels[6] = av_clip_uint8(block[6]);
379
+        pixels[7] = av_clip_uint8(block[7]);
381 380
 
382 381
         pixels += line_size;
383 382
         block += 8;
... ...
@@ -388,14 +387,13 @@ static void put_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels
388 388
                                  int line_size)
389 389
 {
390 390
     int i;
391
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
392 391
 
393 392
     /* read the pixels */
394 393
     for(i=0;i<4;i++) {
395
-        pixels[0] = cm[block[0]];
396
-        pixels[1] = cm[block[1]];
397
-        pixels[2] = cm[block[2]];
398
-        pixels[3] = cm[block[3]];
394
+        pixels[0] = av_clip_uint8(block[0]);
395
+        pixels[1] = av_clip_uint8(block[1]);
396
+        pixels[2] = av_clip_uint8(block[2]);
397
+        pixels[3] = av_clip_uint8(block[3]);
399 398
 
400 399
         pixels += line_size;
401 400
         block += 8;
... ...
@@ -406,12 +404,11 @@ static void put_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels
406 406
                                  int line_size)
407 407
 {
408 408
     int i;
409
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
410 409
 
411 410
     /* read the pixels */
412 411
     for(i=0;i<2;i++) {
413
-        pixels[0] = cm[block[0]];
414
-        pixels[1] = cm[block[1]];
412
+        pixels[0] = av_clip_uint8(block[0]);
413
+        pixels[1] = av_clip_uint8(block[1]);
415 414
 
416 415
         pixels += line_size;
417 416
         block += 8;
... ...
@@ -443,18 +440,17 @@ void ff_add_pixels_clamped_c(const DCTELEM *block, uint8_t *restrict pixels,
443 443
                              int line_size)
444 444
 {
445 445
     int i;
446
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
447 446
 
448 447
     /* read the pixels */
449 448
     for(i=0;i<8;i++) {
450
-        pixels[0] = cm[pixels[0] + block[0]];
451
-        pixels[1] = cm[pixels[1] + block[1]];
452
-        pixels[2] = cm[pixels[2] + block[2]];
453
-        pixels[3] = cm[pixels[3] + block[3]];
454
-        pixels[4] = cm[pixels[4] + block[4]];
455
-        pixels[5] = cm[pixels[5] + block[5]];
456
-        pixels[6] = cm[pixels[6] + block[6]];
457
-        pixels[7] = cm[pixels[7] + block[7]];
449
+        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
450
+        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
451
+        pixels[2] = av_clip_uint8(pixels[2] + block[2]);
452
+        pixels[3] = av_clip_uint8(pixels[3] + block[3]);
453
+        pixels[4] = av_clip_uint8(pixels[4] + block[4]);
454
+        pixels[5] = av_clip_uint8(pixels[5] + block[5]);
455
+        pixels[6] = av_clip_uint8(pixels[6] + block[6]);
456
+        pixels[7] = av_clip_uint8(pixels[7] + block[7]);
458 457
         pixels += line_size;
459 458
         block += 8;
460 459
     }
... ...
@@ -464,14 +460,13 @@ static void add_pixels_clamped4_c(const DCTELEM *block, uint8_t *restrict pixels
464 464
                           int line_size)
465 465
 {
466 466
     int i;
467
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
468 467
 
469 468
     /* read the pixels */
470 469
     for(i=0;i<4;i++) {
471
-        pixels[0] = cm[pixels[0] + block[0]];
472
-        pixels[1] = cm[pixels[1] + block[1]];
473
-        pixels[2] = cm[pixels[2] + block[2]];
474
-        pixels[3] = cm[pixels[3] + block[3]];
470
+        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
471
+        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
472
+        pixels[2] = av_clip_uint8(pixels[2] + block[2]);
473
+        pixels[3] = av_clip_uint8(pixels[3] + block[3]);
475 474
         pixels += line_size;
476 475
         block += 8;
477 476
     }
... ...
@@ -481,12 +476,11 @@ static void add_pixels_clamped2_c(const DCTELEM *block, uint8_t *restrict pixels
481 481
                           int line_size)
482 482
 {
483 483
     int i;
484
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
485 484
 
486 485
     /* read the pixels */
487 486
     for(i=0;i<2;i++) {
488
-        pixels[0] = cm[pixels[0] + block[0]];
489
-        pixels[1] = cm[pixels[1] + block[1]];
487
+        pixels[0] = av_clip_uint8(pixels[0] + block[0]);
488
+        pixels[1] = av_clip_uint8(pixels[1] + block[1]);
490 489
         pixels += line_size;
491 490
         block += 8;
492 491
     }
... ...
@@ -2733,15 +2727,11 @@ static void ff_jref_idct2_add(uint8_t *dest, int line_size, DCTELEM *block)
2733 2733
 
2734 2734
 static void ff_jref_idct1_put(uint8_t *dest, int line_size, DCTELEM *block)
2735 2735
 {
2736
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
2737
-
2738
-    dest[0] = cm[(block[0] + 4)>>3];
2736
+    dest[0] = av_clip_uint8((block[0] + 4)>>3);
2739 2737
 }
2740 2738
 static void ff_jref_idct1_add(uint8_t *dest, int line_size, DCTELEM *block)
2741 2739
 {
2742
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
2743
-
2744
-    dest[0] = cm[dest[0] + ((block[0] + 4)>>3)];
2740
+    dest[0] = av_clip_uint8(dest[0] + ((block[0] + 4)>>3));
2745 2741
 }
2746 2742
 
2747 2743
 static void just_return(void *mem av_unused, int stride av_unused, int h av_unused) { return; }
... ...
@@ -49,7 +49,6 @@ static const uint8_t scan8[16*3]={
49 49
 void FUNCC(ff_h264_idct_add)(uint8_t *_dst, DCTELEM *_block, int stride)
50 50
 {
51 51
     int i;
52
-    INIT_CLIP
53 52
     pixel *dst = (pixel*)_dst;
54 53
     dctcoef *block = (dctcoef*)_block;
55 54
     stride /= sizeof(pixel);
... ...
@@ -74,16 +73,15 @@ void FUNCC(ff_h264_idct_add)(uint8_t *_dst, DCTELEM *_block, int stride)
74 74
         const int z2= (block[1 + 4*i]>>1) -  block[3 + 4*i];
75 75
         const int z3=  block[1 + 4*i]     + (block[3 + 4*i]>>1);
76 76
 
77
-        dst[i + 0*stride]= CLIP(dst[i + 0*stride] + ((z0 + z3) >> 6));
78
-        dst[i + 1*stride]= CLIP(dst[i + 1*stride] + ((z1 + z2) >> 6));
79
-        dst[i + 2*stride]= CLIP(dst[i + 2*stride] + ((z1 - z2) >> 6));
80
-        dst[i + 3*stride]= CLIP(dst[i + 3*stride] + ((z0 - z3) >> 6));
77
+        dst[i + 0*stride]= av_clip_pixel(dst[i + 0*stride] + ((z0 + z3) >> 6));
78
+        dst[i + 1*stride]= av_clip_pixel(dst[i + 1*stride] + ((z1 + z2) >> 6));
79
+        dst[i + 2*stride]= av_clip_pixel(dst[i + 2*stride] + ((z1 - z2) >> 6));
80
+        dst[i + 3*stride]= av_clip_pixel(dst[i + 3*stride] + ((z0 - z3) >> 6));
81 81
     }
82 82
 }
83 83
 
84 84
 void FUNCC(ff_h264_idct8_add)(uint8_t *_dst, DCTELEM *_block, int stride){
85 85
     int i;
86
-    INIT_CLIP
87 86
     pixel *dst = (pixel*)_dst;
88 87
     dctcoef *block = (dctcoef*)_block;
89 88
     stride /= sizeof(pixel);
... ...
@@ -143,14 +141,14 @@ void FUNCC(ff_h264_idct8_add)(uint8_t *_dst, DCTELEM *_block, int stride){
143 143
         const int b5 = (a3>>2) - a5;
144 144
         const int b7 =  a7 - (a1>>2);
145 145
 
146
-        dst[i + 0*stride] = CLIP( dst[i + 0*stride] + ((b0 + b7) >> 6) );
147
-        dst[i + 1*stride] = CLIP( dst[i + 1*stride] + ((b2 + b5) >> 6) );
148
-        dst[i + 2*stride] = CLIP( dst[i + 2*stride] + ((b4 + b3) >> 6) );
149
-        dst[i + 3*stride] = CLIP( dst[i + 3*stride] + ((b6 + b1) >> 6) );
150
-        dst[i + 4*stride] = CLIP( dst[i + 4*stride] + ((b6 - b1) >> 6) );
151
-        dst[i + 5*stride] = CLIP( dst[i + 5*stride] + ((b4 - b3) >> 6) );
152
-        dst[i + 6*stride] = CLIP( dst[i + 6*stride] + ((b2 - b5) >> 6) );
153
-        dst[i + 7*stride] = CLIP( dst[i + 7*stride] + ((b0 - b7) >> 6) );
146
+        dst[i + 0*stride] = av_clip_pixel( dst[i + 0*stride] + ((b0 + b7) >> 6) );
147
+        dst[i + 1*stride] = av_clip_pixel( dst[i + 1*stride] + ((b2 + b5) >> 6) );
148
+        dst[i + 2*stride] = av_clip_pixel( dst[i + 2*stride] + ((b4 + b3) >> 6) );
149
+        dst[i + 3*stride] = av_clip_pixel( dst[i + 3*stride] + ((b6 + b1) >> 6) );
150
+        dst[i + 4*stride] = av_clip_pixel( dst[i + 4*stride] + ((b6 - b1) >> 6) );
151
+        dst[i + 5*stride] = av_clip_pixel( dst[i + 5*stride] + ((b4 - b3) >> 6) );
152
+        dst[i + 6*stride] = av_clip_pixel( dst[i + 6*stride] + ((b2 - b5) >> 6) );
153
+        dst[i + 7*stride] = av_clip_pixel( dst[i + 7*stride] + ((b0 - b7) >> 6) );
154 154
     }
155 155
 }
156 156
 
... ...
@@ -158,13 +156,12 @@ void FUNCC(ff_h264_idct8_add)(uint8_t *_dst, DCTELEM *_block, int stride){
158 158
 void FUNCC(ff_h264_idct_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
159 159
     int i, j;
160 160
     int dc = (((dctcoef*)block)[0] + 32) >> 6;
161
-    INIT_CLIP
162 161
     pixel *dst = (pixel*)_dst;
163 162
     stride /= sizeof(pixel);
164 163
     for( j = 0; j < 4; j++ )
165 164
     {
166 165
         for( i = 0; i < 4; i++ )
167
-            dst[i] = CLIP( dst[i] + dc );
166
+            dst[i] = av_clip_pixel( dst[i] + dc );
168 167
         dst += stride;
169 168
     }
170 169
 }
... ...
@@ -172,13 +169,12 @@ void FUNCC(ff_h264_idct_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
172 172
 void FUNCC(ff_h264_idct8_dc_add)(uint8_t *_dst, DCTELEM *block, int stride){
173 173
     int i, j;
174 174
     int dc = (((dctcoef*)block)[0] + 32) >> 6;
175
-    INIT_CLIP
176 175
     pixel *dst = (pixel*)_dst;
177 176
     stride /= sizeof(pixel);
178 177
     for( j = 0; j < 8; j++ )
179 178
     {
180 179
         for( i = 0; i < 8; i++ )
181
-            dst[i] = CLIP( dst[i] + dc );
180
+            dst[i] = av_clip_pixel( dst[i] + dc );
182 181
         dst += stride;
183 182
     }
184 183
 }
... ...
@@ -55,7 +55,6 @@ static av_always_inline void rv34_row_transform(int temp[16], DCTELEM *block)
55 55
  */
56 56
 static void rv34_idct_add_c(uint8_t *dst, ptrdiff_t stride, DCTELEM *block){
57 57
     int      temp[16];
58
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
59 58
     int      i;
60 59
 
61 60
     rv34_row_transform(temp, block);
... ...
@@ -67,10 +66,10 @@ static void rv34_idct_add_c(uint8_t *dst, ptrdiff_t stride, DCTELEM *block){
67 67
         const int z2 =  7* temp[4*1+i] - 17*temp[4*3+i];
68 68
         const int z3 = 17* temp[4*1+i] +  7*temp[4*3+i];
69 69
 
70
-        dst[0] = cm[ dst[0] + ( (z0 + z3) >> 10 ) ];
71
-        dst[1] = cm[ dst[1] + ( (z1 + z2) >> 10 ) ];
72
-        dst[2] = cm[ dst[2] + ( (z1 - z2) >> 10 ) ];
73
-        dst[3] = cm[ dst[3] + ( (z0 - z3) >> 10 ) ];
70
+        dst[0] = av_clip_uint8( dst[0] + ( (z0 + z3) >> 10 ) );
71
+        dst[1] = av_clip_uint8( dst[1] + ( (z1 + z2) >> 10 ) );
72
+        dst[2] = av_clip_uint8( dst[2] + ( (z1 - z2) >> 10 ) );
73
+        dst[3] = av_clip_uint8( dst[3] + ( (z0 - z3) >> 10 ) );
74 74
 
75 75
         dst  += stride;
76 76
     }
... ...
@@ -103,15 +102,13 @@ static void rv34_inv_transform_noround_c(DCTELEM *block){
103 103
 
104 104
 static void rv34_idct_dc_add_c(uint8_t *dst, ptrdiff_t stride, int dc)
105 105
 {
106
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
107 106
     int i, j;
108 107
 
109
-    cm += (13*13*dc + 0x200) >> 10;
110
-
108
+    dc = (13*13*dc + 0x200) >> 10;
111 109
     for (i = 0; i < 4; i++)
112 110
     {
113 111
         for (j = 0; j < 4; j++)
114
-            dst[j] = cm[ dst[j] ];
112
+            dst[j] = av_clip_uint8( dst[j] + dc );
115 113
 
116 114
         dst += stride;
117 115
     }
... ...
@@ -53,7 +53,6 @@
53 53
 static inline void idct4col_put(uint8_t *dest, int line_size, const DCTELEM *col)
54 54
 {
55 55
     int c0, c1, c2, c3, a0, a1, a2, a3;
56
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
57 56
 
58 57
     a0 = col[8*0];
59 58
     a1 = col[8*2];
... ...
@@ -63,13 +62,13 @@ static inline void idct4col_put(uint8_t *dest, int line_size, const DCTELEM *col
63 63
     c2 = ((a0 - a2) << (CN_SHIFT - 1)) + (1 << (C_SHIFT - 1));
64 64
     c1 = a1 * C1 + a3 * C2;
65 65
     c3 = a1 * C2 - a3 * C1;
66
-    dest[0] = cm[(c0 + c1) >> C_SHIFT];
66
+    dest[0] = av_clip_uint8((c0 + c1) >> C_SHIFT);
67 67
     dest += line_size;
68
-    dest[0] = cm[(c2 + c3) >> C_SHIFT];
68
+    dest[0] = av_clip_uint8((c2 + c3) >> C_SHIFT);
69 69
     dest += line_size;
70
-    dest[0] = cm[(c2 - c3) >> C_SHIFT];
70
+    dest[0] = av_clip_uint8((c2 - c3) >> C_SHIFT);
71 71
     dest += line_size;
72
-    dest[0] = cm[(c0 - c1) >> C_SHIFT];
72
+    dest[0] = av_clip_uint8((c0 - c1) >> C_SHIFT);
73 73
 }
74 74
 
75 75
 #define BF(k) \
... ...
@@ -133,7 +132,6 @@ void ff_simple_idct248_put(uint8_t *dest, int line_size, DCTELEM *block)
133 133
 static inline void idct4col_add(uint8_t *dest, int line_size, const DCTELEM *col)
134 134
 {
135 135
     int c0, c1, c2, c3, a0, a1, a2, a3;
136
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
137 136
 
138 137
     a0 = col[8*0];
139 138
     a1 = col[8*1];
... ...
@@ -143,13 +141,13 @@ static inline void idct4col_add(uint8_t *dest, int line_size, const DCTELEM *col
143 143
     c2 = (a0 - a2)*C3 + (1 << (C_SHIFT - 1));
144 144
     c1 = a1 * C1 + a3 * C2;
145 145
     c3 = a1 * C2 - a3 * C1;
146
-    dest[0] = cm[dest[0] + ((c0 + c1) >> C_SHIFT)];
146
+    dest[0] = av_clip_uint8(dest[0] + ((c0 + c1) >> C_SHIFT));
147 147
     dest += line_size;
148
-    dest[0] = cm[dest[0] + ((c2 + c3) >> C_SHIFT)];
148
+    dest[0] = av_clip_uint8(dest[0] + ((c2 + c3) >> C_SHIFT));
149 149
     dest += line_size;
150
-    dest[0] = cm[dest[0] + ((c2 - c3) >> C_SHIFT)];
150
+    dest[0] = av_clip_uint8(dest[0] + ((c2 - c3) >> C_SHIFT));
151 151
     dest += line_size;
152
-    dest[0] = cm[dest[0] + ((c0 - c1) >> C_SHIFT)];
152
+    dest[0] = av_clip_uint8(dest[0] + ((c0 - c1) >> C_SHIFT));
153 153
 }
154 154
 
155 155
 #define RN_SHIFT 15
... ...
@@ -161,7 +159,6 @@ static inline void idct4col_add(uint8_t *dest, int line_size, const DCTELEM *col
161 161
 static inline void idct4row(DCTELEM *row)
162 162
 {
163 163
     int c0, c1, c2, c3, a0, a1, a2, a3;
164
-    //const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
165 164
 
166 165
     a0 = row[0];
167 166
     a1 = row[1];
... ...
@@ -224,50 +224,48 @@ static inline void FUNC(idctSparseColPut)(pixel *dest, int line_size,
224 224
                                           DCTELEM *col)
225 225
 {
226 226
     int a0, a1, a2, a3, b0, b1, b2, b3;
227
-    INIT_CLIP;
228 227
 
229 228
     IDCT_COLS;
230 229
 
231
-    dest[0] = CLIP((a0 + b0) >> COL_SHIFT);
230
+    dest[0] = av_clip_pixel((a0 + b0) >> COL_SHIFT);
232 231
     dest += line_size;
233
-    dest[0] = CLIP((a1 + b1) >> COL_SHIFT);
232
+    dest[0] = av_clip_pixel((a1 + b1) >> COL_SHIFT);
234 233
     dest += line_size;
235
-    dest[0] = CLIP((a2 + b2) >> COL_SHIFT);
234
+    dest[0] = av_clip_pixel((a2 + b2) >> COL_SHIFT);
236 235
     dest += line_size;
237
-    dest[0] = CLIP((a3 + b3) >> COL_SHIFT);
236
+    dest[0] = av_clip_pixel((a3 + b3) >> COL_SHIFT);
238 237
     dest += line_size;
239
-    dest[0] = CLIP((a3 - b3) >> COL_SHIFT);
238
+    dest[0] = av_clip_pixel((a3 - b3) >> COL_SHIFT);
240 239
     dest += line_size;
241
-    dest[0] = CLIP((a2 - b2) >> COL_SHIFT);
240
+    dest[0] = av_clip_pixel((a2 - b2) >> COL_SHIFT);
242 241
     dest += line_size;
243
-    dest[0] = CLIP((a1 - b1) >> COL_SHIFT);
242
+    dest[0] = av_clip_pixel((a1 - b1) >> COL_SHIFT);
244 243
     dest += line_size;
245
-    dest[0] = CLIP((a0 - b0) >> COL_SHIFT);
244
+    dest[0] = av_clip_pixel((a0 - b0) >> COL_SHIFT);
246 245
 }
247 246
 
248 247
 static inline void FUNC(idctSparseColAdd)(pixel *dest, int line_size,
249 248
                                           DCTELEM *col)
250 249
 {
251 250
     int a0, a1, a2, a3, b0, b1, b2, b3;
252
-    INIT_CLIP;
253 251
 
254 252
     IDCT_COLS;
255 253
 
256
-    dest[0] = CLIP(dest[0] + ((a0 + b0) >> COL_SHIFT));
254
+    dest[0] = av_clip_pixel(dest[0] + ((a0 + b0) >> COL_SHIFT));
257 255
     dest += line_size;
258
-    dest[0] = CLIP(dest[0] + ((a1 + b1) >> COL_SHIFT));
256
+    dest[0] = av_clip_pixel(dest[0] + ((a1 + b1) >> COL_SHIFT));
259 257
     dest += line_size;
260
-    dest[0] = CLIP(dest[0] + ((a2 + b2) >> COL_SHIFT));
258
+    dest[0] = av_clip_pixel(dest[0] + ((a2 + b2) >> COL_SHIFT));
261 259
     dest += line_size;
262
-    dest[0] = CLIP(dest[0] + ((a3 + b3) >> COL_SHIFT));
260
+    dest[0] = av_clip_pixel(dest[0] + ((a3 + b3) >> COL_SHIFT));
263 261
     dest += line_size;
264
-    dest[0] = CLIP(dest[0] + ((a3 - b3) >> COL_SHIFT));
262
+    dest[0] = av_clip_pixel(dest[0] + ((a3 - b3) >> COL_SHIFT));
265 263
     dest += line_size;
266
-    dest[0] = CLIP(dest[0] + ((a2 - b2) >> COL_SHIFT));
264
+    dest[0] = av_clip_pixel(dest[0] + ((a2 - b2) >> COL_SHIFT));
267 265
     dest += line_size;
268
-    dest[0] = CLIP(dest[0] + ((a1 - b1) >> COL_SHIFT));
266
+    dest[0] = av_clip_pixel(dest[0] + ((a1 - b1) >> COL_SHIFT));
269 267
     dest += line_size;
270
-    dest[0] = CLIP(dest[0] + ((a0 - b0) >> COL_SHIFT));
268
+    dest[0] = av_clip_pixel(dest[0] + ((a0 - b0) >> COL_SHIFT));
271 269
 }
272 270
 
273 271
 static inline void FUNC(idctSparseCol)(DCTELEM *col)
... ...
@@ -173,7 +173,6 @@ void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
173 173
 {
174 174
     const int qmul = svq3_dequant_coeff[qp];
175 175
     int i;
176
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
177 176
 
178 177
     if (dc) {
179 178
         dc = 13*13*((dc == 1) ? 1538*block[0] : ((qmul*(block[0] >> 3)) / 2));
... ...
@@ -199,10 +198,10 @@ void ff_svq3_add_idct_c(uint8_t *dst, DCTELEM *block, int stride, int qp,
199 199
         const int z3 = 17* block[i + 4*1] +  7*block[i + 4*3];
200 200
         const int rr = (dc + 0x80000);
201 201
 
202
-        dst[i + stride*0] = cm[ dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) ];
203
-        dst[i + stride*1] = cm[ dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) ];
204
-        dst[i + stride*2] = cm[ dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) ];
205
-        dst[i + stride*3] = cm[ dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) ];
202
+        dst[i + stride*0] = av_clip_uint8( dst[i + stride*0] + (((z0 + z3)*qmul + rr) >> 20) );
203
+        dst[i + stride*1] = av_clip_uint8( dst[i + stride*1] + (((z1 + z2)*qmul + rr) >> 20) );
204
+        dst[i + stride*2] = av_clip_uint8( dst[i + stride*2] + (((z1 - z2)*qmul + rr) >> 20) );
205
+        dst[i + stride*3] = av_clip_uint8( dst[i + stride*3] + (((z0 - z3)*qmul + rr) >> 20) );
206 206
     }
207 207
 }
208 208
 
... ...
@@ -139,8 +139,6 @@ static void vc1_h_s_overlap_c(DCTELEM *left, DCTELEM *right)
139 139
  * @see 8.6
140 140
  */
141 141
 static av_always_inline int vc1_filter_line(uint8_t* src, int stride, int pq){
142
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
143
-
144 142
     int a0 = (2*(src[-2*stride] - src[ 1*stride]) - 5*(src[-1*stride] - src[ 0*stride]) + 4) >> 3;
145 143
     int a0_sign = a0 >> 31;        /* Store sign */
146 144
     a0 = (a0 ^ a0_sign) - a0_sign; /* a0 = FFABS(a0); */
... ...
@@ -163,8 +161,8 @@ static av_always_inline int vc1_filter_line(uint8_t* src, int stride, int pq){
163 163
                 else{
164 164
                     d = FFMIN(d, clip);
165 165
                     d = (d ^ d_sign) - d_sign;          /* Restore sign */
166
-                    src[-1*stride] = cm[src[-1*stride] - d];
167
-                    src[ 0*stride] = cm[src[ 0*stride] + d];
166
+                    src[-1*stride] = av_clip_uint8(src[-1*stride] - d);
167
+                    src[ 0*stride] = av_clip_uint8(src[ 0*stride] + d);
168 168
                 }
169 169
                 return 1;
170 170
             }
... ...
@@ -234,19 +232,17 @@ static void vc1_inv_trans_8x8_dc_c(uint8_t *dest, int linesize, DCTELEM *block)
234 234
 {
235 235
     int i;
236 236
     int dc = block[0];
237
-    const uint8_t *cm;
238 237
     dc = (3 * dc +  1) >> 1;
239 238
     dc = (3 * dc + 16) >> 5;
240
-    cm = ff_cropTbl + MAX_NEG_CROP + dc;
241 239
     for(i = 0; i < 8; i++){
242
-        dest[0] = cm[dest[0]];
243
-        dest[1] = cm[dest[1]];
244
-        dest[2] = cm[dest[2]];
245
-        dest[3] = cm[dest[3]];
246
-        dest[4] = cm[dest[4]];
247
-        dest[5] = cm[dest[5]];
248
-        dest[6] = cm[dest[6]];
249
-        dest[7] = cm[dest[7]];
240
+        dest[0] = av_clip_uint8(dest[0] + dc);
241
+        dest[1] = av_clip_uint8(dest[1] + dc);
242
+        dest[2] = av_clip_uint8(dest[2] + dc);
243
+        dest[3] = av_clip_uint8(dest[3] + dc);
244
+        dest[4] = av_clip_uint8(dest[4] + dc);
245
+        dest[5] = av_clip_uint8(dest[5] + dc);
246
+        dest[6] = av_clip_uint8(dest[6] + dc);
247
+        dest[7] = av_clip_uint8(dest[7] + dc);
250 248
         dest += linesize;
251 249
     }
252 250
 }
... ...
@@ -326,19 +322,17 @@ static void vc1_inv_trans_8x4_dc_c(uint8_t *dest, int linesize, DCTELEM *block)
326 326
 {
327 327
     int i;
328 328
     int dc = block[0];
329
-    const uint8_t *cm;
330 329
     dc = ( 3 * dc +  1) >> 1;
331 330
     dc = (17 * dc + 64) >> 7;
332
-    cm = ff_cropTbl + MAX_NEG_CROP + dc;
333 331
     for(i = 0; i < 4; i++){
334
-        dest[0] = cm[dest[0]];
335
-        dest[1] = cm[dest[1]];
336
-        dest[2] = cm[dest[2]];
337
-        dest[3] = cm[dest[3]];
338
-        dest[4] = cm[dest[4]];
339
-        dest[5] = cm[dest[5]];
340
-        dest[6] = cm[dest[6]];
341
-        dest[7] = cm[dest[7]];
332
+        dest[0] = av_clip_uint8(dest[0] + dc);
333
+        dest[1] = av_clip_uint8(dest[1] + dc);
334
+        dest[2] = av_clip_uint8(dest[2] + dc);
335
+        dest[3] = av_clip_uint8(dest[3] + dc);
336
+        dest[4] = av_clip_uint8(dest[4] + dc);
337
+        dest[5] = av_clip_uint8(dest[5] + dc);
338
+        dest[6] = av_clip_uint8(dest[6] + dc);
339
+        dest[7] = av_clip_uint8(dest[7] + dc);
342 340
         dest += linesize;
343 341
     }
344 342
 }
... ...
@@ -348,7 +342,6 @@ static void vc1_inv_trans_8x4_c(uint8_t *dest, int linesize, DCTELEM *block)
348 348
     int i;
349 349
     register int t1,t2,t3,t4,t5,t6,t7,t8;
350 350
     DCTELEM *src, *dst;
351
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
352 351
 
353 352
     src = block;
354 353
     dst = block;
... ...
@@ -388,10 +381,10 @@ static void vc1_inv_trans_8x4_c(uint8_t *dest, int linesize, DCTELEM *block)
388 388
         t3 = 22 * src[ 8] + 10 * src[24];
389 389
         t4 = 22 * src[24] - 10 * src[ 8];
390 390
 
391
-        dest[0*linesize] = cm[dest[0*linesize] + ((t1 + t3) >> 7)];
392
-        dest[1*linesize] = cm[dest[1*linesize] + ((t2 - t4) >> 7)];
393
-        dest[2*linesize] = cm[dest[2*linesize] + ((t2 + t4) >> 7)];
394
-        dest[3*linesize] = cm[dest[3*linesize] + ((t1 - t3) >> 7)];
391
+        dest[0*linesize] = av_clip_uint8(dest[0*linesize] + ((t1 + t3) >> 7));
392
+        dest[1*linesize] = av_clip_uint8(dest[1*linesize] + ((t2 - t4) >> 7));
393
+        dest[2*linesize] = av_clip_uint8(dest[2*linesize] + ((t2 + t4) >> 7));
394
+        dest[3*linesize] = av_clip_uint8(dest[3*linesize] + ((t1 - t3) >> 7));
395 395
 
396 396
         src ++;
397 397
         dest++;
... ...
@@ -404,15 +397,13 @@ static void vc1_inv_trans_4x8_dc_c(uint8_t *dest, int linesize, DCTELEM *block)
404 404
 {
405 405
     int i;
406 406
     int dc = block[0];
407
-    const uint8_t *cm;
408 407
     dc = (17 * dc +  4) >> 3;
409 408
     dc = (12 * dc + 64) >> 7;
410
-    cm = ff_cropTbl + MAX_NEG_CROP + dc;
411 409
     for(i = 0; i < 8; i++){
412
-        dest[0] = cm[dest[0]];
413
-        dest[1] = cm[dest[1]];
414
-        dest[2] = cm[dest[2]];
415
-        dest[3] = cm[dest[3]];
410
+        dest[0] = av_clip_uint8(dest[0] + dc);
411
+        dest[1] = av_clip_uint8(dest[1] + dc);
412
+        dest[2] = av_clip_uint8(dest[2] + dc);
413
+        dest[3] = av_clip_uint8(dest[3] + dc);
416 414
         dest += linesize;
417 415
     }
418 416
 }
... ...
@@ -422,7 +413,6 @@ static void vc1_inv_trans_4x8_c(uint8_t *dest, int linesize, DCTELEM *block)
422 422
     int i;
423 423
     register int t1,t2,t3,t4,t5,t6,t7,t8;
424 424
     DCTELEM *src, *dst;
425
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
426 425
 
427 426
     src = block;
428 427
     dst = block;
... ...
@@ -458,14 +448,14 @@ static void vc1_inv_trans_4x8_c(uint8_t *dest, int linesize, DCTELEM *block)
458 458
         t3 =  9 * src[ 8] - 16 * src[24] +  4 * src[40] + 15 * src[56];
459 459
         t4 =  4 * src[ 8] -  9 * src[24] + 15 * src[40] - 16 * src[56];
460 460
 
461
-        dest[0*linesize] = cm[dest[0*linesize] + ((t5 + t1) >> 7)];
462
-        dest[1*linesize] = cm[dest[1*linesize] + ((t6 + t2) >> 7)];
463
-        dest[2*linesize] = cm[dest[2*linesize] + ((t7 + t3) >> 7)];
464
-        dest[3*linesize] = cm[dest[3*linesize] + ((t8 + t4) >> 7)];
465
-        dest[4*linesize] = cm[dest[4*linesize] + ((t8 - t4 + 1) >> 7)];
466
-        dest[5*linesize] = cm[dest[5*linesize] + ((t7 - t3 + 1) >> 7)];
467
-        dest[6*linesize] = cm[dest[6*linesize] + ((t6 - t2 + 1) >> 7)];
468
-        dest[7*linesize] = cm[dest[7*linesize] + ((t5 - t1 + 1) >> 7)];
461
+        dest[0*linesize] = av_clip_uint8(dest[0*linesize] + ((t5 + t1) >> 7));
462
+        dest[1*linesize] = av_clip_uint8(dest[1*linesize] + ((t6 + t2) >> 7));
463
+        dest[2*linesize] = av_clip_uint8(dest[2*linesize] + ((t7 + t3) >> 7));
464
+        dest[3*linesize] = av_clip_uint8(dest[3*linesize] + ((t8 + t4) >> 7));
465
+        dest[4*linesize] = av_clip_uint8(dest[4*linesize] + ((t8 - t4 + 1) >> 7));
466
+        dest[5*linesize] = av_clip_uint8(dest[5*linesize] + ((t7 - t3 + 1) >> 7));
467
+        dest[6*linesize] = av_clip_uint8(dest[6*linesize] + ((t6 - t2 + 1) >> 7));
468
+        dest[7*linesize] = av_clip_uint8(dest[7*linesize] + ((t5 - t1 + 1) >> 7));
469 469
 
470 470
         src ++;
471 471
         dest++;
... ...
@@ -478,15 +468,13 @@ static void vc1_inv_trans_4x4_dc_c(uint8_t *dest, int linesize, DCTELEM *block)
478 478
 {
479 479
     int i;
480 480
     int dc = block[0];
481
-    const uint8_t *cm;
482 481
     dc = (17 * dc +  4) >> 3;
483 482
     dc = (17 * dc + 64) >> 7;
484
-    cm = ff_cropTbl + MAX_NEG_CROP + dc;
485 483
     for(i = 0; i < 4; i++){
486
-        dest[0] = cm[dest[0]];
487
-        dest[1] = cm[dest[1]];
488
-        dest[2] = cm[dest[2]];
489
-        dest[3] = cm[dest[3]];
484
+        dest[0] = av_clip_uint8(dest[0] + dc);
485
+        dest[1] = av_clip_uint8(dest[1] + dc);
486
+        dest[2] = av_clip_uint8(dest[2] + dc);
487
+        dest[3] = av_clip_uint8(dest[3] + dc);
490 488
         dest += linesize;
491 489
     }
492 490
 }
... ...
@@ -496,7 +484,6 @@ static void vc1_inv_trans_4x4_c(uint8_t *dest, int linesize, DCTELEM *block)
496 496
     int i;
497 497
     register int t1,t2,t3,t4;
498 498
     DCTELEM *src, *dst;
499
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
500 499
 
501 500
     src = block;
502 501
     dst = block;
... ...
@@ -522,10 +509,10 @@ static void vc1_inv_trans_4x4_c(uint8_t *dest, int linesize, DCTELEM *block)
522 522
         t3 = 22 * src[ 8] + 10 * src[24];
523 523
         t4 = 22 * src[24] - 10 * src[ 8];
524 524
 
525
-        dest[0*linesize] = cm[dest[0*linesize] + ((t1 + t3) >> 7)];
526
-        dest[1*linesize] = cm[dest[1*linesize] + ((t2 - t4) >> 7)];
527
-        dest[2*linesize] = cm[dest[2*linesize] + ((t2 + t4) >> 7)];
528
-        dest[3*linesize] = cm[dest[3*linesize] + ((t1 - t3) >> 7)];
525
+        dest[0*linesize] = av_clip_uint8(dest[0*linesize] + ((t1 + t3) >> 7));
526
+        dest[1*linesize] = av_clip_uint8(dest[1*linesize] + ((t2 - t4) >> 7));
527
+        dest[2*linesize] = av_clip_uint8(dest[2*linesize] + ((t2 + t4) >> 7));
528
+        dest[3*linesize] = av_clip_uint8(dest[3*linesize] + ((t1 - t3) >> 7));
529 529
 
530 530
         src ++;
531 531
         dest++;
... ...
@@ -41,7 +41,6 @@
41 41
 static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int type)
42 42
 {
43 43
     int16_t *ip = input;
44
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
45 44
 
46 45
     int A, B, C, D, Ad, Bd, Cd, Dd, E, F, G, H;
47 46
     int Ed, Gd, Add, Bdd, Fd, Hd;
... ...
@@ -147,29 +146,29 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
147 147
                 ip[5*8] = (Fd + Bdd ) >> 4;
148 148
                 ip[6*8] = (Fd - Bdd ) >> 4;
149 149
             }else if(type==1){
150
-                dst[0*stride] = cm[(Gd + Cd )  >> 4];
151
-                dst[7*stride] = cm[(Gd - Cd )  >> 4];
150
+                dst[0*stride] = av_clip_uint8((Gd + Cd )  >> 4);
151
+                dst[7*stride] = av_clip_uint8((Gd - Cd )  >> 4);
152 152
 
153
-                dst[1*stride] = cm[(Add + Hd ) >> 4];
154
-                dst[2*stride] = cm[(Add - Hd ) >> 4];
153
+                dst[1*stride] = av_clip_uint8((Add + Hd ) >> 4);
154
+                dst[2*stride] = av_clip_uint8((Add - Hd ) >> 4);
155 155
 
156
-                dst[3*stride] = cm[(Ed + Dd )  >> 4];
157
-                dst[4*stride] = cm[(Ed - Dd )  >> 4];
156
+                dst[3*stride] = av_clip_uint8((Ed + Dd )  >> 4);
157
+                dst[4*stride] = av_clip_uint8((Ed - Dd )  >> 4);
158 158
 
159
-                dst[5*stride] = cm[(Fd + Bdd ) >> 4];
160
-                dst[6*stride] = cm[(Fd - Bdd ) >> 4];
159
+                dst[5*stride] = av_clip_uint8((Fd + Bdd ) >> 4);
160
+                dst[6*stride] = av_clip_uint8((Fd - Bdd ) >> 4);
161 161
             }else{
162
-                dst[0*stride] = cm[dst[0*stride] + ((Gd + Cd )  >> 4)];
163
-                dst[7*stride] = cm[dst[7*stride] + ((Gd - Cd )  >> 4)];
162
+                dst[0*stride] = av_clip_uint8(dst[0*stride] + ((Gd + Cd )  >> 4));
163
+                dst[7*stride] = av_clip_uint8(dst[7*stride] + ((Gd - Cd )  >> 4));
164 164
 
165
-                dst[1*stride] = cm[dst[1*stride] + ((Add + Hd ) >> 4)];
166
-                dst[2*stride] = cm[dst[2*stride] + ((Add - Hd ) >> 4)];
165
+                dst[1*stride] = av_clip_uint8(dst[1*stride] + ((Add + Hd ) >> 4));
166
+                dst[2*stride] = av_clip_uint8(dst[2*stride] + ((Add - Hd ) >> 4));
167 167
 
168
-                dst[3*stride] = cm[dst[3*stride] + ((Ed + Dd )  >> 4)];
169
-                dst[4*stride] = cm[dst[4*stride] + ((Ed - Dd )  >> 4)];
168
+                dst[3*stride] = av_clip_uint8(dst[3*stride] + ((Ed + Dd )  >> 4));
169
+                dst[4*stride] = av_clip_uint8(dst[4*stride] + ((Ed - Dd )  >> 4));
170 170
 
171
-                dst[5*stride] = cm[dst[5*stride] + ((Fd + Bdd ) >> 4)];
172
-                dst[6*stride] = cm[dst[6*stride] + ((Fd - Bdd ) >> 4)];
171
+                dst[5*stride] = av_clip_uint8(dst[5*stride] + ((Fd + Bdd ) >> 4));
172
+                dst[6*stride] = av_clip_uint8(dst[6*stride] + ((Fd - Bdd ) >> 4));
173 173
             }
174 174
 
175 175
         } else {
... ...
@@ -190,18 +189,18 @@ static av_always_inline void idct(uint8_t *dst, int stride, int16_t *input, int
190 190
                 dst[4*stride]=
191 191
                 dst[5*stride]=
192 192
                 dst[6*stride]=
193
-                dst[7*stride]= cm[128 + ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20)];
193
+                dst[7*stride]= av_clip_uint8(128 + ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20));
194 194
             }else{
195 195
                 if(ip[0*8]){
196 196
                     int v= ((xC4S4 * ip[0*8] + (IdctAdjustBeforeShift<<16))>>20);
197
-                    dst[0*stride] = cm[dst[0*stride] + v];
198
-                    dst[1*stride] = cm[dst[1*stride] + v];
199
-                    dst[2*stride] = cm[dst[2*stride] + v];
200
-                    dst[3*stride] = cm[dst[3*stride] + v];
201
-                    dst[4*stride] = cm[dst[4*stride] + v];
202
-                    dst[5*stride] = cm[dst[5*stride] + v];
203
-                    dst[6*stride] = cm[dst[6*stride] + v];
204
-                    dst[7*stride] = cm[dst[7*stride] + v];
197
+                    dst[0*stride] = av_clip_uint8(dst[0*stride] + v);
198
+                    dst[1*stride] = av_clip_uint8(dst[1*stride] + v);
199
+                    dst[2*stride] = av_clip_uint8(dst[2*stride] + v);
200
+                    dst[3*stride] = av_clip_uint8(dst[3*stride] + v);
201
+                    dst[4*stride] = av_clip_uint8(dst[4*stride] + v);
202
+                    dst[5*stride] = av_clip_uint8(dst[5*stride] + v);
203
+                    dst[6*stride] = av_clip_uint8(dst[6*stride] + v);
204
+                    dst[7*stride] = av_clip_uint8(dst[7*stride] + v);
205 205
                 }
206 206
             }
207 207
         }
... ...
@@ -225,17 +224,16 @@ void ff_vp3_idct_add_c(uint8_t *dest/*align 8*/, int line_size, DCTELEM *block/*
225 225
 
226 226
 void ff_vp3_idct_dc_add_c(uint8_t *dest/*align 8*/, int line_size, const DCTELEM *block/*align 16*/){
227 227
     int i, dc = (block[0] + 15) >> 5;
228
-    const uint8_t *cm = ff_cropTbl + MAX_NEG_CROP + dc;
229 228
 
230 229
     for(i = 0; i < 8; i++){
231
-        dest[0] = cm[dest[0]];
232
-        dest[1] = cm[dest[1]];
233
-        dest[2] = cm[dest[2]];
234
-        dest[3] = cm[dest[3]];
235
-        dest[4] = cm[dest[4]];
236
-        dest[5] = cm[dest[5]];
237
-        dest[6] = cm[dest[6]];
238
-        dest[7] = cm[dest[7]];
230
+        dest[0] = av_clip_uint8(dest[0] + dc);
231
+        dest[1] = av_clip_uint8(dest[1] + dc);
232
+        dest[2] = av_clip_uint8(dest[2] + dc);
233
+        dest[3] = av_clip_uint8(dest[3] + dc);
234
+        dest[4] = av_clip_uint8(dest[4] + dc);
235
+        dest[5] = av_clip_uint8(dest[5] + dc);
236
+        dest[6] = av_clip_uint8(dest[6] + dc);
237
+        dest[7] = av_clip_uint8(dest[7] + dc);
239 238
         dest += line_size;
240 239
     }
241 240
 }
... ...
@@ -80,7 +80,6 @@ static void vp8_luma_dc_wht_dc_c(DCTELEM block[4][4][16], DCTELEM dc[16])
80 80
 static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride)
81 81
 {
82 82
     int i, t0, t1, t2, t3;
83
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP;
84 83
     DCTELEM tmp[16];
85 84
 
86 85
     for (i = 0; i < 4; i++) {
... ...
@@ -105,10 +104,10 @@ static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride)
105 105
         t2 = MUL_35468(tmp[1*4+i]) - MUL_20091(tmp[3*4+i]);
106 106
         t3 = MUL_20091(tmp[1*4+i]) + MUL_35468(tmp[3*4+i]);
107 107
 
108
-        dst[0] = cm[dst[0] + ((t0 + t3 + 4) >> 3)];
109
-        dst[1] = cm[dst[1] + ((t1 + t2 + 4) >> 3)];
110
-        dst[2] = cm[dst[2] + ((t1 - t2 + 4) >> 3)];
111
-        dst[3] = cm[dst[3] + ((t0 - t3 + 4) >> 3)];
108
+        dst[0] = av_clip_uint8(dst[0] + ((t0 + t3 + 4) >> 3));
109
+        dst[1] = av_clip_uint8(dst[1] + ((t1 + t2 + 4) >> 3));
110
+        dst[2] = av_clip_uint8(dst[2] + ((t1 - t2 + 4) >> 3));
111
+        dst[3] = av_clip_uint8(dst[3] + ((t0 - t3 + 4) >> 3));
112 112
         dst += stride;
113 113
     }
114 114
 }
... ...
@@ -116,14 +115,13 @@ static void vp8_idct_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride)
116 116
 static void vp8_idct_dc_add_c(uint8_t *dst, DCTELEM block[16], ptrdiff_t stride)
117 117
 {
118 118
     int i, dc = (block[0] + 4) >> 3;
119
-    uint8_t *cm = ff_cropTbl + MAX_NEG_CROP + dc;
120 119
     block[0] = 0;
121 120
 
122 121
     for (i = 0; i < 4; i++) {
123
-        dst[0] = cm[dst[0]];
124
-        dst[1] = cm[dst[1]];
125
-        dst[2] = cm[dst[2]];
126
-        dst[3] = cm[dst[3]];
122
+        dst[0] = av_clip_uint8(dst[0] + dc);
123
+        dst[1] = av_clip_uint8(dst[1] + dc);
124
+        dst[2] = av_clip_uint8(dst[2] + dc);
125
+        dst[3] = av_clip_uint8(dst[3] + dc);
127 126
         dst += stride;
128 127
     }
129 128
 }