00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00034 #include "common.h"
00035 #include "dsputil.h"
00036
00037 #define EIGHT_BIT_SAMPLES
00038
00039 #define DCTSIZE 8
00040 #define DCTSIZE2 64
00041
00042 #define GLOBAL
00043
00044 #define RIGHT_SHIFT(x, n) ((x) >> (n))
00045
00046 typedef DCTELEM DCTBLOCK[DCTSIZE2];
00047
00048 #define CONST_BITS 13
00049
00050
00051
00052
00053
00054 #if DCTSIZE != 8
00055 Sorry, this code only copes with 8x8 DCTs.
00056 #endif
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
00085
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095 #ifdef EIGHT_BIT_SAMPLES
00096 #define PASS1_BITS 2
00097 #else
00098 #define PASS1_BITS 1
00099 #endif
00100
00101 #define ONE ((int32_t) 1)
00102
00103 #define CONST_SCALE (ONE << CONST_BITS)
00104
00105
00106
00107
00108
00109
00110
00111
00112 #define FIX(x) ((int32_t) ((x) * CONST_SCALE + 0.5))
00113
00114
00115
00116
00117
00118
00119 #define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n)
00120
00121
00122
00123
00124
00125
00126
00127
00128
00129
00130
00131
00132 #ifdef EIGHT_BIT_SAMPLES
00133 #ifdef SHORTxSHORT_32
00134 #define MULTIPLY(var,const) (((int16_t) (var)) * ((int16_t) (const)))
00135 #endif
00136 #ifdef SHORTxLCONST_32
00137 #define MULTIPLY(var,const) (((int16_t) (var)) * ((int32_t) (const)))
00138 #endif
00139 #endif
00140
00141 #ifndef MULTIPLY
00142 #define MULTIPLY(var,const) ((var) * (const))
00143 #endif
00144
00145
00146
00147
00148
00149
00150 #define FIX_0_211164243 1730
00151 #define FIX_0_275899380 2260
00152 #define FIX_0_298631336 2446
00153 #define FIX_0_390180644 3196
00154 #define FIX_0_509795579 4176
00155 #define FIX_0_541196100 4433
00156 #define FIX_0_601344887 4926
00157 #define FIX_0_765366865 6270
00158 #define FIX_0_785694958 6436
00159 #define FIX_0_899976223 7373
00160 #define FIX_1_061594337 8697
00161 #define FIX_1_111140466 9102
00162 #define FIX_1_175875602 9633
00163 #define FIX_1_306562965 10703
00164 #define FIX_1_387039845 11363
00165 #define FIX_1_451774981 11893
00166 #define FIX_1_501321110 12299
00167 #define FIX_1_662939225 13623
00168 #define FIX_1_847759065 15137
00169 #define FIX_1_961570560 16069
00170 #define FIX_2_053119869 16819
00171 #define FIX_2_172734803 17799
00172 #define FIX_2_562915447 20995
00173 #define FIX_3_072711026 25172
00174
00175
00176
00177
00178
00179 void j_rev_dct(DCTBLOCK data)
00180 {
00181 int32_t tmp0, tmp1, tmp2, tmp3;
00182 int32_t tmp10, tmp11, tmp12, tmp13;
00183 int32_t z1, z2, z3, z4, z5;
00184 int32_t d0, d1, d2, d3, d4, d5, d6, d7;
00185 register DCTELEM *dataptr;
00186 int rowctr;
00187
00188
00189
00190
00191
00192 dataptr = data;
00193
00194 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
00195
00196
00197
00198
00199
00200
00201
00202
00203
00204 register int *idataptr = (int*)dataptr;
00205
00206
00207
00208 d0 = dataptr[0];
00209 d2 = dataptr[1];
00210 d4 = dataptr[2];
00211 d6 = dataptr[3];
00212 d1 = dataptr[4];
00213 d3 = dataptr[5];
00214 d5 = dataptr[6];
00215 d7 = dataptr[7];
00216
00217 if ((d1 | d2 | d3 | d4 | d5 | d6 | d7) == 0) {
00218
00219 if (d0) {
00220
00221 DCTELEM dcval = (DCTELEM) (d0 << PASS1_BITS);
00222 register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
00223
00224 idataptr[0] = v;
00225 idataptr[1] = v;
00226 idataptr[2] = v;
00227 idataptr[3] = v;
00228 }
00229
00230 dataptr += DCTSIZE;
00231 continue;
00232 }
00233
00234
00235
00236 {
00237 if (d6) {
00238 if (d2) {
00239
00240 z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
00241 tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
00242 tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
00243
00244 tmp0 = (d0 + d4) << CONST_BITS;
00245 tmp1 = (d0 - d4) << CONST_BITS;
00246
00247 tmp10 = tmp0 + tmp3;
00248 tmp13 = tmp0 - tmp3;
00249 tmp11 = tmp1 + tmp2;
00250 tmp12 = tmp1 - tmp2;
00251 } else {
00252
00253 tmp2 = MULTIPLY(-d6, FIX_1_306562965);
00254 tmp3 = MULTIPLY(d6, FIX_0_541196100);
00255
00256 tmp0 = (d0 + d4) << CONST_BITS;
00257 tmp1 = (d0 - d4) << CONST_BITS;
00258
00259 tmp10 = tmp0 + tmp3;
00260 tmp13 = tmp0 - tmp3;
00261 tmp11 = tmp1 + tmp2;
00262 tmp12 = tmp1 - tmp2;
00263 }
00264 } else {
00265 if (d2) {
00266
00267 tmp2 = MULTIPLY(d2, FIX_0_541196100);
00268 tmp3 = MULTIPLY(d2, FIX_1_306562965);
00269
00270 tmp0 = (d0 + d4) << CONST_BITS;
00271 tmp1 = (d0 - d4) << CONST_BITS;
00272
00273 tmp10 = tmp0 + tmp3;
00274 tmp13 = tmp0 - tmp3;
00275 tmp11 = tmp1 + tmp2;
00276 tmp12 = tmp1 - tmp2;
00277 } else {
00278
00279 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
00280 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
00281 }
00282 }
00283
00284
00285
00286
00287
00288 if (d7) {
00289 if (d5) {
00290 if (d3) {
00291 if (d1) {
00292
00293 z1 = d7 + d1;
00294 z2 = d5 + d3;
00295 z3 = d7 + d3;
00296 z4 = d5 + d1;
00297 z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
00298
00299 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00300 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00301 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00302 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00303 z1 = MULTIPLY(-z1, FIX_0_899976223);
00304 z2 = MULTIPLY(-z2, FIX_2_562915447);
00305 z3 = MULTIPLY(-z3, FIX_1_961570560);
00306 z4 = MULTIPLY(-z4, FIX_0_390180644);
00307
00308 z3 += z5;
00309 z4 += z5;
00310
00311 tmp0 += z1 + z3;
00312 tmp1 += z2 + z4;
00313 tmp2 += z2 + z3;
00314 tmp3 += z1 + z4;
00315 } else {
00316
00317 z2 = d5 + d3;
00318 z3 = d7 + d3;
00319 z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
00320
00321 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00322 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00323 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00324 z1 = MULTIPLY(-d7, FIX_0_899976223);
00325 z2 = MULTIPLY(-z2, FIX_2_562915447);
00326 z3 = MULTIPLY(-z3, FIX_1_961570560);
00327 z4 = MULTIPLY(-d5, FIX_0_390180644);
00328
00329 z3 += z5;
00330 z4 += z5;
00331
00332 tmp0 += z1 + z3;
00333 tmp1 += z2 + z4;
00334 tmp2 += z2 + z3;
00335 tmp3 = z1 + z4;
00336 }
00337 } else {
00338 if (d1) {
00339
00340 z1 = d7 + d1;
00341 z4 = d5 + d1;
00342 z5 = MULTIPLY(d7 + z4, FIX_1_175875602);
00343
00344 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00345 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00346 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00347 z1 = MULTIPLY(-z1, FIX_0_899976223);
00348 z2 = MULTIPLY(-d5, FIX_2_562915447);
00349 z3 = MULTIPLY(-d7, FIX_1_961570560);
00350 z4 = MULTIPLY(-z4, FIX_0_390180644);
00351
00352 z3 += z5;
00353 z4 += z5;
00354
00355 tmp0 += z1 + z3;
00356 tmp1 += z2 + z4;
00357 tmp2 = z2 + z3;
00358 tmp3 += z1 + z4;
00359 } else {
00360
00361 tmp0 = MULTIPLY(-d7, FIX_0_601344887);
00362 z1 = MULTIPLY(-d7, FIX_0_899976223);
00363 z3 = MULTIPLY(-d7, FIX_1_961570560);
00364 tmp1 = MULTIPLY(-d5, FIX_0_509795579);
00365 z2 = MULTIPLY(-d5, FIX_2_562915447);
00366 z4 = MULTIPLY(-d5, FIX_0_390180644);
00367 z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
00368
00369 z3 += z5;
00370 z4 += z5;
00371
00372 tmp0 += z3;
00373 tmp1 += z4;
00374 tmp2 = z2 + z3;
00375 tmp3 = z1 + z4;
00376 }
00377 }
00378 } else {
00379 if (d3) {
00380 if (d1) {
00381
00382 z1 = d7 + d1;
00383 z3 = d7 + d3;
00384 z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
00385
00386 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00387 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00388 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00389 z1 = MULTIPLY(-z1, FIX_0_899976223);
00390 z2 = MULTIPLY(-d3, FIX_2_562915447);
00391 z3 = MULTIPLY(-z3, FIX_1_961570560);
00392 z4 = MULTIPLY(-d1, FIX_0_390180644);
00393
00394 z3 += z5;
00395 z4 += z5;
00396
00397 tmp0 += z1 + z3;
00398 tmp1 = z2 + z4;
00399 tmp2 += z2 + z3;
00400 tmp3 += z1 + z4;
00401 } else {
00402
00403 z3 = d7 + d3;
00404
00405 tmp0 = MULTIPLY(-d7, FIX_0_601344887);
00406 z1 = MULTIPLY(-d7, FIX_0_899976223);
00407 tmp2 = MULTIPLY(d3, FIX_0_509795579);
00408 z2 = MULTIPLY(-d3, FIX_2_562915447);
00409 z5 = MULTIPLY(z3, FIX_1_175875602);
00410 z3 = MULTIPLY(-z3, FIX_0_785694958);
00411
00412 tmp0 += z3;
00413 tmp1 = z2 + z5;
00414 tmp2 += z3;
00415 tmp3 = z1 + z5;
00416 }
00417 } else {
00418 if (d1) {
00419
00420 z1 = d7 + d1;
00421 z5 = MULTIPLY(z1, FIX_1_175875602);
00422
00423 z1 = MULTIPLY(z1, FIX_0_275899380);
00424 z3 = MULTIPLY(-d7, FIX_1_961570560);
00425 tmp0 = MULTIPLY(-d7, FIX_1_662939225);
00426 z4 = MULTIPLY(-d1, FIX_0_390180644);
00427 tmp3 = MULTIPLY(d1, FIX_1_111140466);
00428
00429 tmp0 += z1;
00430 tmp1 = z4 + z5;
00431 tmp2 = z3 + z5;
00432 tmp3 += z1;
00433 } else {
00434
00435 tmp0 = MULTIPLY(-d7, FIX_1_387039845);
00436 tmp1 = MULTIPLY(d7, FIX_1_175875602);
00437 tmp2 = MULTIPLY(-d7, FIX_0_785694958);
00438 tmp3 = MULTIPLY(d7, FIX_0_275899380);
00439 }
00440 }
00441 }
00442 } else {
00443 if (d5) {
00444 if (d3) {
00445 if (d1) {
00446
00447 z2 = d5 + d3;
00448 z4 = d5 + d1;
00449 z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
00450
00451 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00452 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00453 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00454 z1 = MULTIPLY(-d1, FIX_0_899976223);
00455 z2 = MULTIPLY(-z2, FIX_2_562915447);
00456 z3 = MULTIPLY(-d3, FIX_1_961570560);
00457 z4 = MULTIPLY(-z4, FIX_0_390180644);
00458
00459 z3 += z5;
00460 z4 += z5;
00461
00462 tmp0 = z1 + z3;
00463 tmp1 += z2 + z4;
00464 tmp2 += z2 + z3;
00465 tmp3 += z1 + z4;
00466 } else {
00467
00468 z2 = d5 + d3;
00469
00470 z5 = MULTIPLY(z2, FIX_1_175875602);
00471 tmp1 = MULTIPLY(d5, FIX_1_662939225);
00472 z4 = MULTIPLY(-d5, FIX_0_390180644);
00473 z2 = MULTIPLY(-z2, FIX_1_387039845);
00474 tmp2 = MULTIPLY(d3, FIX_1_111140466);
00475 z3 = MULTIPLY(-d3, FIX_1_961570560);
00476
00477 tmp0 = z3 + z5;
00478 tmp1 += z2;
00479 tmp2 += z2;
00480 tmp3 = z4 + z5;
00481 }
00482 } else {
00483 if (d1) {
00484
00485 z4 = d5 + d1;
00486
00487 z5 = MULTIPLY(z4, FIX_1_175875602);
00488 z1 = MULTIPLY(-d1, FIX_0_899976223);
00489 tmp3 = MULTIPLY(d1, FIX_0_601344887);
00490 tmp1 = MULTIPLY(-d5, FIX_0_509795579);
00491 z2 = MULTIPLY(-d5, FIX_2_562915447);
00492 z4 = MULTIPLY(z4, FIX_0_785694958);
00493
00494 tmp0 = z1 + z5;
00495 tmp1 += z4;
00496 tmp2 = z2 + z5;
00497 tmp3 += z4;
00498 } else {
00499
00500 tmp0 = MULTIPLY(d5, FIX_1_175875602);
00501 tmp1 = MULTIPLY(d5, FIX_0_275899380);
00502 tmp2 = MULTIPLY(-d5, FIX_1_387039845);
00503 tmp3 = MULTIPLY(d5, FIX_0_785694958);
00504 }
00505 }
00506 } else {
00507 if (d3) {
00508 if (d1) {
00509
00510 z5 = d1 + d3;
00511 tmp3 = MULTIPLY(d1, FIX_0_211164243);
00512 tmp2 = MULTIPLY(-d3, FIX_1_451774981);
00513 z1 = MULTIPLY(d1, FIX_1_061594337);
00514 z2 = MULTIPLY(-d3, FIX_2_172734803);
00515 z4 = MULTIPLY(z5, FIX_0_785694958);
00516 z5 = MULTIPLY(z5, FIX_1_175875602);
00517
00518 tmp0 = z1 - z4;
00519 tmp1 = z2 + z4;
00520 tmp2 += z5;
00521 tmp3 += z5;
00522 } else {
00523
00524 tmp0 = MULTIPLY(-d3, FIX_0_785694958);
00525 tmp1 = MULTIPLY(-d3, FIX_1_387039845);
00526 tmp2 = MULTIPLY(-d3, FIX_0_275899380);
00527 tmp3 = MULTIPLY(d3, FIX_1_175875602);
00528 }
00529 } else {
00530 if (d1) {
00531
00532 tmp0 = MULTIPLY(d1, FIX_0_275899380);
00533 tmp1 = MULTIPLY(d1, FIX_0_785694958);
00534 tmp2 = MULTIPLY(d1, FIX_1_175875602);
00535 tmp3 = MULTIPLY(d1, FIX_1_387039845);
00536 } else {
00537
00538 tmp0 = tmp1 = tmp2 = tmp3 = 0;
00539 }
00540 }
00541 }
00542 }
00543 }
00544
00545
00546 dataptr[0] = (DCTELEM) DESCALE(tmp10 + tmp3, CONST_BITS-PASS1_BITS);
00547 dataptr[7] = (DCTELEM) DESCALE(tmp10 - tmp3, CONST_BITS-PASS1_BITS);
00548 dataptr[1] = (DCTELEM) DESCALE(tmp11 + tmp2, CONST_BITS-PASS1_BITS);
00549 dataptr[6] = (DCTELEM) DESCALE(tmp11 - tmp2, CONST_BITS-PASS1_BITS);
00550 dataptr[2] = (DCTELEM) DESCALE(tmp12 + tmp1, CONST_BITS-PASS1_BITS);
00551 dataptr[5] = (DCTELEM) DESCALE(tmp12 - tmp1, CONST_BITS-PASS1_BITS);
00552 dataptr[3] = (DCTELEM) DESCALE(tmp13 + tmp0, CONST_BITS-PASS1_BITS);
00553 dataptr[4] = (DCTELEM) DESCALE(tmp13 - tmp0, CONST_BITS-PASS1_BITS);
00554
00555 dataptr += DCTSIZE;
00556 }
00557
00558
00559
00560
00561
00562 dataptr = data;
00563 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
00564
00565
00566
00567
00568
00569
00570
00571
00572 d0 = dataptr[DCTSIZE*0];
00573 d1 = dataptr[DCTSIZE*1];
00574 d2 = dataptr[DCTSIZE*2];
00575 d3 = dataptr[DCTSIZE*3];
00576 d4 = dataptr[DCTSIZE*4];
00577 d5 = dataptr[DCTSIZE*5];
00578 d6 = dataptr[DCTSIZE*6];
00579 d7 = dataptr[DCTSIZE*7];
00580
00581
00582
00583 if (d6) {
00584 if (d2) {
00585
00586 z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
00587 tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
00588 tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
00589
00590 tmp0 = (d0 + d4) << CONST_BITS;
00591 tmp1 = (d0 - d4) << CONST_BITS;
00592
00593 tmp10 = tmp0 + tmp3;
00594 tmp13 = tmp0 - tmp3;
00595 tmp11 = tmp1 + tmp2;
00596 tmp12 = tmp1 - tmp2;
00597 } else {
00598
00599 tmp2 = MULTIPLY(-d6, FIX_1_306562965);
00600 tmp3 = MULTIPLY(d6, FIX_0_541196100);
00601
00602 tmp0 = (d0 + d4) << CONST_BITS;
00603 tmp1 = (d0 - d4) << CONST_BITS;
00604
00605 tmp10 = tmp0 + tmp3;
00606 tmp13 = tmp0 - tmp3;
00607 tmp11 = tmp1 + tmp2;
00608 tmp12 = tmp1 - tmp2;
00609 }
00610 } else {
00611 if (d2) {
00612
00613 tmp2 = MULTIPLY(d2, FIX_0_541196100);
00614 tmp3 = MULTIPLY(d2, FIX_1_306562965);
00615
00616 tmp0 = (d0 + d4) << CONST_BITS;
00617 tmp1 = (d0 - d4) << CONST_BITS;
00618
00619 tmp10 = tmp0 + tmp3;
00620 tmp13 = tmp0 - tmp3;
00621 tmp11 = tmp1 + tmp2;
00622 tmp12 = tmp1 - tmp2;
00623 } else {
00624
00625 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
00626 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
00627 }
00628 }
00629
00630
00631
00632
00633 if (d7) {
00634 if (d5) {
00635 if (d3) {
00636 if (d1) {
00637
00638 z1 = d7 + d1;
00639 z2 = d5 + d3;
00640 z3 = d7 + d3;
00641 z4 = d5 + d1;
00642 z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
00643
00644 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00645 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00646 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00647 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00648 z1 = MULTIPLY(-z1, FIX_0_899976223);
00649 z2 = MULTIPLY(-z2, FIX_2_562915447);
00650 z3 = MULTIPLY(-z3, FIX_1_961570560);
00651 z4 = MULTIPLY(-z4, FIX_0_390180644);
00652
00653 z3 += z5;
00654 z4 += z5;
00655
00656 tmp0 += z1 + z3;
00657 tmp1 += z2 + z4;
00658 tmp2 += z2 + z3;
00659 tmp3 += z1 + z4;
00660 } else {
00661
00662 z1 = d7;
00663 z2 = d5 + d3;
00664 z3 = d7 + d3;
00665 z5 = MULTIPLY(z3 + d5, FIX_1_175875602);
00666
00667 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00668 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00669 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00670 z1 = MULTIPLY(-d7, FIX_0_899976223);
00671 z2 = MULTIPLY(-z2, FIX_2_562915447);
00672 z3 = MULTIPLY(-z3, FIX_1_961570560);
00673 z4 = MULTIPLY(-d5, FIX_0_390180644);
00674
00675 z3 += z5;
00676 z4 += z5;
00677
00678 tmp0 += z1 + z3;
00679 tmp1 += z2 + z4;
00680 tmp2 += z2 + z3;
00681 tmp3 = z1 + z4;
00682 }
00683 } else {
00684 if (d1) {
00685
00686 z1 = d7 + d1;
00687 z2 = d5;
00688 z3 = d7;
00689 z4 = d5 + d1;
00690 z5 = MULTIPLY(z3 + z4, FIX_1_175875602);
00691
00692 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00693 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00694 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00695 z1 = MULTIPLY(-z1, FIX_0_899976223);
00696 z2 = MULTIPLY(-d5, FIX_2_562915447);
00697 z3 = MULTIPLY(-d7, FIX_1_961570560);
00698 z4 = MULTIPLY(-z4, FIX_0_390180644);
00699
00700 z3 += z5;
00701 z4 += z5;
00702
00703 tmp0 += z1 + z3;
00704 tmp1 += z2 + z4;
00705 tmp2 = z2 + z3;
00706 tmp3 += z1 + z4;
00707 } else {
00708
00709 tmp0 = MULTIPLY(-d7, FIX_0_601344887);
00710 z1 = MULTIPLY(-d7, FIX_0_899976223);
00711 z3 = MULTIPLY(-d7, FIX_1_961570560);
00712 tmp1 = MULTIPLY(-d5, FIX_0_509795579);
00713 z2 = MULTIPLY(-d5, FIX_2_562915447);
00714 z4 = MULTIPLY(-d5, FIX_0_390180644);
00715 z5 = MULTIPLY(d5 + d7, FIX_1_175875602);
00716
00717 z3 += z5;
00718 z4 += z5;
00719
00720 tmp0 += z3;
00721 tmp1 += z4;
00722 tmp2 = z2 + z3;
00723 tmp3 = z1 + z4;
00724 }
00725 }
00726 } else {
00727 if (d3) {
00728 if (d1) {
00729
00730 z1 = d7 + d1;
00731 z3 = d7 + d3;
00732 z5 = MULTIPLY(z3 + d1, FIX_1_175875602);
00733
00734 tmp0 = MULTIPLY(d7, FIX_0_298631336);
00735 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00736 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00737 z1 = MULTIPLY(-z1, FIX_0_899976223);
00738 z2 = MULTIPLY(-d3, FIX_2_562915447);
00739 z3 = MULTIPLY(-z3, FIX_1_961570560);
00740 z4 = MULTIPLY(-d1, FIX_0_390180644);
00741
00742 z3 += z5;
00743 z4 += z5;
00744
00745 tmp0 += z1 + z3;
00746 tmp1 = z2 + z4;
00747 tmp2 += z2 + z3;
00748 tmp3 += z1 + z4;
00749 } else {
00750
00751 z3 = d7 + d3;
00752
00753 tmp0 = MULTIPLY(-d7, FIX_0_601344887);
00754 z1 = MULTIPLY(-d7, FIX_0_899976223);
00755 tmp2 = MULTIPLY(d3, FIX_0_509795579);
00756 z2 = MULTIPLY(-d3, FIX_2_562915447);
00757 z5 = MULTIPLY(z3, FIX_1_175875602);
00758 z3 = MULTIPLY(-z3, FIX_0_785694958);
00759
00760 tmp0 += z3;
00761 tmp1 = z2 + z5;
00762 tmp2 += z3;
00763 tmp3 = z1 + z5;
00764 }
00765 } else {
00766 if (d1) {
00767
00768 z1 = d7 + d1;
00769 z5 = MULTIPLY(z1, FIX_1_175875602);
00770
00771 z1 = MULTIPLY(z1, FIX_0_275899380);
00772 z3 = MULTIPLY(-d7, FIX_1_961570560);
00773 tmp0 = MULTIPLY(-d7, FIX_1_662939225);
00774 z4 = MULTIPLY(-d1, FIX_0_390180644);
00775 tmp3 = MULTIPLY(d1, FIX_1_111140466);
00776
00777 tmp0 += z1;
00778 tmp1 = z4 + z5;
00779 tmp2 = z3 + z5;
00780 tmp3 += z1;
00781 } else {
00782
00783 tmp0 = MULTIPLY(-d7, FIX_1_387039845);
00784 tmp1 = MULTIPLY(d7, FIX_1_175875602);
00785 tmp2 = MULTIPLY(-d7, FIX_0_785694958);
00786 tmp3 = MULTIPLY(d7, FIX_0_275899380);
00787 }
00788 }
00789 }
00790 } else {
00791 if (d5) {
00792 if (d3) {
00793 if (d1) {
00794
00795 z2 = d5 + d3;
00796 z4 = d5 + d1;
00797 z5 = MULTIPLY(d3 + z4, FIX_1_175875602);
00798
00799 tmp1 = MULTIPLY(d5, FIX_2_053119869);
00800 tmp2 = MULTIPLY(d3, FIX_3_072711026);
00801 tmp3 = MULTIPLY(d1, FIX_1_501321110);
00802 z1 = MULTIPLY(-d1, FIX_0_899976223);
00803 z2 = MULTIPLY(-z2, FIX_2_562915447);
00804 z3 = MULTIPLY(-d3, FIX_1_961570560);
00805 z4 = MULTIPLY(-z4, FIX_0_390180644);
00806
00807 z3 += z5;
00808 z4 += z5;
00809
00810 tmp0 = z1 + z3;
00811 tmp1 += z2 + z4;
00812 tmp2 += z2 + z3;
00813 tmp3 += z1 + z4;
00814 } else {
00815
00816 z2 = d5 + d3;
00817
00818 z5 = MULTIPLY(z2, FIX_1_175875602);
00819 tmp1 = MULTIPLY(d5, FIX_1_662939225);
00820 z4 = MULTIPLY(-d5, FIX_0_390180644);
00821 z2 = MULTIPLY(-z2, FIX_1_387039845);
00822 tmp2 = MULTIPLY(d3, FIX_1_111140466);
00823 z3 = MULTIPLY(-d3, FIX_1_961570560);
00824
00825 tmp0 = z3 + z5;
00826 tmp1 += z2;
00827 tmp2 += z2;
00828 tmp3 = z4 + z5;
00829 }
00830 } else {
00831 if (d1) {
00832
00833 z4 = d5 + d1;
00834
00835 z5 = MULTIPLY(z4, FIX_1_175875602);
00836 z1 = MULTIPLY(-d1, FIX_0_899976223);
00837 tmp3 = MULTIPLY(d1, FIX_0_601344887);
00838 tmp1 = MULTIPLY(-d5, FIX_0_509795579);
00839 z2 = MULTIPLY(-d5, FIX_2_562915447);
00840 z4 = MULTIPLY(z4, FIX_0_785694958);
00841
00842 tmp0 = z1 + z5;
00843 tmp1 += z4;
00844 tmp2 = z2 + z5;
00845 tmp3 += z4;
00846 } else {
00847
00848 tmp0 = MULTIPLY(d5, FIX_1_175875602);
00849 tmp1 = MULTIPLY(d5, FIX_0_275899380);
00850 tmp2 = MULTIPLY(-d5, FIX_1_387039845);
00851 tmp3 = MULTIPLY(d5, FIX_0_785694958);
00852 }
00853 }
00854 } else {
00855 if (d3) {
00856 if (d1) {
00857
00858 z5 = d1 + d3;
00859 tmp3 = MULTIPLY(d1, FIX_0_211164243);
00860 tmp2 = MULTIPLY(-d3, FIX_1_451774981);
00861 z1 = MULTIPLY(d1, FIX_1_061594337);
00862 z2 = MULTIPLY(-d3, FIX_2_172734803);
00863 z4 = MULTIPLY(z5, FIX_0_785694958);
00864 z5 = MULTIPLY(z5, FIX_1_175875602);
00865
00866 tmp0 = z1 - z4;
00867 tmp1 = z2 + z4;
00868 tmp2 += z5;
00869 tmp3 += z5;
00870 } else {
00871
00872 tmp0 = MULTIPLY(-d3, FIX_0_785694958);
00873 tmp1 = MULTIPLY(-d3, FIX_1_387039845);
00874 tmp2 = MULTIPLY(-d3, FIX_0_275899380);
00875 tmp3 = MULTIPLY(d3, FIX_1_175875602);
00876 }
00877 } else {
00878 if (d1) {
00879
00880 tmp0 = MULTIPLY(d1, FIX_0_275899380);
00881 tmp1 = MULTIPLY(d1, FIX_0_785694958);
00882 tmp2 = MULTIPLY(d1, FIX_1_175875602);
00883 tmp3 = MULTIPLY(d1, FIX_1_387039845);
00884 } else {
00885
00886 tmp0 = tmp1 = tmp2 = tmp3 = 0;
00887 }
00888 }
00889 }
00890 }
00891
00892
00893
00894 dataptr[DCTSIZE*0] = (DCTELEM) DESCALE(tmp10 + tmp3,
00895 CONST_BITS+PASS1_BITS+3);
00896 dataptr[DCTSIZE*7] = (DCTELEM) DESCALE(tmp10 - tmp3,
00897 CONST_BITS+PASS1_BITS+3);
00898 dataptr[DCTSIZE*1] = (DCTELEM) DESCALE(tmp11 + tmp2,
00899 CONST_BITS+PASS1_BITS+3);
00900 dataptr[DCTSIZE*6] = (DCTELEM) DESCALE(tmp11 - tmp2,
00901 CONST_BITS+PASS1_BITS+3);
00902 dataptr[DCTSIZE*2] = (DCTELEM) DESCALE(tmp12 + tmp1,
00903 CONST_BITS+PASS1_BITS+3);
00904 dataptr[DCTSIZE*5] = (DCTELEM) DESCALE(tmp12 - tmp1,
00905 CONST_BITS+PASS1_BITS+3);
00906 dataptr[DCTSIZE*3] = (DCTELEM) DESCALE(tmp13 + tmp0,
00907 CONST_BITS+PASS1_BITS+3);
00908 dataptr[DCTSIZE*4] = (DCTELEM) DESCALE(tmp13 - tmp0,
00909 CONST_BITS+PASS1_BITS+3);
00910
00911 dataptr++;
00912 }
00913 }
00914
00915 #undef DCTSIZE
00916 #define DCTSIZE 4
00917 #define DCTSTRIDE 8
00918
00919 void j_rev_dct4(DCTBLOCK data)
00920 {
00921 int32_t tmp0, tmp1, tmp2, tmp3;
00922 int32_t tmp10, tmp11, tmp12, tmp13;
00923 int32_t z1;
00924 int32_t d0, d2, d4, d6;
00925 register DCTELEM *dataptr;
00926 int rowctr;
00927
00928
00929
00930
00931
00932 data[0] += 4;
00933
00934 dataptr = data;
00935
00936 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
00937
00938
00939
00940
00941
00942
00943
00944
00945
00946 register int *idataptr = (int*)dataptr;
00947
00948 d0 = dataptr[0];
00949 d2 = dataptr[1];
00950 d4 = dataptr[2];
00951 d6 = dataptr[3];
00952
00953 if ((d2 | d4 | d6) == 0) {
00954
00955 if (d0) {
00956
00957 DCTELEM dcval = (DCTELEM) (d0 << PASS1_BITS);
00958 register int v = (dcval & 0xffff) | ((dcval << 16) & 0xffff0000);
00959
00960 idataptr[0] = v;
00961 idataptr[1] = v;
00962 }
00963
00964 dataptr += DCTSTRIDE;
00965 continue;
00966 }
00967
00968
00969
00970 if (d6) {
00971 if (d2) {
00972
00973 z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
00974 tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
00975 tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
00976
00977 tmp0 = (d0 + d4) << CONST_BITS;
00978 tmp1 = (d0 - d4) << CONST_BITS;
00979
00980 tmp10 = tmp0 + tmp3;
00981 tmp13 = tmp0 - tmp3;
00982 tmp11 = tmp1 + tmp2;
00983 tmp12 = tmp1 - tmp2;
00984 } else {
00985
00986 tmp2 = MULTIPLY(-d6, FIX_1_306562965);
00987 tmp3 = MULTIPLY(d6, FIX_0_541196100);
00988
00989 tmp0 = (d0 + d4) << CONST_BITS;
00990 tmp1 = (d0 - d4) << CONST_BITS;
00991
00992 tmp10 = tmp0 + tmp3;
00993 tmp13 = tmp0 - tmp3;
00994 tmp11 = tmp1 + tmp2;
00995 tmp12 = tmp1 - tmp2;
00996 }
00997 } else {
00998 if (d2) {
00999
01000 tmp2 = MULTIPLY(d2, FIX_0_541196100);
01001 tmp3 = MULTIPLY(d2, FIX_1_306562965);
01002
01003 tmp0 = (d0 + d4) << CONST_BITS;
01004 tmp1 = (d0 - d4) << CONST_BITS;
01005
01006 tmp10 = tmp0 + tmp3;
01007 tmp13 = tmp0 - tmp3;
01008 tmp11 = tmp1 + tmp2;
01009 tmp12 = tmp1 - tmp2;
01010 } else {
01011
01012 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
01013 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
01014 }
01015 }
01016
01017
01018
01019 dataptr[0] = (DCTELEM) DESCALE(tmp10, CONST_BITS-PASS1_BITS);
01020 dataptr[1] = (DCTELEM) DESCALE(tmp11, CONST_BITS-PASS1_BITS);
01021 dataptr[2] = (DCTELEM) DESCALE(tmp12, CONST_BITS-PASS1_BITS);
01022 dataptr[3] = (DCTELEM) DESCALE(tmp13, CONST_BITS-PASS1_BITS);
01023
01024 dataptr += DCTSTRIDE;
01025 }
01026
01027
01028
01029
01030
01031 dataptr = data;
01032 for (rowctr = DCTSIZE-1; rowctr >= 0; rowctr--) {
01033
01034
01035
01036
01037
01038
01039
01040
01041 d0 = dataptr[DCTSTRIDE*0];
01042 d2 = dataptr[DCTSTRIDE*1];
01043 d4 = dataptr[DCTSTRIDE*2];
01044 d6 = dataptr[DCTSTRIDE*3];
01045
01046
01047
01048 if (d6) {
01049 if (d2) {
01050
01051 z1 = MULTIPLY(d2 + d6, FIX_0_541196100);
01052 tmp2 = z1 + MULTIPLY(-d6, FIX_1_847759065);
01053 tmp3 = z1 + MULTIPLY(d2, FIX_0_765366865);
01054
01055 tmp0 = (d0 + d4) << CONST_BITS;
01056 tmp1 = (d0 - d4) << CONST_BITS;
01057
01058 tmp10 = tmp0 + tmp3;
01059 tmp13 = tmp0 - tmp3;
01060 tmp11 = tmp1 + tmp2;
01061 tmp12 = tmp1 - tmp2;
01062 } else {
01063
01064 tmp2 = MULTIPLY(-d6, FIX_1_306562965);
01065 tmp3 = MULTIPLY(d6, FIX_0_541196100);
01066
01067 tmp0 = (d0 + d4) << CONST_BITS;
01068 tmp1 = (d0 - d4) << CONST_BITS;
01069
01070 tmp10 = tmp0 + tmp3;
01071 tmp13 = tmp0 - tmp3;
01072 tmp11 = tmp1 + tmp2;
01073 tmp12 = tmp1 - tmp2;
01074 }
01075 } else {
01076 if (d2) {
01077
01078 tmp2 = MULTIPLY(d2, FIX_0_541196100);
01079 tmp3 = MULTIPLY(d2, FIX_1_306562965);
01080
01081 tmp0 = (d0 + d4) << CONST_BITS;
01082 tmp1 = (d0 - d4) << CONST_BITS;
01083
01084 tmp10 = tmp0 + tmp3;
01085 tmp13 = tmp0 - tmp3;
01086 tmp11 = tmp1 + tmp2;
01087 tmp12 = tmp1 - tmp2;
01088 } else {
01089
01090 tmp10 = tmp13 = (d0 + d4) << CONST_BITS;
01091 tmp11 = tmp12 = (d0 - d4) << CONST_BITS;
01092 }
01093 }
01094
01095
01096
01097 dataptr[DCTSTRIDE*0] = tmp10 >> (CONST_BITS+PASS1_BITS+3);
01098 dataptr[DCTSTRIDE*1] = tmp11 >> (CONST_BITS+PASS1_BITS+3);
01099 dataptr[DCTSTRIDE*2] = tmp12 >> (CONST_BITS+PASS1_BITS+3);
01100 dataptr[DCTSTRIDE*3] = tmp13 >> (CONST_BITS+PASS1_BITS+3);
01101
01102 dataptr++;
01103 }
01104 }
01105
01106 void j_rev_dct2(DCTBLOCK data){
01107 int d00, d01, d10, d11;
01108
01109 data[0] += 4;
01110 d00 = data[0+0*DCTSTRIDE] + data[1+0*DCTSTRIDE];
01111 d01 = data[0+0*DCTSTRIDE] - data[1+0*DCTSTRIDE];
01112 d10 = data[0+1*DCTSTRIDE] + data[1+1*DCTSTRIDE];
01113 d11 = data[0+1*DCTSTRIDE] - data[1+1*DCTSTRIDE];
01114
01115 data[0+0*DCTSTRIDE]= (d00 + d10)>>3;
01116 data[1+0*DCTSTRIDE]= (d01 + d11)>>3;
01117 data[0+1*DCTSTRIDE]= (d00 - d10)>>3;
01118 data[1+1*DCTSTRIDE]= (d01 - d11)>>3;
01119 }
01120
01121 void j_rev_dct1(DCTBLOCK data){
01122 data[0] = (data[0] + 4)>>3;
01123 }
01124
01125 #undef FIX
01126 #undef CONST_BITS