00001 #include "idct.h"
00002 #include <stdlib.h>
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #define W1 2841
00019 #define W2 2676
00020 #define W3 2408
00021 #define W5 1609
00022 #define W6 1108
00023 #define W7 565
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 int mpeg3video_idctrow(short *blk)
00036 {
00037 int x0, x1, x2, x3, x4, x5, x6, x7, x8;
00038
00039
00040 if (!((x1 = blk[4]<<11) | (x2 = blk[6]) | (x3 = blk[2]) |
00041 (x4 = blk[1]) | (x5 = blk[7]) | (x6 = blk[5]) | (x7 = blk[3])))
00042 {
00043 blk[0]=blk[1]=blk[2]=blk[3]=blk[4]=blk[5]=blk[6]=blk[7]=blk[0]<<3;
00044 return 0;
00045 }
00046
00047 x0 = (blk[0]<<11) + 128;
00048
00049
00050 x8 = W7*(x4+x5);
00051 x4 = x8 + (W1-W7)*x4;
00052 x5 = x8 - (W1+W7)*x5;
00053 x8 = W3*(x6+x7);
00054 x6 = x8 - (W3-W5)*x6;
00055 x7 = x8 - (W3+W5)*x7;
00056
00057
00058 x8 = x0 + x1;
00059 x0 -= x1;
00060 x1 = W6*(x3+x2);
00061 x2 = x1 - (W2+W6)*x2;
00062 x3 = x1 + (W2-W6)*x3;
00063 x1 = x4 + x6;
00064 x4 -= x6;
00065 x6 = x5 + x7;
00066 x5 -= x7;
00067
00068
00069 x7 = x8 + x3;
00070 x8 -= x3;
00071 x3 = x0 + x2;
00072 x0 -= x2;
00073 x2 = (181*(x4+x5)+128)>>8;
00074 x4 = (181*(x4-x5)+128)>>8;
00075
00076
00077 blk[0] = (x7+x1)>>8;
00078 blk[1] = (x3+x2)>>8;
00079 blk[2] = (x0+x4)>>8;
00080 blk[3] = (x8+x6)>>8;
00081 blk[4] = (x8-x6)>>8;
00082 blk[5] = (x0-x4)>>8;
00083 blk[6] = (x3-x2)>>8;
00084 blk[7] = (x7-x1)>>8;
00085 return 0;
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096
00097
00098 int mpeg3video_idctcol(short *blk)
00099 {
00100 int x0, x1, x2, x3, x4, x5, x6, x7, x8;
00101
00102
00103 if (!((x1 = (blk[8 * 4]<<8)) | (x2 = blk[8 * 6]) | (x3 = blk[8 * 2]) |
00104 (x4 = blk[8*1]) | (x5 = blk[8 * 7]) | (x6 = blk[8 * 5]) | (x7 = blk[8 * 3]))){
00105 blk[8*0]=blk[8*1]=blk[8 * 2]=blk[8 * 3]=blk[8 * 4]=blk[8 * 5]=blk[8 * 6]=blk[8 * 7]=
00106 (blk[8*0]+32)>>6;
00107 return 0;
00108 }
00109
00110 x0 = (blk[8*0]<<8) + 8192;
00111
00112
00113 x8 = W7*(x4+x5) + 4;
00114 x4 = (x8+(W1-W7)*x4)>>3;
00115 x5 = (x8-(W1+W7)*x5)>>3;
00116 x8 = W3*(x6+x7) + 4;
00117 x6 = (x8-(W3-W5)*x6)>>3;
00118 x7 = (x8-(W3+W5)*x7)>>3;
00119
00120
00121 x8 = x0 + x1;
00122 x0 -= x1;
00123 x1 = W6*(x3+x2) + 4;
00124 x2 = (x1-(W2+W6)*x2)>>3;
00125 x3 = (x1+(W2-W6)*x3)>>3;
00126 x1 = x4 + x6;
00127 x4 -= x6;
00128 x6 = x5 + x7;
00129 x5 -= x7;
00130
00131
00132 x7 = x8 + x3;
00133 x8 -= x3;
00134 x3 = x0 + x2;
00135 x0 -= x2;
00136 x2 = (181 * (x4 + x5) + 128) >> 8;
00137 x4 = (181 * (x4 - x5) + 128) >> 8;
00138
00139
00140 blk[8 * 0] = (x7 + x1) >> 14;
00141 blk[8 * 1] = (x3 + x2) >> 14;
00142 blk[8 * 2] = (x0 + x4) >> 14;
00143 blk[8 * 3] = (x8 + x6) >> 14;
00144 blk[8 * 4] = (x8 - x6) >> 14;
00145 blk[8 * 5] = (x0 - x4) >> 14;
00146 blk[8 * 6] = (x3 - x2) >> 14;
00147 blk[8 * 7] = (x7 - x1) >> 14;
00148 return 0;
00149 }
00150
00151
00152
00153 void mpeg3video_idct_conversion(short* block)
00154 {
00155 int i;
00156 for(i = 0; i < 8; i++) mpeg3video_idctrow(block + 8 * i);
00157 for(i = 0; i < 8; i++) mpeg3video_idctcol(block + i);
00158 }