OSDN Git Service

original
[gb-231r1-is01/Gingerbread_2.3.3_r1_IS01.git] / frameworks / base / media / libstagefright / codecs / m4v_h263 / enc / src / motion_comp.cpp
1 /* ------------------------------------------------------------------
2  * Copyright (C) 1998-2009 PacketVideo
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
13  * express or implied.
14  * See the License for the specific language governing permissions
15  * and limitations under the License.
16  * -------------------------------------------------------------------
17  */
18 #include "mp4lib_int.h"
19 #include "mp4enc_lib.h"
20
21 //const static Int roundtab4[] = {0,1,1,1};
22 //const static Int roundtab8[] = {0,0,1,1,1,1,1,2};
23 //const static Int roundtab12[] = {0,0,0,1,1,1,1,1,1,1,2,2};
24 const static Int roundtab16[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2};
25
26 #define FORWARD_MODE    1
27 #define BACKWARD_MODE   2
28 #define BIDIRECTION_MODE    3
29 #define DIRECT_MODE         4
30
31 #ifdef __cplusplus
32 extern "C"
33 {
34 #endif
35     /*Function Prototype */
36     /* no-edge padding */
37     Int EncGetPredOutside(Int xpos, Int ypos, UChar *c_prev, UChar *rec,
38     Int width, Int height, Int rnd1);
39
40     void Copy_MB_from_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int width);
41     void Copy_B_from_Vop(UChar *comp, Int cChan[], Int width);
42     void Copy_MB_into_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int width);
43     void Copy_B_into_Vop(UChar *comp, Int cChan[], Int width);
44     void get_MB(UChar *c_prev, UChar *c_prev_u  , UChar *c_prev_v,
45                 Short mb[6][64], Int lx, Int lx_uv);
46
47     Int GetPredAdvBy0x0(
48         UChar *c_prev,      /* i */
49         UChar *pred_block,      /* i */
50         Int lx,     /* i */
51         Int rnd1 /* i */
52     );
53
54     Int GetPredAdvBy0x1(
55         UChar *c_prev,      /* i */
56         UChar *pred_block,      /* i */
57         Int lx,     /* i */
58         Int rnd1 /* i */
59     );
60
61     Int GetPredAdvBy1x0(
62         UChar *c_prev,      /* i */
63         UChar *pred_block,      /* i */
64         Int lx,     /* i */
65         Int rnd1 /* i */
66     );
67
68     Int GetPredAdvBy1x1(
69         UChar *c_prev,      /* i */
70         UChar *pred_block,      /* i */
71         Int lx,     /* i */
72         Int rnd1 /* i */
73     );
74
75     static Int(*const GetPredAdvBTable[2][2])(UChar*, UChar*, Int, Int) =
76     {
77         {&GetPredAdvBy0x0, &GetPredAdvBy0x1},
78         {&GetPredAdvBy1x0, &GetPredAdvBy1x1}
79     };
80
81
82 #ifdef __cplusplus
83 }
84 #endif
85
86
87 /* ======================================================================== */
88 /*  Function : getMotionCompensatedMB( )                                    */
89 /*  Date     : 4/17/2001                                                    */
90 /*  Purpose  : Get the motion compensate block into video->predictionMB     */
91 /*              and generate video->predictionErrorMB                       */
92 /*              modified from MBMotionComp() function in the decoder        */
93 /*  In/out   :                                                              */
94 /*  Return   :                                                              */
95 /*  Modified :                                                              */
96 /* ======================================================================== */
97
98 void getMotionCompensatedMB(VideoEncData *video, Int ind_x, Int ind_y, Int offset)
99 {
100     Vop *prevVop = video->forwardRefVop; //reference frame
101     Vop *currVop = video->currVop;
102     Int mbnum = video->mbnum;       //mb index
103     MOT *mot = video->mot[mbnum];
104     Int ypos, xpos;
105     UChar *c_prev, *cu_prev, *cv_prev;
106     UChar *c_rec, *cu_rec, *cv_rec;
107     Int height, pitch, pitch_uv, height_uv;
108     Int mode = video->headerInfo.Mode[mbnum];  /* get mode */
109     Int dx, dy;
110     Int xpred, ypred;
111     Int xsum, ysum;
112     Int round1;
113
114     OSCL_UNUSED_ARG(offset);
115
116     round1 = (Int)(1 - video->currVop->roundingType);
117
118     pitch  = currVop->pitch;
119     height = currVop->height;
120     pitch_uv  = pitch >> 1;
121     height_uv = height >> 1;
122
123     ypos = ind_y << 4 ;
124     xpos = ind_x << 4 ;
125
126     c_rec = video->predictedMB;
127     cu_rec = video->predictedMB + 256;
128     cv_rec = video->predictedMB + 264;
129
130     if (mode == MODE_INTER || mode == MODE_INTER_Q)
131     {
132         /* Motion vector in x direction       */
133         dx = mot[0].x;
134         dy = mot[0].y;
135
136         c_prev  = prevVop->yChan;
137
138         xpred = (xpos << 1) + dx ;
139         ypred = (ypos << 1) + dy ;
140
141         /* Call function that performs luminance prediction */
142         EncPrediction_INTER(xpred, ypred, c_prev, c_rec,
143                             pitch, round1);
144
145         if ((dx & 3) == 0)  dx = dx >> 1;
146         else        dx = (dx >> 1) | 1;
147
148         if ((dy & 3) == 0)      dy = dy >> 1;
149         else        dy = (dy >> 1) | 1;
150
151         xpred = xpos + dx;
152         ypred = ypos + dy;
153
154         cu_prev = prevVop->uChan;
155         cv_prev = prevVop->vChan;
156
157         EncPrediction_Chrom(xpred, ypred, cu_prev, cv_prev, cu_rec, cv_rec,
158                             pitch_uv, (currVop->width) >> 1, height_uv, round1);
159     }
160 #ifndef NO_INTER4V
161     else if (mode == MODE_INTER4V)
162     {
163         c_prev  = prevVop->yChan;
164         cu_prev = prevVop->uChan;
165         cv_prev = prevVop->vChan;
166
167         EncPrediction_INTER4V(xpos, ypos, mot, c_prev, c_rec,
168                               pitch, round1);
169
170         xsum = mot[1].x + mot[2].x + mot[3].x + mot[4].x;
171         ysum = mot[1].y + mot[2].y + mot[3].y + mot[4].y;
172
173         dx = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] +
174                               (((PV_ABS(xsum)) >> 4) << 1));
175         dy = PV_SIGN(ysum) * (roundtab16[(PV_ABS(ysum)) & 0xF] +
176                               (((PV_ABS(ysum)) >> 4) << 1));
177
178         ypred = ypos + dy;
179         xpred = xpos + dx;
180
181         EncPrediction_Chrom(xpred, ypred, cu_prev, cv_prev, cu_rec, cv_rec,
182                             pitch_uv, (currVop->width) >> 1, height_uv, round1);
183     }
184 #endif
185     else
186     {
187         ;//printf("Error, MODE_SKIPPED is not decided yet!\n");
188     }
189
190     return ;
191 }
192
193 /***************************************************************************
194     Function:   EncPrediction_INTER
195     Date:       04/17/2001
196     Purpose:    Get predicted area for luminance and compensate with the residue.
197                 Modified from luminance_pred_mode_inter() in decoder.
198 ***************************************************************************/
199
200 void EncPrediction_INTER(
201     Int xpred,          /* i */
202     Int ypred,          /* i */
203     UChar *c_prev,          /* i */
204     UChar *c_rec,       /* i */
205     Int lx,         /* i */
206     Int round1          /* i */
207 )
208 {
209     c_prev += (xpred >> 1) + ((ypred >> 1) * lx);
210
211     GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1);
212
213     c_prev += B_SIZE;
214     c_rec += B_SIZE;
215
216     GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1);
217
218     c_prev += (lx << 3) - B_SIZE;
219     c_rec += (16 << 3) - B_SIZE; /* padding */
220
221     GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1);
222
223     c_prev += B_SIZE;
224     c_rec += B_SIZE;
225
226     GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1);
227
228     return;
229 }
230
231 #ifndef NO_INTER4V
232 /***************************************************************************
233     Function:   EncPrediction_INTER4V
234     Date:       04/17/2001
235     Purpose:    Get predicted area for luminance and compensate with the residue.
236                 Modified from luminance_pred_mode_inter4v() in decoder.
237 ***************************************************************************/
238
239 void EncPrediction_INTER4V(
240     Int xpos,           /* i */
241     Int ypos,           /* i */
242     MOT *mot,           /* i */
243     UChar *c_prev,          /* i */
244     UChar *c_rec,           /* i */
245     Int lx,         /* i */
246     Int round1          /* i */
247 )
248 {
249     Int ypred, xpred;
250
251     xpred = (Int)((xpos << 1) + mot[1].x);
252     ypred = (Int)((ypos << 1) + mot[1].y);
253
254     GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx),
255                                        c_rec, lx, round1);
256
257     c_rec += B_SIZE;
258
259     xpred = (Int)(((xpos + B_SIZE) << 1) + mot[2].x);
260     ypred = (Int)((ypos << 1) + mot[2].y);
261
262     GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx),
263                                        c_rec, lx, round1);
264
265     c_rec += (16 << 3) - B_SIZE; /* padding */
266
267     xpred = (Int)((xpos << 1) + mot[3].x);
268     ypred = (Int)(((ypos + B_SIZE) << 1) + mot[3].y);
269
270     GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx),
271                                        c_rec, lx, round1);
272
273     c_rec += B_SIZE;
274
275     xpred = (Int)(((xpos + B_SIZE) << 1) + mot[4].x);
276     ypred = (Int)(((ypos + B_SIZE) << 1) + mot[4].y);
277
278     GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx),
279                                        c_rec, lx, round1);
280
281     return;
282 }
283 #endif /* NO_INTER4V */
284
285 /***************************************************************************
286     Function:   EncPrediction_Chrom
287     Date:       04/17/2001
288     Purpose:    Get predicted area for chrominance and compensate with the residue.
289                 Modified from chrominance_pred() in decoder.
290 ***************************************************************************/
291
292 void EncPrediction_Chrom(
293     Int xpred,          /* i */
294     Int ypred,          /* i */
295     UChar *cu_prev,         /* i */
296     UChar *cv_prev,         /* i */
297     UChar *cu_rec,
298     UChar *cv_rec,
299     Int lx,
300     Int width_uv,           /* i */
301     Int height_uv,          /* i */
302     Int round1          /* i */
303 )
304 {
305     /* check whether the MV points outside the frame */
306     /* Compute prediction for Chrominance b block (block[4]) */
307     if (xpred >= 0 && xpred <= ((width_uv << 1) - (2*B_SIZE)) && ypred >= 0 &&
308             ypred <= ((height_uv << 1) - (2*B_SIZE)))
309     {
310         /*****************************/
311         /* (x,y) is inside the frame */
312         /*****************************/
313
314         /* Compute prediction for Chrominance b (block[4]) */
315         GetPredAdvBTable[ypred&1][xpred&1](cu_prev + (xpred >> 1) + ((ypred >> 1)*lx),
316                                            cu_rec, lx, round1);
317
318         /* Compute prediction for Chrominance r (block[5]) */
319         GetPredAdvBTable[ypred&1][xpred&1](cv_prev + (xpred >> 1) + ((ypred >> 1)*lx),
320                                            cv_rec,  lx, round1);
321     }
322     else
323     {
324         /******************************/
325         /* (x,y) is outside the frame */
326         /******************************/
327
328         /* Compute prediction for Chrominance b (block[4]) */
329         EncGetPredOutside(xpred, ypred,
330                           cu_prev, cu_rec,
331                           width_uv, height_uv, round1);
332
333         /* Compute prediction for Chrominance r (block[5]) */
334         EncGetPredOutside(xpred, ypred,
335                           cv_prev, cv_rec,
336                           width_uv, height_uv, round1);
337     }
338
339     return;
340 }
341 /***************************************************************************
342     Function:   GetPredAdvancedB
343     Date:       04/17/2001
344     Purpose:    Get predicted area (block) and compensate with the residue.
345                 - modified from GetPredAdvancedBAdd in decoder.
346     Intput/Output:
347     Modified:
348 ***************************************************************************/
349
350 Int GetPredAdvBy0x0(
351     UChar *prev,        /* i */
352     UChar *rec,     /* i */
353     Int lx,     /* i */
354     Int rnd /* i */
355 )
356 {
357     Int i;      /* loop variable */
358     ULong  pred_word, word1, word2;
359     Int tmp;
360
361     OSCL_UNUSED_ARG(rnd);
362
363     /* initialize offset to adjust pixel counter */
364     /*    the next row; full-pel resolution      */
365
366     tmp = (ULong)prev & 0x3;
367
368     if (tmp == 0)  /* word-aligned */
369     {
370         rec -= 16; /* preset */
371         prev -= lx;
372
373         for (i = 8; i > 0; i--)
374         {
375             *((ULong*)(rec += 16)) = *((ULong*)(prev += lx));
376             *((ULong*)(rec + 4)) = *((ULong*)(prev + 4));
377         }
378         return 1;
379     }
380     else if (tmp == 1) /* first position */
381     {
382         prev--; /* word-aligned */
383         rec -= 16; /* preset */
384         prev -= lx;
385
386         for (i = 8; i > 0; i--)
387         {
388             word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */
389             word2 = *((ULong*)(prev + 4));  /* read 4 bytes, b8 b7 b6 b5 */
390             word1 >>= 8; /* 0 b4 b3 b2 */
391             pred_word = word1 | (word2 << 24);  /* b5 b4 b3 b2 */
392             *((ULong*)(rec += 16)) = pred_word;
393
394             word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */
395             word2 >>= 8; /* 0 b8 b7 b6 */
396             pred_word = word2 | (word1 << 24); /* b9 b8 b7 b6 */
397             *((ULong*)(rec + 4)) = pred_word;
398         }
399
400         return 1;
401     }
402     else if (tmp == 2) /* second position */
403     {
404         prev -= 2; /* word1-aligned */
405         rec -= 16; /* preset */
406         prev -= lx;
407
408         for (i = 8; i > 0; i--)
409         {
410             word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */
411             word2 = *((ULong*)(prev + 4));  /* read 4 bytes, b8 b7 b6 b5 */
412             word1 >>= 16; /* 0 0 b4 b3 */
413             pred_word = word1 | (word2 << 16);  /* b6 b5 b4 b3 */
414             *((ULong*)(rec += 16)) = pred_word;
415
416             word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */
417             word2 >>= 16; /* 0 0 b8 b7 */
418             pred_word = word2 | (word1 << 16); /* b10 b9 b8 b7 */
419             *((ULong*)(rec + 4)) = pred_word;
420         }
421
422         return 1;
423     }
424     else /* third position */
425     {
426         prev -= 3; /* word1-aligned */
427         rec -= 16; /* preset */
428         prev -= lx;
429
430         for (i = 8; i > 0; i--)
431         {
432             word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */
433             word2 = *((ULong*)(prev + 4));  /* read 4 bytes, b8 b7 b6 b5 */
434             word1 >>= 24; /* 0 0 0 b4 */
435             pred_word = word1 | (word2 << 8);   /* b7 b6 b5 b4 */
436             *((ULong*)(rec += 16)) = pred_word;
437
438             word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */
439             word2 >>= 24; /* 0 0 0 b8 */
440             pred_word = word2 | (word1 << 8); /* b11 b10 b9 b8 */
441             *((ULong*)(rec + 4)) = pred_word;
442
443         }
444
445         return 1;
446     }
447 }
448 /**************************************************************************/
449 Int GetPredAdvBy0x1(
450     UChar *prev,        /* i */
451     UChar *rec,     /* i */
452     Int lx,     /* i */
453     Int rnd1 /* i */
454 )
455 {
456     Int i;      /* loop variable */
457     Int offset;
458     ULong word1, word2, word3, word12;
459     Int tmp;
460     ULong mask;
461
462     /* initialize offset to adjust pixel counter */
463     /*    the next row; full-pel resolution      */
464     offset = lx - B_SIZE; /* offset for prev */
465
466     /* Branch based on pixel location (half-pel or full-pel) for x and y */
467     rec -= 12; /* preset */
468
469     tmp = (ULong)prev & 3;
470     mask = 254;
471     mask |= (mask << 8);
472     mask |= (mask << 16); /* 0xFEFEFEFE */
473
474     if (tmp == 0) /* word-aligned */
475     {
476         if (rnd1 == 1)
477         {
478             for (i = B_SIZE; i > 0; i--)
479             {
480                 word1 = *((ULong*)prev); /* b4 b3 b2 b1 */
481                 word2 = *((ULong*)(prev += 4)); /* b8 b7 b6 b5 */
482                 word12 = (word1 >> 8); /* 0 b4 b3 b2 */
483                 word12 |= (word2 << 24); /* b5 b4 b3 b2 */
484                 word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
485                 word1 &= mask;
486                 word3 &= (~mask); /* 0x1010101, check last bit */
487                 word12 &= mask;
488                 word1 >>= 1;
489                 word1 = word1 + (word12 >> 1);
490                 word1 += word3;
491                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
492
493                 word1 = *((ULong*)(prev += 4)); /* b12 b11 b10 b9 */
494                 word12 = (word2 >> 8); /* 0 b8 b7 b6 */
495                 word12 |= (word1 << 24); /* b9 b8 b7 b6 */
496                 word3 = word2 | word12;
497                 word2 &= mask;
498                 word3 &= (~mask);  /* 0x1010101, check last bit */
499                 word12 &= mask;
500                 word2 >>= 1;
501                 word2 = word2 + (word12 >> 1);
502                 word2 += word3;
503                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
504
505                 prev += offset;
506             }
507             return 1;
508         }
509         else /* rnd1 == 0 */
510         {
511             for (i = B_SIZE; i > 0; i--)
512             {
513                 word1 = *((ULong*)prev); /* b4 b3 b2 b1 */
514
515                 word2 = *((ULong*)(prev += 4)); /* b8 b7 b6 b5 */
516                 word12 = (word1 >> 8); /* 0 b4 b3 b2 */
517                 word12 |= (word2 << 24); /* b5 b4 b3 b2 */
518                 word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
519                 word1 &= mask;
520                 word3 &= (~mask); /* 0x1010101, check last bit */
521                 word12 &= mask;
522                 word1 >>= 1;
523                 word1 = word1 + (word12 >> 1);
524                 word1 += word3;
525                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
526
527                 word1 = *((ULong*)(prev += 4)); /* b12 b11 b10 b9 */
528                 word12 = (word2 >> 8); /* 0 b8 b7 b6 */
529                 word12 |= (word1 << 24); /* b9 b8 b7 b6 */
530                 word3 = word2 & word12;
531                 word2 &= mask;
532                 word3 &= (~mask);  /* 0x1010101, check last bit */
533                 word12 &= mask;
534                 word2 >>= 1;
535                 word2 = word2 + (word12 >> 1);
536                 word2 += word3;
537                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
538
539                 prev += offset;
540             }
541             return 1;
542         } /* rnd1 */
543     }
544     else if (tmp == 1)
545     {
546         prev--; /* word-aligned */
547         if (rnd1 == 1)
548         {
549             for (i = B_SIZE; i > 0; i--)
550             {
551                 word1 = *((ULong*)prev); /* b3 b2 b1 b0 */
552                 word2 = *((ULong*)(prev += 4)); /* b7 b6 b5 b4 */
553                 word12 = (word1 >> 8); /* 0 b3 b2 b1 */
554                 word1 >>= 16; /* 0 0 b3 b2 */
555                 word12 |= (word2 << 24); /* b4 b3 b2 b1 */
556                 word1 |= (word2 << 16); /* b5 b4 b3 b2 */
557                 word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
558                 word1 &= mask;
559                 word3 &= (~mask); /* 0x1010101, check last bit */
560                 word12 &= mask;
561                 word1 >>= 1;
562                 word1 = word1 + (word12 >> 1);
563                 word1 += word3;
564                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
565
566                 word1 = *((ULong*)(prev += 4)); /* b11 b10 b9 b8 */
567                 word12 = (word2 >> 8); /* 0 b7 b6 b5 */
568                 word2 >>= 16; /* 0 0 b7 b6 */
569                 word12 |= (word1 << 24); /* b8 b7 b6 b5 */
570                 word2 |= (word1 << 16); /* b9 b8 b7 b6 */
571                 word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word2&word12
572                 word2 &= mask;
573                 word3 &= (~mask); /* 0x1010101, check last bit */
574                 word12 &= mask;
575                 word2 >>= 1;
576                 word2 = word2 + (word12 >> 1);
577                 word2 += word3;
578                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
579
580                 prev += offset;
581             }
582             return 1;
583         }
584         else /* rnd1 = 0 */
585         {
586             for (i = B_SIZE; i > 0; i--)
587             {
588                 word1 = *((ULong*)prev); /* b3 b2 b1 b0 */
589
590                 word2 = *((ULong*)(prev += 4)); /* b7 b6 b5 b4 */
591                 word12 = (word1 >> 8); /* 0 b3 b2 b1 */
592                 word1 >>= 16; /* 0 0 b3 b2 */
593                 word12 |= (word2 << 24); /* b4 b3 b2 b1 */
594                 word1 |= (word2 << 16); /* b5 b4 b3 b2 */
595                 word3 = word1 & word12;
596                 word1 &= mask;
597                 word3 &= (~mask); /* 0x1010101, check last bit */
598                 word12 &= mask;
599                 word1 >>= 1;
600                 word1 = word1 + (word12 >> 1);
601                 word1 += word3;
602                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
603
604                 word1 = *((ULong*)(prev += 4)); /* b11 b10 b9 b8 */
605                 word12 = (word2 >> 8); /* 0 b7 b6 b5 */
606                 word2 >>= 16; /* 0 0 b7 b6 */
607                 word12 |= (word1 << 24); /* b8 b7 b6 b5 */
608                 word2 |= (word1 << 16); /* b9 b8 b7 b6 */
609                 word3 = word2 & word12;
610                 word2 &= mask;
611                 word3 &= (~mask); /* 0x1010101, check last bit */
612                 word12 &= mask;
613                 word2 >>= 1;
614                 word2 = word2 + (word12 >> 1);
615                 word2 += word3;
616                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
617
618                 prev += offset;
619             }
620             return 1;
621         } /* rnd1 */
622     }
623     else if (tmp == 2)
624     {
625         prev -= 2; /* word-aligned */
626         if (rnd1 == 1)
627         {
628             for (i = B_SIZE; i > 0; i--)
629             {
630                 word1 = *((ULong*)prev); /* b2 b1 b0 bN1 */
631                 word2 = *((ULong*)(prev += 4)); /* b6 b5 b4 b3 */
632                 word12 = (word1 >> 16); /* 0 0 b2 b1 */
633                 word1 >>= 24; /* 0 0 0 b2 */
634                 word12 |= (word2 << 16); /* b4 b3 b2 b1 */
635                 word1 |= (word2 << 8); /* b5 b4 b3 b2 */
636                 word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
637                 word1 &= mask;
638                 word3 &= (~mask); /* 0x1010101, check last bit */
639                 word12 &= mask;
640                 word1 >>= 1;
641                 word1 = word1 + (word12 >> 1);
642                 word1 += word3;
643                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
644
645                 word1 = *((ULong*)(prev += 4)); /* b10 b9 b8 b7 */
646                 word12 = (word2 >> 16); /* 0 0 b6 b5 */
647                 word2 >>= 24; /* 0 0 0 b6 */
648                 word12 |= (word1 << 16); /* b8 b7 b6 b5 */
649                 word2 |= (word1 << 8); /* b9 b8 b7 b6 */
650                 word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12
651                 word2 &= mask;
652                 word3 &= (~mask); /* 0x1010101, check last bit */
653                 word12 &= mask;
654                 word2 >>= 1;
655                 word2 = word2 + (word12 >> 1);
656                 word2 += word3;
657                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
658                 prev += offset;
659             }
660             return 1;
661         }
662         else /* rnd1 == 0 */
663         {
664             for (i = B_SIZE; i > 0; i--)
665             {
666                 word1 = *((ULong*)prev); /* b2 b1 b0 bN1 */
667                 word2 = *((ULong*)(prev += 4)); /* b6 b5 b4 b3 */
668                 word12 = (word1 >> 16); /* 0 0 b2 b1 */
669                 word1 >>= 24; /* 0 0 0 b2 */
670                 word12 |= (word2 << 16); /* b4 b3 b2 b1 */
671                 word1 |= (word2 << 8); /* b5 b4 b3 b2 */
672                 word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
673                 word1 &= mask;
674                 word3 &= (~mask); /* 0x1010101, check last bit */
675                 word12 &= mask;
676                 word1 >>= 1;
677                 word1 = word1 + (word12 >> 1);
678                 word1 += word3;
679                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
680
681                 word1 = *((ULong*)(prev += 4)); /* b10 b9 b8 b7 */
682                 word12 = (word2 >> 16); /* 0 0 b6 b5 */
683                 word2 >>= 24; /* 0 0 0 b6 */
684                 word12 |= (word1 << 16); /* b8 b7 b6 b5 */
685                 word2 |= (word1 << 8); /* b9 b8 b7 b6 */
686                 word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12
687                 word2 &= mask;
688                 word3 &= (~mask); /* 0x1010101, check last bit */
689                 word12 &= mask;
690                 word2 >>= 1;
691                 word2 = word2 + (word12 >> 1);
692                 word2 += word3;
693                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
694                 prev += offset;
695             }
696             return 1;
697         }
698     }
699     else /* tmp = 3 */
700     {
701         prev -= 3; /* word-aligned */
702         if (rnd1 == 1)
703         {
704             for (i = B_SIZE; i > 0; i--)
705             {
706                 word1 = *((ULong*)prev); /* b1 b0 bN1 bN2 */
707                 word2 = *((ULong*)(prev += 4)); /* b5 b4 b3 b2 */
708                 word12 = (word1 >> 24); /* 0 0 0 b1 */
709                 word12 |= (word2 << 8); /* b4 b3 b2 b1 */
710                 word1 = word2;
711                 word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12
712                 word1 &= mask;
713                 word3 &= (~mask); /* 0x1010101, check last bit */
714                 word12 &= mask;
715                 word1 >>= 1;
716                 word1 = word1 + (word12 >> 1);
717                 word1 += word3;
718                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
719
720                 word1 = *((ULong*)(prev += 4)); /* b9 b8 b7 b6 */
721                 word12 = (word2 >> 24); /* 0 0 0 b5 */
722                 word12 |= (word1 << 8); /* b8 b7 b6 b5 */
723                 word2 = word1; /* b9 b8 b7 b6 */
724                 word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12
725                 word2 &= mask;
726                 word3 &= (~mask); /* 0x1010101, check last bit */
727                 word12 &= mask;
728                 word2 >>= 1;
729                 word2 = word2 + (word12 >> 1);
730                 word2 += word3;
731                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
732                 prev += offset;
733             }
734             return 1;
735         }
736         else
737         {
738             for (i = B_SIZE; i > 0; i--)
739             {
740                 word1 = *((ULong*)prev); /* b1 b0 bN1 bN2 */
741                 word2 = *((ULong*)(prev += 4)); /* b5 b4 b3 b2 */
742                 word12 = (word1 >> 24); /* 0 0 0 b1 */
743                 word12 |= (word2 << 8); /* b4 b3 b2 b1 */
744                 word1 = word2;
745                 word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12
746                 word1 &= mask;
747                 word3 &= (~mask); /* 0x1010101, check last bit */
748                 word12 &= mask;
749                 word1 >>= 1;
750                 word1 = word1 + (word12 >> 1);
751                 word1 += word3;
752                 *((ULong*)(rec += 12)) = word1; /* write 4 pixels */
753
754                 word1 = *((ULong*)(prev += 4)); /* b9 b8 b7 b6 */
755                 word12 = (word2 >> 24); /* 0 0 0 b5 */
756                 word12 |= (word1 << 8); /* b8 b7 b6 b5 */
757                 word2 = word1; /* b9 b8 b7 b6 */
758                 word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12
759                 word2 &= mask;
760                 word3 &= (~mask); /* 0x1010101, check last bit */
761                 word12 &= mask;
762                 word2 >>= 1;
763                 word2 = word2 + (word12 >> 1);
764                 word2 += word3;
765                 *((ULong*)(rec += 4)) = word2; /* write 4 pixels */
766                 prev += offset;
767             }
768             return 1;
769         }
770     }
771 }
772
773 /**************************************************************************/
774 Int GetPredAdvBy1x0(
775     UChar *prev,        /* i */
776     UChar *rec,     /* i */
777     Int lx,     /* i */
778     Int rnd1 /* i */
779 )
780 {
781     Int i;      /* loop variable */
782     Int offset;
783     ULong  word1, word2, word3, word12, word22;
784     Int tmp;
785     ULong mask;
786
787     /* initialize offset to adjust pixel counter */
788     /*    the next row; full-pel resolution      */
789     offset = lx - B_SIZE; /* offset for prev */
790
791     /* Branch based on pixel location (half-pel or full-pel) for x and y */
792     rec -= 12; /* preset */
793
794     tmp = (ULong)prev & 3;
795     mask = 254;
796     mask |= (mask << 8);
797     mask |= (mask << 16); /* 0xFEFEFEFE */
798
799     if (tmp == 0) /* word-aligned */
800     {
801         prev -= 4;
802         if (rnd1 == 1)
803         {
804             for (i = B_SIZE; i > 0; i--)
805             {
806                 word1 = *((ULong*)(prev += 4));
807                 word2 = *((ULong*)(prev + lx));
808                 word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2
809                 word1 &= mask;
810                 word3 &= (~mask); /* 0x1010101, check last bit */
811                 word2 &= mask;
812                 word1 >>= 1;
813                 word1 = word1 + (word2 >> 1);
814                 word1 += word3;
815                 *((ULong*)(rec += 12)) = word1;
816                 word1 = *((ULong*)(prev += 4));
817                 word2 = *((ULong*)(prev + lx));
818                 word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2
819                 word1 &= mask;
820                 word3 &= (~mask); /* 0x1010101, check last bit */
821                 word2 &= mask;
822                 word1 >>= 1;
823                 word1 = word1 + (word2 >> 1);
824                 word1 += word3;
825                 *((ULong*)(rec += 4)) = word1;
826
827                 prev += offset;
828             }
829             return 1;
830         }
831         else   /* rnd1 = 0 */
832         {
833             for (i = B_SIZE; i > 0; i--)
834             {
835                 word1 = *((ULong*)(prev += 4));
836                 word2 = *((ULong*)(prev + lx));
837                 word3 = word1 & word2;  /* rnd1 = 0; */
838                 word1 &= mask;
839                 word3 &= (~mask); /* 0x1010101, check last bit */
840                 word2 &= mask;
841                 word1 >>= 1;
842                 word1 = word1 + (word2 >> 1);
843                 word1 += word3;
844                 *((ULong*)(rec += 12)) = word1;
845                 word1 = *((ULong*)(prev += 4));
846                 word2 = *((ULong*)(prev + lx));
847                 word3 = word1 & word2;  /* rnd1 = 0; */
848                 word1 &= mask;
849                 word3 &= (~mask); /* 0x1010101, check last bit */
850                 word2 &= mask;
851                 word1 >>= 1;
852                 word1 = word1 + (word2 >> 1);
853                 word1 += word3;
854                 *((ULong*)(rec += 4)) = word1;
855
856                 prev += offset;
857             }
858             return 1;
859         }
860     }
861     else if (tmp == 1)
862     {
863         prev--; /* word-aligned */
864         if (rnd1 == 1)
865         {
866             for (i = B_SIZE; i > 0; i--)
867             {
868                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
869                 word22 = *((ULong*)(prev + lx));
870
871                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
872                 word2 = *((ULong*)(prev + lx));
873                 word12 >>= 8; /* 0 b4 b3 b2 */
874                 word22 >>= 8;
875                 word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */
876                 word22 = word22 | (word2 << 24);
877                 word3 = word12 | word22;
878                 word12 &= mask;
879                 word22 &= mask;
880                 word3 &= (~mask); /* 0x1010101, check last bit */
881                 word12 >>= 1;
882                 word12 = word12 + (word22 >> 1);
883                 word12 += word3;
884                 *((ULong*)(rec += 12)) = word12;
885
886                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
887                 word22 = *((ULong*)(prev + lx));
888                 word1 >>= 8; /* 0 b8 b7 b6 */
889                 word2 >>= 8;
890                 word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */
891                 word2 = word2 | (word22 << 24);
892                 word3 = word1 | word2;
893                 word1 &= mask;
894                 word2 &= mask;
895                 word3 &= (~mask); /* 0x1010101, check last bit */
896                 word1 >>= 1;
897                 word1 = word1 + (word2 >> 1);
898                 word1 += word3;
899                 *((ULong*)(rec += 4)) = word1;
900                 prev += offset;
901             }
902             return 1;
903         }
904         else /* rnd1 = 0 */
905         {
906             for (i = B_SIZE; i > 0; i--)
907             {
908                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
909                 word22 = *((ULong*)(prev + lx));
910
911                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
912                 word2 = *((ULong*)(prev + lx));
913                 word12 >>= 8; /* 0 b4 b3 b2 */
914                 word22 >>= 8;
915                 word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */
916                 word22 = word22 | (word2 << 24);
917                 word3 = word12 & word22;
918                 word12 &= mask;
919                 word22 &= mask;
920                 word3 &= (~mask); /* 0x1010101, check last bit */
921                 word12 >>= 1;
922                 word12 = word12 + (word22 >> 1);
923                 word12 += word3;
924                 *((ULong*)(rec += 12)) = word12;
925
926                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
927                 word22 = *((ULong*)(prev + lx));
928                 word1 >>= 8; /* 0 b8 b7 b6 */
929                 word2 >>= 8;
930                 word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */
931                 word2 = word2 | (word22 << 24);
932                 word3 = word1 & word2;
933                 word1 &= mask;
934                 word2 &= mask;
935                 word3 &= (~mask); /* 0x1010101, check last bit */
936                 word1 >>= 1;
937                 word1 = word1 + (word2 >> 1);
938                 word1 += word3;
939                 *((ULong*)(rec += 4)) = word1;
940                 prev += offset;
941             }
942             return 1;
943         }
944     }
945     else if (tmp == 2)
946     {
947         prev -= 2; /* word-aligned */
948         if (rnd1 == 1)
949         {
950             for (i = B_SIZE; i > 0; i--)
951             {
952                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
953                 word22 = *((ULong*)(prev + lx));
954
955                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
956                 word2 = *((ULong*)(prev + lx));
957                 word12 >>= 16; /* 0 0 b4 b3 */
958                 word22 >>= 16;
959                 word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */
960                 word22 = word22 | (word2 << 16);
961                 word3 = word12 | word22;
962                 word12 &= mask;
963                 word22 &= mask;
964                 word3 &= (~mask); /* 0x1010101, check last bit */
965                 word12 >>= 1;
966                 word12 = word12 + (word22 >> 1);
967                 word12 += word3;
968                 *((ULong*)(rec += 12)) = word12;
969
970                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
971                 word22 = *((ULong*)(prev + lx));
972                 word1 >>= 16; /* 0 0 b8 b7 */
973                 word2 >>= 16;
974                 word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */
975                 word2 = word2 | (word22 << 16);
976                 word3 = word1 | word2;
977                 word1 &= mask;
978                 word2 &= mask;
979                 word3 &= (~mask); /* 0x1010101, check last bit */
980                 word1 >>= 1;
981                 word1 = word1 + (word2 >> 1);
982                 word1 += word3;
983                 *((ULong*)(rec += 4)) = word1;
984                 prev += offset;
985             }
986             return 1;
987         }
988         else /* rnd1 = 0 */
989         {
990             for (i = B_SIZE; i > 0; i--)
991             {
992                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
993                 word22 = *((ULong*)(prev + lx));
994
995                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
996                 word2 = *((ULong*)(prev + lx));
997                 word12 >>= 16; /* 0 0 b4 b3 */
998                 word22 >>= 16;
999                 word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */
1000                 word22 = word22 | (word2 << 16);
1001                 word3 = word12 & word22;
1002                 word12 &= mask;
1003                 word22 &= mask;
1004                 word3 &= (~mask); /* 0x1010101, check last bit */
1005                 word12 >>= 1;
1006                 word12 = word12 + (word22 >> 1);
1007                 word12 += word3;
1008                 *((ULong*)(rec += 12)) = word12;
1009
1010                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
1011                 word22 = *((ULong*)(prev + lx));
1012                 word1 >>= 16; /* 0 0 b8 b7 */
1013                 word2 >>= 16;
1014                 word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */
1015                 word2 = word2 | (word22 << 16);
1016                 word3 = word1 & word2;
1017                 word1 &= mask;
1018                 word2 &= mask;
1019                 word3 &= (~mask); /* 0x1010101, check last bit */
1020                 word1 >>= 1;
1021                 word1 = word1 + (word2 >> 1);
1022                 word1 += word3;
1023                 *((ULong*)(rec += 4)) = word1;
1024                 prev += offset;
1025             }
1026
1027             return 1;
1028         }
1029     }
1030     else /* tmp == 3 */
1031     {
1032         prev -= 3; /* word-aligned */
1033         if (rnd1 == 1)
1034         {
1035             for (i = B_SIZE; i > 0; i--)
1036             {
1037                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
1038                 word22 = *((ULong*)(prev + lx));
1039
1040                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
1041                 word2 = *((ULong*)(prev + lx));
1042                 word12 >>= 24; /* 0 0 0 b4 */
1043                 word22 >>= 24;
1044                 word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */
1045                 word22 = word22 | (word2 << 8);
1046                 word3 = word12 | word22;
1047                 word12 &= mask;
1048                 word22 &= mask;
1049                 word3 &= (~mask); /* 0x1010101, check last bit */
1050                 word12 >>= 1;
1051                 word12 = word12 + (word22 >> 1);
1052                 word12 += word3;
1053                 *((ULong*)(rec += 12)) = word12;
1054
1055                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
1056                 word22 = *((ULong*)(prev + lx));
1057                 word1 >>= 24; /* 0 0 0 b8 */
1058                 word2 >>= 24;
1059                 word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */
1060                 word2 = word2 | (word22 << 8);
1061                 word3 = word1 | word2;
1062                 word1 &= mask;
1063                 word2 &= mask;
1064                 word3 &= (~mask); /* 0x1010101, check last bit */
1065                 word1 >>= 1;
1066                 word1 = word1 + (word2 >> 1);
1067                 word1 += word3;
1068                 *((ULong*)(rec += 4)) = word1;
1069                 prev += offset;
1070             }
1071             return 1;
1072         }
1073         else /* rnd1 = 0 */
1074         {
1075             for (i = B_SIZE; i > 0; i--)
1076             {
1077                 word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */
1078                 word22 = *((ULong*)(prev + lx));
1079
1080                 word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */
1081                 word2 = *((ULong*)(prev + lx));
1082                 word12 >>= 24; /* 0 0 0 b4 */
1083                 word22 >>= 24;
1084                 word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */
1085                 word22 = word22 | (word2 << 8);
1086                 word3 = word12 & word22;
1087                 word12 &= mask;
1088                 word22 &= mask;
1089                 word3 &= (~mask); /* 0x1010101, check last bit */
1090                 word12 >>= 1;
1091                 word12 = word12 + (word22 >> 1);
1092                 word12 += word3;
1093                 *((ULong*)(rec += 12)) = word12;
1094
1095                 word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */
1096                 word22 = *((ULong*)(prev + lx));
1097                 word1 >>= 24; /* 0 0 0 b8 */
1098                 word2 >>= 24;
1099                 word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */
1100                 word2 = word2 | (word22 << 8);
1101                 word3 = word1 & word2;
1102                 word1 &= mask;
1103                 word2 &= mask;
1104                 word3 &= (~mask); /* 0x1010101, check last bit */
1105                 word1 >>= 1;
1106                 word1 = word1 + (word2 >> 1);
1107                 word1 += word3;
1108                 *((ULong*)(rec += 4)) = word1;
1109                 prev += offset;
1110             }
1111             return 1;
1112         } /* rnd */
1113     } /* tmp */
1114 }
1115
1116 /**********************************************************************************/
1117 Int GetPredAdvBy1x1(
1118     UChar *prev,        /* i */
1119     UChar *rec,     /* i */
1120     Int lx,     /* i */
1121     Int rnd1 /* i */
1122 )
1123 {
1124     Int i;      /* loop variable */
1125     Int offset;
1126     ULong  x1, x2, x1m, x2m, y1, y2, y1m, y2m; /* new way */
1127     Int tmp;
1128     Int rnd2;
1129     ULong mask;
1130
1131     /* initialize offset to adjust pixel counter */
1132     /*    the next row; full-pel resolution      */
1133     offset = lx - B_SIZE; /* offset for prev */
1134
1135     rnd2 = rnd1 + 1;
1136     rnd2 |= (rnd2 << 8);
1137     rnd2 |= (rnd2 << 16);
1138
1139     mask = 0x3F;
1140     mask |= (mask << 8);
1141     mask |= (mask << 16); /* 0x3f3f3f3f */
1142
1143     tmp = (ULong)prev & 3;
1144
1145     rec -= 4; /* preset */
1146
1147     if (tmp == 0) /* word-aligned */
1148     {
1149         for (i = B_SIZE; i > 0; i--)
1150         {
1151             x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */
1152             x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */
1153             y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */
1154             y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */
1155
1156             x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
1157             x2m = (x2 >> 2) & mask;
1158             x1 = x1 ^(x1m << 2);
1159             x2 = x2 ^(x2m << 2);
1160             x1m += x2m;
1161             x1 += x2;
1162
1163             /* x2m, x2 free */
1164             y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
1165             y2m = (y2 >> 2) & mask;
1166             y1 = y1 ^(y1m << 2);
1167             y2 = y2 ^(y2m << 2);
1168             y1m += y2m;
1169             y1 += y2;
1170
1171             /* y2m, y2 free */
1172             /* x2m, x2 free */
1173             x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */
1174             y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */
1175             x2m = (x2 >> 2) & mask;
1176             y2m = (y2 >> 2) & mask;
1177             x2 = x2 ^(x2m << 2);
1178             y2 = y2 ^(y2m << 2);
1179             x2m += y2m;
1180             x2 += y2;
1181             /* y2m, y2 free */
1182
1183             /* now operate on x1m, x1, y1m, y1, x2m, x2 */
1184             /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
1185             /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
1186             /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
1187             /* x1, y1, x2 */
1188
1189             y2m = x1m >> 8;
1190             y2 = x1 >> 8;
1191             y2m |= (y1m << 24);  /* a4+b4, a3+b3, a2+b2, a1+b1 */
1192             y2 |= (y1 << 24);
1193             x1m += y2m;  /* a3+b3+a4+b4, ....., a0+b0+a1+b1 */
1194             x1 += y2;
1195             x1 += rnd2;
1196             x1 &= (mask << 2);
1197             x1m += (x1 >> 2);
1198             *((ULong*)(rec += 4)) = x1m; /* save x1m */
1199
1200             y2m = y1m >> 8;
1201             y2 = y1 >> 8;
1202             y2m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */
1203             y2 |= (x2 << 24);
1204             y1m += y2m;  /* a7+b7+a8+b8, ....., a4+b4+a5+b5 */
1205             y1 += y2;
1206             y1 += rnd2;
1207             y1 &= (mask << 2);
1208             y1m += (y1 >> 2);
1209             *((ULong*)(rec += 4)) = y1m; /* save y1m */
1210
1211             rec += 8;
1212             prev += offset;
1213         }
1214
1215         return 1;
1216     }
1217     else if (tmp == 1)
1218     {
1219         prev--; /* to word-aligned */
1220         for (i = B_SIZE; i > 0; i--)
1221         {
1222             x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */
1223             x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */
1224             y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */
1225             y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */
1226
1227             x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
1228             x2m = (x2 >> 2) & mask;
1229             x1 = x1 ^(x1m << 2);
1230             x2 = x2 ^(x2m << 2);
1231             x1m += x2m;
1232             x1 += x2;
1233
1234             /* x2m, x2 free */
1235             y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
1236             y2m = (y2 >> 2) & mask;
1237             y1 = y1 ^(y1m << 2);
1238             y2 = y2 ^(y2m << 2);
1239             y1m += y2m;
1240             y1 += y2;
1241
1242             /* y2m, y2 free */
1243             /* x2m, x2 free */
1244             x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */
1245             y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */
1246             x2m = (x2 >> 2) & mask;
1247             y2m = (y2 >> 2) & mask;
1248             x2 = x2 ^(x2m << 2);
1249             y2 = y2 ^(y2m << 2);
1250             x2m += y2m;
1251             x2 += y2;
1252             /* y2m, y2 free */
1253
1254             /* now operate on x1m, x1, y1m, y1, x2m, x2 */
1255             /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
1256             /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
1257             /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
1258             /* x1, y1, x2 */
1259
1260             x1m >>= 8 ;
1261             x1 >>= 8;
1262             x1m |= (y1m << 24);  /* a4+b4, a3+b3, a2+b2, a1+b1 */
1263             x1 |= (y1 << 24);
1264             y2m = (y1m << 16);
1265             y2 = (y1 << 16);
1266             y2m |= (x1m >> 8); /* a5+b5, a4+b4, a3+b3, a2+b2 */
1267             y2 |= (x1 >> 8);
1268             x1 += rnd2;
1269             x1m += y2m;  /* a4+b4+a5+b5, ....., a1+b1+a2+b2 */
1270             x1 += y2;
1271             x1 &= (mask << 2);
1272             x1m += (x1 >> 2);
1273             *((ULong*)(rec += 4)) = x1m; /* save x1m */
1274
1275             y1m >>= 8;
1276             y1 >>= 8;
1277             y1m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */
1278             y1 |= (x2 << 24);
1279             y2m = (x2m << 16);
1280             y2 = (x2 << 16);
1281             y2m |= (y1m >> 8); /*  a9+b9, a8+b8, a7+b7, a6+b6,*/
1282             y2 |= (y1 >> 8);
1283             y1 += rnd2;
1284             y1m += y2m;  /* a8+b8+a9+b9, ....., a5+b5+a6+b6 */
1285             y1 += y2;
1286             y1 &= (mask << 2);
1287             y1m += (y1 >> 2);
1288             *((ULong*)(rec += 4)) = y1m; /* save y1m */
1289
1290             rec += 8;
1291             prev += offset;
1292         }
1293         return 1;
1294     }
1295     else if (tmp == 2)
1296     {
1297         prev -= 2; /* to word-aligned */
1298         for (i = B_SIZE; i > 0; i--)
1299         {
1300             x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */
1301             x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */
1302             y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */
1303             y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */
1304
1305             x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
1306             x2m = (x2 >> 2) & mask;
1307             x1 = x1 ^(x1m << 2);
1308             x2 = x2 ^(x2m << 2);
1309             x1m += x2m;
1310             x1 += x2;
1311
1312             /* x2m, x2 free */
1313             y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
1314             y2m = (y2 >> 2) & mask;
1315             y1 = y1 ^(y1m << 2);
1316             y2 = y2 ^(y2m << 2);
1317             y1m += y2m;
1318             y1 += y2;
1319
1320             /* y2m, y2 free */
1321             /* x2m, x2 free */
1322             x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */
1323             y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */
1324             x2m = (x2 >> 2) & mask;
1325             y2m = (y2 >> 2) & mask;
1326             x2 = x2 ^(x2m << 2);
1327             y2 = y2 ^(y2m << 2);
1328             x2m += y2m;
1329             x2 += y2;
1330             /* y2m, y2 free */
1331
1332             /* now operate on x1m, x1, y1m, y1, x2m, x2 */
1333             /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
1334             /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
1335             /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
1336             /* x1, y1, x2 */
1337
1338             x1m >>= 16 ;
1339             x1 >>= 16;
1340             x1m |= (y1m << 16);  /* a5+b5, a4+b4, a3+b3, a2+b2 */
1341             x1 |= (y1 << 16);
1342             y2m = (y1m << 8);
1343             y2 = (y1 << 8);
1344             y2m |= (x1m >> 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */
1345             y2 |= (x1 >> 8);
1346             x1 += rnd2;
1347             x1m += y2m;  /* a5+b5+a6+b6, ....., a2+b2+a3+b3 */
1348             x1 += y2;
1349             x1 &= (mask << 2);
1350             x1m += (x1 >> 2);
1351             *((ULong*)(rec += 4)) = x1m; /* save x1m */
1352
1353             y1m >>= 16;
1354             y1 >>= 16;
1355             y1m |= (x2m << 16); /* a9+b9, a8+b8, a7+b7, a6+b6 */
1356             y1 |= (x2 << 16);
1357             y2m = (x2m << 8);
1358             y2 = (x2 << 8);
1359             y2m |= (y1m >> 8); /*  a10+b10, a9+b9, a8+b8, a7+b7,*/
1360             y2 |= (y1 >> 8);
1361             y1 += rnd2;
1362             y1m += y2m;  /* a9+b9+a10+b10, ....., a6+b6+a7+b7 */
1363             y1 += y2;
1364             y1 &= (mask << 2);
1365             y1m += (y1 >> 2);
1366             *((ULong*)(rec += 4)) = y1m; /* save y1m */
1367
1368             rec += 8;
1369             prev += offset;
1370         }
1371         return 1;
1372     }
1373     else /* tmp == 3 */
1374     {
1375         prev -= 3; /* to word-aligned */
1376         for (i = B_SIZE; i > 0; i--)
1377         {
1378             x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */
1379             x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */
1380             y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */
1381             y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */
1382
1383             x1m = (x1 >> 2) & mask; /* zero out last 2 bits */
1384             x2m = (x2 >> 2) & mask;
1385             x1 = x1 ^(x1m << 2);
1386             x2 = x2 ^(x2m << 2);
1387             x1m += x2m;
1388             x1 += x2;
1389
1390             /* x2m, x2 free */
1391             y1m = (y1 >> 2) & mask; /* zero out last 2 bits */
1392             y2m = (y2 >> 2) & mask;
1393             y1 = y1 ^(y1m << 2);
1394             y2 = y2 ^(y2m << 2);
1395             y1m += y2m;
1396             y1 += y2;
1397
1398             /* y2m, y2 free */
1399             /* x2m, x2 free */
1400             x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */
1401             y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */
1402             x2m = (x2 >> 2) & mask;
1403             y2m = (y2 >> 2) & mask;
1404             x2 = x2 ^(x2m << 2);
1405             y2 = y2 ^(y2m << 2);
1406             x2m += y2m;
1407             x2 += y2;
1408             /* y2m, y2 free */
1409
1410             /* now operate on x1m, x1, y1m, y1, x2m, x2 */
1411             /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */
1412             /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */
1413             /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */
1414             /* x1, y1, x2 */
1415
1416             x1m >>= 24 ;
1417             x1 >>= 24;
1418             x1m |= (y1m << 8);  /* a6+b6, a5+b5, a4+b4, a3+b3 */
1419             x1 |= (y1 << 8);
1420
1421             x1m += y1m;  /* a6+b6+a7+b7, ....., a3+b3+a4+b4 */
1422             x1 += y1;
1423             x1 += rnd2;
1424             x1 &= (mask << 2);
1425             x1m += (x1 >> 2);
1426             *((ULong*)(rec += 4)) = x1m; /* save x1m */
1427
1428             y1m >>= 24;
1429             y1 >>= 24;
1430             y1m |= (x2m << 8); /* a10+b10, a9+b9, a8+b8, a7+b7 */
1431             y1 |= (x2 << 8);
1432             y1m += x2m;  /* a10+b10+a11+b11, ....., a7+b7+a8+b8 */
1433             y1 += x2;
1434             y1 += rnd2;
1435             y1 &= (mask << 2);
1436             y1m += (y1 >> 2);
1437             *((ULong*)(rec += 4)) = y1m; /* save y1m */
1438
1439             rec += 8;
1440             prev += offset;
1441         }
1442         return 1;
1443     }
1444 }
1445
1446
1447 /*=============================================================================
1448     Function:   EncGetPredOutside
1449     Date:       04/17/2001
1450     Purpose:    - modified from GetPredOutside in the decoder.
1451     Modified:    09/24/05
1452                 use the existing non-initialized padded region
1453 =============================================================================*/
1454 // not really needed since padding is included
1455 #define PAD_CORNER  { temp = *src; \
1456                      temp |= (temp<<8); \
1457                      temp |= (temp<<16); \
1458                      *((ULong*)dst) = temp; \
1459                      *((ULong*)(dst+4)) = temp; \
1460                      *((ULong*)(dst+=lx)) = temp; \
1461                      *((ULong*)(dst+4)) = temp; \
1462                      *((ULong*)(dst+=lx)) = temp; \
1463                      *((ULong*)(dst+4)) = temp; \
1464                      *((ULong*)(dst+=lx)) = temp; \
1465                      *((ULong*)(dst+4)) = temp; \
1466                      *((ULong*)(dst+=lx)) = temp; \
1467                      *((ULong*)(dst+4)) = temp; \
1468                      *((ULong*)(dst+=lx)) = temp; \
1469                      *((ULong*)(dst+4)) = temp; \
1470                      *((ULong*)(dst+=lx)) = temp; \
1471                      *((ULong*)(dst+4)) = temp; \
1472                      *((ULong*)(dst+=lx)) = temp; \
1473                      *((ULong*)(dst+4)) = temp; }
1474
1475 #define PAD_ROW     { temp = *((ULong*)src); \
1476                       temp2 = *((ULong*)(src+4)); \
1477                       *((ULong*)dst) = temp; \
1478                       *((ULong*)(dst+4)) = temp2; \
1479                       *((ULong*)(dst+=lx)) = temp; \
1480                       *((ULong*)(dst+4)) = temp2; \
1481                       *((ULong*)(dst+=lx)) = temp; \
1482                       *((ULong*)(dst+4)) = temp2; \
1483                       *((ULong*)(dst+=lx)) = temp; \
1484                       *((ULong*)(dst+4)) = temp2; \
1485                       *((ULong*)(dst+=lx)) = temp; \
1486                       *((ULong*)(dst+4)) = temp2; \
1487                       *((ULong*)(dst+=lx)) = temp; \
1488                       *((ULong*)(dst+4)) = temp2; \
1489                       *((ULong*)(dst+=lx)) = temp; \
1490                       *((ULong*)(dst+4)) = temp2; \
1491                       *((ULong*)(dst+=lx)) = temp; \
1492                       *((ULong*)(dst+4)) = temp2; }
1493
1494 #define PAD_COL     { temp = *src;   temp |= (temp<<8);  temp |= (temp<<16); \
1495                       *((ULong*)dst) = temp; \
1496                      *((ULong*)(dst+4)) = temp; \
1497                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1498                       *((ULong*)(dst+=lx)) = temp; \
1499                      *((ULong*)(dst+4)) = temp; \
1500                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1501                       *((ULong*)(dst+=lx)) = temp; \
1502                      *((ULong*)(dst+4)) = temp; \
1503                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1504                       *((ULong*)(dst+=lx)) = temp; \
1505                      *((ULong*)(dst+4)) = temp; \
1506                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1507                       *((ULong*)(dst+=lx)) = temp; \
1508                      *((ULong*)(dst+4)) = temp; \
1509                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1510                       *((ULong*)(dst+=lx)) = temp; \
1511                      *((ULong*)(dst+4)) = temp; \
1512                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1513                       *((ULong*)(dst+=lx)) = temp; \
1514                      *((ULong*)(dst+4)) = temp; \
1515                       temp = *(src+=lx);     temp |= (temp<<8);  temp |= (temp<<16); \
1516                       *((ULong*)(dst+=lx)) = temp; \
1517                       *((ULong*)(dst+4)) = temp; }
1518
1519
1520 Int EncGetPredOutside(Int xpos, Int ypos, UChar *c_prev, UChar *rec,
1521                       Int width, Int height, Int rnd1)
1522 {
1523     Int lx;
1524     UChar *src, *dst;
1525     ULong temp, temp2;
1526     Int xoffset;
1527
1528     lx = width + 16; /* only works for chroma */
1529
1530     if (xpos < 0)
1531     {
1532         if (ypos < 0) /* pad top-left */
1533         {
1534             /* pad corner */
1535             src = c_prev;
1536             dst = c_prev - (lx << 3) - 8;
1537             PAD_CORNER
1538
1539             /* pad top */
1540             dst = c_prev - (lx << 3);
1541             PAD_ROW
1542
1543             /* pad left */
1544             dst = c_prev - 8;
1545             PAD_COL
1546
1547             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1548                                              rec, lx, rnd1);
1549
1550             return 1;
1551         }
1552         else if ((ypos >> 1) < (height - 8)) /* pad left of frame */
1553         {
1554             /* pad left */
1555             src = c_prev + (ypos >> 1) * lx;
1556             dst = src - 8;
1557             PAD_COL
1558             /* pad extra row */
1559             temp = *(src += lx);
1560             temp |= (temp << 8);
1561             temp |= (temp << 16);
1562             *((ULong*)(dst += lx)) = temp;
1563             *((ULong*)(dst + 4)) = temp;
1564
1565             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1566                                              rec, lx, rnd1);
1567
1568             return 1;
1569         }
1570         else /* pad bottom-left */
1571         {
1572             /* pad corner */
1573             src = c_prev + (height - 1) * lx;
1574             dst = src + lx - 8;
1575             PAD_CORNER
1576
1577             /* pad bottom */
1578             dst = src + lx;
1579             PAD_ROW
1580
1581             /* pad left */
1582             src -= (lx << 3);
1583             src += lx;
1584             dst = src - 8;
1585             PAD_COL
1586
1587             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1588                                              rec, lx, rnd1);
1589
1590             return 1;
1591         }
1592     }
1593     else if ((xpos >> 1) < (width - 8))
1594     {
1595         if (ypos < 0) /* pad top of frame */
1596         {
1597             xoffset = (xpos >> 1) & 0x3;
1598             src = c_prev + (xpos >> 1) - xoffset;
1599             dst = src - (lx << 3);
1600             PAD_ROW
1601             if (xoffset || (xpos&1))
1602             {
1603                 temp = *((ULong*)(src + 8));
1604                 dst = src - (lx << 3) + 8;
1605                 *((ULong*)dst) = temp;
1606                 *((ULong*)(dst += lx)) = temp;
1607                 *((ULong*)(dst += lx)) = temp;
1608                 *((ULong*)(dst += lx)) = temp;
1609                 *((ULong*)(dst += lx)) = temp;
1610                 *((ULong*)(dst += lx)) = temp;
1611                 *((ULong*)(dst += lx)) = temp;
1612                 *((ULong*)(dst += lx)) = temp;
1613             }
1614
1615             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1616                                              rec, lx, rnd1);
1617
1618             return 1;
1619         }
1620         else /* pad bottom of frame */
1621         {
1622             xoffset = (xpos >> 1) & 0x3;
1623             src = c_prev + (xpos >> 1) - xoffset + (height - 1) * lx;
1624             dst = src + lx;
1625             PAD_ROW
1626             if (xoffset || (xpos&1))
1627             {
1628                 temp = *((ULong*)(src + 8));
1629                 dst = src + lx + 8;
1630                 *((ULong*)dst) = temp;
1631                 *((ULong*)(dst += lx)) = temp;
1632                 *((ULong*)(dst += lx)) = temp;
1633                 *((ULong*)(dst += lx)) = temp;
1634                 *((ULong*)(dst += lx)) = temp;
1635                 *((ULong*)(dst += lx)) = temp;
1636                 *((ULong*)(dst += lx)) = temp;
1637                 *((ULong*)(dst += lx)) = temp;
1638             }
1639
1640             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1641                                              rec, lx, rnd1);
1642
1643             return 1;
1644         }
1645     }
1646     else
1647     {
1648         if (ypos < 0) /* pad top-right */
1649         {
1650             /* pad corner */
1651             src = c_prev + width - 1;
1652             dst = src - (lx << 3) + 1;
1653             PAD_CORNER
1654
1655             /* pad top */
1656             src -= 7;
1657             dst = src - (lx << 3);
1658             PAD_ROW
1659
1660             /* pad left */
1661             src += 7;
1662             dst = src + 1;
1663             PAD_COL
1664
1665             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1666                                              rec, lx, rnd1);
1667
1668             return 1;
1669         }
1670         else if ((ypos >> 1) < (height - B_SIZE)) /* pad right of frame */
1671         {
1672             /* pad left */
1673             src = c_prev + (ypos >> 1) * lx + width - 1;
1674             dst = src + 1;
1675             PAD_COL
1676             /* pad extra row */
1677             temp = *(src += lx);
1678             temp |= (temp << 8);
1679             temp |= (temp << 16);
1680             *((ULong*)(dst += lx)) = temp;
1681             *((ULong*)(dst + 4)) = temp;
1682
1683             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1684                                              rec, lx, rnd1);
1685
1686             return 1;
1687         }
1688         else /* pad bottom-right */
1689         {
1690             /* pad left */
1691             src = c_prev + (height - 8) * lx + width - 1;
1692             dst = src + 1;
1693             PAD_COL
1694
1695             /* pad corner */
1696             dst = src + lx + 1;
1697             PAD_CORNER
1698
1699             /* pad bottom */
1700             src -= 7;
1701             dst = src + lx;
1702             PAD_ROW
1703
1704             GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx),
1705                                              rec, lx, rnd1);
1706
1707             return 1;
1708         }
1709     }
1710 }
1711
1712 /* ====================================================================== /
1713     Function : Copy_MB_from_Vop()
1714     Date     : 04/17/2001
1715  ====================================================================== */
1716
1717 void Copy_MB_from_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int pitch)
1718 {
1719     Int row, col, i;
1720     Int *src1, *src2;
1721     Int offset = pitch - MB_SIZE;
1722     ULong temp;
1723
1724     for (i = 0; i < 4; i += 2)
1725     {
1726         src1 = yChan[i];
1727         src2 = yChan[i+1];
1728
1729         row = B_SIZE;
1730         while (row--)
1731         {
1732             col = B_SIZE;
1733             while (col)
1734             {
1735                 temp = *((ULong*)comp);
1736                 *src1++ = (Int)(temp & 0xFF);
1737                 *src1++ = (Int)((temp >> 8) & 0xFF);
1738                 *src1++ = (Int)((temp >> 16) & 0xFF);
1739                 *src1++ = (Int)((temp >> 24) & 0xFF);
1740                 comp += 4;
1741                 col -= 4;
1742             }
1743             col = B_SIZE;
1744             while (col)
1745             {
1746                 temp = *((ULong*)comp);
1747                 *src2++ = (Int)(temp & 0xFF);
1748                 *src2++ = (Int)((temp >> 8) & 0xFF);
1749                 *src2++ = (Int)((temp >> 16) & 0xFF);
1750                 *src2++ = (Int)((temp >> 24) & 0xFF);
1751                 comp += 4;
1752                 col -= 4;
1753             }
1754             comp += offset;
1755         }
1756     }
1757     return ;
1758 }
1759
1760 /* ====================================================================== /
1761     Function : Copy_B_from_Vop()
1762     Date     : 04/17/2001
1763 / ====================================================================== */
1764
1765 void Copy_B_from_Vop(UChar *comp, Int cChan[], Int pitch)
1766 {
1767     Int row, col;
1768     Int offset = pitch - B_SIZE;
1769     ULong temp;
1770
1771     row = B_SIZE;
1772     while (row--)
1773     {
1774         col = B_SIZE;
1775         while (col)
1776         {
1777             temp = *((ULong*)comp);
1778             *cChan++ = (Int)(temp & 0xFF);
1779             *cChan++ = (Int)((temp >> 8) & 0xFF);
1780             *cChan++ = (Int)((temp >> 16) & 0xFF);
1781             *cChan++ = (Int)((temp >> 24) & 0xFF);
1782             comp += 4;
1783             col -= 4;
1784         }
1785         comp += offset;
1786     }
1787 }
1788
1789 /* ====================================================================== /
1790     Function : Copy_MB_into_Vop()
1791     Date     : 04/17/2001
1792     History  : From decoder
1793 / ====================================================================== */
1794
1795 void Copy_MB_into_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int pitch)
1796 {
1797     Int row, col, i;
1798     Int *src1, *src2;
1799     Int offset = pitch - MB_SIZE;
1800     UChar mask = 0xFF;
1801     Int tmp;
1802     ULong temp;
1803
1804     for (i = 0; i < 4; i += 2)
1805     {
1806         src1 = yChan[i];
1807         src2 = yChan[i+1];
1808
1809         row = B_SIZE;
1810         while (row--)
1811         {
1812             col = B_SIZE;
1813             while (col)
1814             {
1815                 tmp = (*src1++);
1816                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1817                 temp = tmp << 24;
1818                 tmp = (*src1++);
1819                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1820                 temp |= (tmp << 16);
1821                 tmp = (*src1++);
1822                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1823                 temp |= (tmp << 8);
1824                 tmp = (*src1++);
1825                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1826                 temp |= tmp;
1827                 *((ULong*)comp) = temp;
1828                 comp += 4;
1829                 col -= 4;
1830             }
1831             col = B_SIZE;
1832             while (col)
1833             {
1834                 tmp = (*src2++);
1835                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1836                 temp = tmp << 24;
1837                 tmp = (*src2++);
1838                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1839                 temp |= (tmp << 16);
1840                 tmp = (*src2++);
1841                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1842                 temp |= (tmp << 8);
1843                 tmp = (*src2++);
1844                 if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1845                 temp |= tmp;
1846                 *((ULong*)comp) = temp;
1847                 comp += 4;
1848                 col -= 4;
1849             }
1850             comp += offset;
1851         }
1852     }
1853     return ;
1854 }
1855
1856
1857 /* ====================================================================== /
1858     Function : Copy_B_into_Vop()
1859     Date     : 04/17/2001
1860     History  : From decoder
1861 / ====================================================================== */
1862
1863 void Copy_B_into_Vop(UChar *comp, Int cChan[], Int pitch)
1864 {
1865     Int row, col;
1866     Int offset = pitch - B_SIZE;
1867     Int tmp;
1868     UChar mask = 0xFF;
1869     ULong temp;
1870
1871     row = B_SIZE;
1872     while (row--)
1873     {
1874         col = B_SIZE;
1875         while (col)
1876         {
1877             tmp = (*cChan++);
1878             if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1879             temp = tmp << 24;
1880             tmp = (*cChan++);
1881             if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1882             temp |= (tmp << 16);
1883             tmp = (*cChan++);
1884             if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1885             temp |= (tmp << 8);
1886             tmp = (*cChan++);
1887             if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31));
1888             temp |= tmp;
1889             *((ULong*)comp) = temp;
1890             comp += 4;
1891             col -= 4;
1892         }
1893         comp += offset;
1894     }
1895 }
1896
1897 /* ======================================================================== */
1898 /*  Function : get_MB( )                                                    */
1899 /*  Date     : 10/03/2000                                                   */
1900 /*  Purpose  : Copy 4 Y to reference frame                                  */
1901 /*  In/out   :                                                              */
1902 /*  Return   :                                                              */
1903 /*  Modified :                                                              */
1904 /* ======================================================================== */
1905 void get_MB(UChar *c_prev, UChar *c_prev_u  , UChar *c_prev_v,
1906             Short mb[6][64], Int lx, Int lx_uv)
1907
1908 {
1909     Int i, j, count = 0, count1 = 0;
1910     Int k1 = lx - MB_SIZE, k2 = lx_uv - B_SIZE;
1911
1912     for (i = 0; i < B_SIZE; i++)
1913     {
1914         for (j = 0; j < B_SIZE; j++)
1915         {
1916             mb[0][count] = (Int)(*c_prev++);
1917             mb[4][count] = (Int)(*c_prev_u++);
1918             mb[5][count++] = (Int)(*c_prev_v++);
1919         }
1920
1921         for (j = 0; j < B_SIZE; j++)
1922             mb[1][count1++] = (Int)(*c_prev++);
1923
1924         c_prev += k1;
1925         c_prev_u += k2;
1926         c_prev_v += k2;
1927
1928
1929     }
1930
1931     count = count1 = 0;
1932     for (i = 0; i < B_SIZE; i++)
1933     {
1934         for (j = 0; j < B_SIZE; j++)
1935             mb[2][count++] = (Int)(*c_prev++);
1936
1937         for (j = 0; j < B_SIZE; j++)
1938             mb[3][count1++] = (Int)(*c_prev++);
1939
1940         c_prev += k1;
1941     }
1942 }
1943
1944 void PutSkippedBlock(UChar *rec, UChar *prev, Int lx)
1945 {
1946     UChar *end;
1947     Int offset = (lx - 8) >> 2;
1948     Int *src, *dst;
1949
1950     dst = (Int*)rec;
1951     src = (Int*)prev;
1952
1953     end = prev + (lx << 3);
1954
1955     do
1956     {
1957         *dst++ = *src++;
1958         *dst++ = *src++;
1959         dst += offset;
1960         src += offset;
1961     }
1962     while ((UInt)src < (UInt)end);
1963
1964     return ;
1965 }