diff options
Diffstat (limited to 'media/libstagefright/codecs/m4v_h263/enc/src/motion_comp.cpp')
-rw-r--r-- | media/libstagefright/codecs/m4v_h263/enc/src/motion_comp.cpp | 1965 |
1 files changed, 0 insertions, 1965 deletions
diff --git a/media/libstagefright/codecs/m4v_h263/enc/src/motion_comp.cpp b/media/libstagefright/codecs/m4v_h263/enc/src/motion_comp.cpp deleted file mode 100644 index b81d278..0000000 --- a/media/libstagefright/codecs/m4v_h263/enc/src/motion_comp.cpp +++ /dev/null @@ -1,1965 +0,0 @@ -/* ------------------------------------------------------------------ - * Copyright (C) 1998-2009 PacketVideo - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either - * express or implied. - * See the License for the specific language governing permissions - * and limitations under the License. - * ------------------------------------------------------------------- - */ -#include "mp4lib_int.h" -#include "mp4enc_lib.h" - -//const static Int roundtab4[] = {0,1,1,1}; -//const static Int roundtab8[] = {0,0,1,1,1,1,1,2}; -//const static Int roundtab12[] = {0,0,0,1,1,1,1,1,1,1,2,2}; -const static Int roundtab16[] = {0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2}; - -#define FORWARD_MODE 1 -#define BACKWARD_MODE 2 -#define BIDIRECTION_MODE 3 -#define DIRECT_MODE 4 - -#ifdef __cplusplus -extern "C" -{ -#endif - /*Function Prototype */ - /* no-edge padding */ - Int EncGetPredOutside(Int xpos, Int ypos, UChar *c_prev, UChar *rec, - Int width, Int height, Int rnd1); - - void Copy_MB_from_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int width); - void Copy_B_from_Vop(UChar *comp, Int cChan[], Int width); - void Copy_MB_into_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int width); - void Copy_B_into_Vop(UChar *comp, Int cChan[], Int width); - void get_MB(UChar *c_prev, UChar *c_prev_u , UChar *c_prev_v, - Short mb[6][64], Int lx, Int lx_uv); - - Int GetPredAdvBy0x0( - UChar *c_prev, /* i */ - UChar *pred_block, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ - ); - - Int GetPredAdvBy0x1( - UChar *c_prev, /* i */ - UChar *pred_block, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ - ); - - Int GetPredAdvBy1x0( - UChar *c_prev, /* i */ - UChar *pred_block, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ - ); - - Int GetPredAdvBy1x1( - UChar *c_prev, /* i */ - UChar *pred_block, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ - ); - - static Int(*const GetPredAdvBTable[2][2])(UChar*, UChar*, Int, Int) = - { - {&GetPredAdvBy0x0, &GetPredAdvBy0x1}, - {&GetPredAdvBy1x0, &GetPredAdvBy1x1} - }; - - -#ifdef __cplusplus -} -#endif - - -/* ======================================================================== */ -/* Function : getMotionCompensatedMB( ) */ -/* Date : 4/17/2001 */ -/* Purpose : Get the motion compensate block into video->predictionMB */ -/* and generate video->predictionErrorMB */ -/* modified from MBMotionComp() function in the decoder */ -/* In/out : */ -/* Return : */ -/* Modified : */ -/* ======================================================================== */ - -void getMotionCompensatedMB(VideoEncData *video, Int ind_x, Int ind_y, Int offset) -{ - Vop *prevVop = video->forwardRefVop; //reference frame - Vop *currVop = video->currVop; - Int mbnum = video->mbnum; //mb index - MOT *mot = video->mot[mbnum]; - Int ypos, xpos; - UChar *c_prev, *cu_prev, *cv_prev; - UChar *c_rec, *cu_rec, *cv_rec; - Int height, pitch, pitch_uv, height_uv; - Int mode = video->headerInfo.Mode[mbnum]; /* get mode */ - Int dx, dy; - Int xpred, ypred; - Int xsum, ysum; - Int round1; - - OSCL_UNUSED_ARG(offset); - - round1 = (Int)(1 - video->currVop->roundingType); - - pitch = currVop->pitch; - height = currVop->height; - pitch_uv = pitch >> 1; - height_uv = height >> 1; - - ypos = ind_y << 4 ; - xpos = ind_x << 4 ; - - c_rec = video->predictedMB; - cu_rec = video->predictedMB + 256; - cv_rec = video->predictedMB + 264; - - if (mode == MODE_INTER || mode == MODE_INTER_Q) - { - /* Motion vector in x direction */ - dx = mot[0].x; - dy = mot[0].y; - - c_prev = prevVop->yChan; - - xpred = (xpos << 1) + dx ; - ypred = (ypos << 1) + dy ; - - /* Call function that performs luminance prediction */ - EncPrediction_INTER(xpred, ypred, c_prev, c_rec, - pitch, round1); - - if ((dx & 3) == 0) dx = dx >> 1; - else dx = (dx >> 1) | 1; - - if ((dy & 3) == 0) dy = dy >> 1; - else dy = (dy >> 1) | 1; - - xpred = xpos + dx; - ypred = ypos + dy; - - cu_prev = prevVop->uChan; - cv_prev = prevVop->vChan; - - EncPrediction_Chrom(xpred, ypred, cu_prev, cv_prev, cu_rec, cv_rec, - pitch_uv, (currVop->width) >> 1, height_uv, round1); - } -#ifndef NO_INTER4V - else if (mode == MODE_INTER4V) - { - c_prev = prevVop->yChan; - cu_prev = prevVop->uChan; - cv_prev = prevVop->vChan; - - EncPrediction_INTER4V(xpos, ypos, mot, c_prev, c_rec, - pitch, round1); - - xsum = mot[1].x + mot[2].x + mot[3].x + mot[4].x; - ysum = mot[1].y + mot[2].y + mot[3].y + mot[4].y; - - dx = PV_SIGN(xsum) * (roundtab16[(PV_ABS(xsum)) & 0xF] + - (((PV_ABS(xsum)) >> 4) << 1)); - dy = PV_SIGN(ysum) * (roundtab16[(PV_ABS(ysum)) & 0xF] + - (((PV_ABS(ysum)) >> 4) << 1)); - - ypred = ypos + dy; - xpred = xpos + dx; - - EncPrediction_Chrom(xpred, ypred, cu_prev, cv_prev, cu_rec, cv_rec, - pitch_uv, (currVop->width) >> 1, height_uv, round1); - } -#endif - else - { - ;//printf("Error, MODE_SKIPPED is not decided yet!\n"); - } - - return ; -} - -/*************************************************************************** - Function: EncPrediction_INTER - Date: 04/17/2001 - Purpose: Get predicted area for luminance and compensate with the residue. - Modified from luminance_pred_mode_inter() in decoder. -***************************************************************************/ - -void EncPrediction_INTER( - Int xpred, /* i */ - Int ypred, /* i */ - UChar *c_prev, /* i */ - UChar *c_rec, /* i */ - Int lx, /* i */ - Int round1 /* i */ -) -{ - c_prev += (xpred >> 1) + ((ypred >> 1) * lx); - - GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1); - - c_prev += B_SIZE; - c_rec += B_SIZE; - - GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1); - - c_prev += (lx << 3) - B_SIZE; - c_rec += (16 << 3) - B_SIZE; /* padding */ - - GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1); - - c_prev += B_SIZE; - c_rec += B_SIZE; - - GetPredAdvBTable[ypred&1][xpred&1](c_prev, c_rec, lx, round1); - - return; -} - -#ifndef NO_INTER4V -/*************************************************************************** - Function: EncPrediction_INTER4V - Date: 04/17/2001 - Purpose: Get predicted area for luminance and compensate with the residue. - Modified from luminance_pred_mode_inter4v() in decoder. -***************************************************************************/ - -void EncPrediction_INTER4V( - Int xpos, /* i */ - Int ypos, /* i */ - MOT *mot, /* i */ - UChar *c_prev, /* i */ - UChar *c_rec, /* i */ - Int lx, /* i */ - Int round1 /* i */ -) -{ - Int ypred, xpred; - - xpred = (Int)((xpos << 1) + mot[1].x); - ypred = (Int)((ypos << 1) + mot[1].y); - - GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx), - c_rec, lx, round1); - - c_rec += B_SIZE; - - xpred = (Int)(((xpos + B_SIZE) << 1) + mot[2].x); - ypred = (Int)((ypos << 1) + mot[2].y); - - GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx), - c_rec, lx, round1); - - c_rec += (16 << 3) - B_SIZE; /* padding */ - - xpred = (Int)((xpos << 1) + mot[3].x); - ypred = (Int)(((ypos + B_SIZE) << 1) + mot[3].y); - - GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx), - c_rec, lx, round1); - - c_rec += B_SIZE; - - xpred = (Int)(((xpos + B_SIZE) << 1) + mot[4].x); - ypred = (Int)(((ypos + B_SIZE) << 1) + mot[4].y); - - GetPredAdvBTable[ypred&1][xpred&1](c_prev + (xpred >> 1) + ((ypred >> 1)*lx), - c_rec, lx, round1); - - return; -} -#endif /* NO_INTER4V */ - -/*************************************************************************** - Function: EncPrediction_Chrom - Date: 04/17/2001 - Purpose: Get predicted area for chrominance and compensate with the residue. - Modified from chrominance_pred() in decoder. -***************************************************************************/ - -void EncPrediction_Chrom( - Int xpred, /* i */ - Int ypred, /* i */ - UChar *cu_prev, /* i */ - UChar *cv_prev, /* i */ - UChar *cu_rec, - UChar *cv_rec, - Int lx, - Int width_uv, /* i */ - Int height_uv, /* i */ - Int round1 /* i */ -) -{ - /* check whether the MV points outside the frame */ - /* Compute prediction for Chrominance b block (block[4]) */ - if (xpred >= 0 && xpred <= ((width_uv << 1) - (2*B_SIZE)) && ypred >= 0 && - ypred <= ((height_uv << 1) - (2*B_SIZE))) - { - /*****************************/ - /* (x,y) is inside the frame */ - /*****************************/ - - /* Compute prediction for Chrominance b (block[4]) */ - GetPredAdvBTable[ypred&1][xpred&1](cu_prev + (xpred >> 1) + ((ypred >> 1)*lx), - cu_rec, lx, round1); - - /* Compute prediction for Chrominance r (block[5]) */ - GetPredAdvBTable[ypred&1][xpred&1](cv_prev + (xpred >> 1) + ((ypred >> 1)*lx), - cv_rec, lx, round1); - } - else - { - /******************************/ - /* (x,y) is outside the frame */ - /******************************/ - - /* Compute prediction for Chrominance b (block[4]) */ - EncGetPredOutside(xpred, ypred, - cu_prev, cu_rec, - width_uv, height_uv, round1); - - /* Compute prediction for Chrominance r (block[5]) */ - EncGetPredOutside(xpred, ypred, - cv_prev, cv_rec, - width_uv, height_uv, round1); - } - - return; -} -/*************************************************************************** - Function: GetPredAdvancedB - Date: 04/17/2001 - Purpose: Get predicted area (block) and compensate with the residue. - - modified from GetPredAdvancedBAdd in decoder. - Intput/Output: - Modified: -***************************************************************************/ - -Int GetPredAdvBy0x0( - UChar *prev, /* i */ - UChar *rec, /* i */ - Int lx, /* i */ - Int rnd /* i */ -) -{ - Int i; /* loop variable */ - ULong pred_word, word1, word2; - Int tmp; - - OSCL_UNUSED_ARG(rnd); - - /* initialize offset to adjust pixel counter */ - /* the next row; full-pel resolution */ - - tmp = (ULong)prev & 0x3; - - if (tmp == 0) /* word-aligned */ - { - rec -= 16; /* preset */ - prev -= lx; - - for (i = 8; i > 0; i--) - { - *((ULong*)(rec += 16)) = *((ULong*)(prev += lx)); - *((ULong*)(rec + 4)) = *((ULong*)(prev + 4)); - } - return 1; - } - else if (tmp == 1) /* first position */ - { - prev--; /* word-aligned */ - rec -= 16; /* preset */ - prev -= lx; - - for (i = 8; i > 0; i--) - { - word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */ - word2 = *((ULong*)(prev + 4)); /* read 4 bytes, b8 b7 b6 b5 */ - word1 >>= 8; /* 0 b4 b3 b2 */ - pred_word = word1 | (word2 << 24); /* b5 b4 b3 b2 */ - *((ULong*)(rec += 16)) = pred_word; - - word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */ - word2 >>= 8; /* 0 b8 b7 b6 */ - pred_word = word2 | (word1 << 24); /* b9 b8 b7 b6 */ - *((ULong*)(rec + 4)) = pred_word; - } - - return 1; - } - else if (tmp == 2) /* second position */ - { - prev -= 2; /* word1-aligned */ - rec -= 16; /* preset */ - prev -= lx; - - for (i = 8; i > 0; i--) - { - word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */ - word2 = *((ULong*)(prev + 4)); /* read 4 bytes, b8 b7 b6 b5 */ - word1 >>= 16; /* 0 0 b4 b3 */ - pred_word = word1 | (word2 << 16); /* b6 b5 b4 b3 */ - *((ULong*)(rec += 16)) = pred_word; - - word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */ - word2 >>= 16; /* 0 0 b8 b7 */ - pred_word = word2 | (word1 << 16); /* b10 b9 b8 b7 */ - *((ULong*)(rec + 4)) = pred_word; - } - - return 1; - } - else /* third position */ - { - prev -= 3; /* word1-aligned */ - rec -= 16; /* preset */ - prev -= lx; - - for (i = 8; i > 0; i--) - { - word1 = *((ULong*)(prev += lx)); /* read 4 bytes, b4 b3 b2 b1 */ - word2 = *((ULong*)(prev + 4)); /* read 4 bytes, b8 b7 b6 b5 */ - word1 >>= 24; /* 0 0 0 b4 */ - pred_word = word1 | (word2 << 8); /* b7 b6 b5 b4 */ - *((ULong*)(rec += 16)) = pred_word; - - word1 = *((ULong*)(prev + 8)); /* b12 b11 b10 b9 */ - word2 >>= 24; /* 0 0 0 b8 */ - pred_word = word2 | (word1 << 8); /* b11 b10 b9 b8 */ - *((ULong*)(rec + 4)) = pred_word; - - } - - return 1; - } -} -/**************************************************************************/ -Int GetPredAdvBy0x1( - UChar *prev, /* i */ - UChar *rec, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ -) -{ - Int i; /* loop variable */ - Int offset; - ULong word1, word2, word3, word12; - Int tmp; - ULong mask; - - /* initialize offset to adjust pixel counter */ - /* the next row; full-pel resolution */ - offset = lx - B_SIZE; /* offset for prev */ - - /* Branch based on pixel location (half-pel or full-pel) for x and y */ - rec -= 12; /* preset */ - - tmp = (ULong)prev & 3; - mask = 254; - mask |= (mask << 8); - mask |= (mask << 16); /* 0xFEFEFEFE */ - - if (tmp == 0) /* word-aligned */ - { - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b4 b3 b2 b1 */ - word2 = *((ULong*)(prev += 4)); /* b8 b7 b6 b5 */ - word12 = (word1 >> 8); /* 0 b4 b3 b2 */ - word12 |= (word2 << 24); /* b5 b4 b3 b2 */ - word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b12 b11 b10 b9 */ - word12 = (word2 >> 8); /* 0 b8 b7 b6 */ - word12 |= (word1 << 24); /* b9 b8 b7 b6 */ - word3 = word2 | word12; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - - prev += offset; - } - return 1; - } - else /* rnd1 == 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b4 b3 b2 b1 */ - - word2 = *((ULong*)(prev += 4)); /* b8 b7 b6 b5 */ - word12 = (word1 >> 8); /* 0 b4 b3 b2 */ - word12 |= (word2 << 24); /* b5 b4 b3 b2 */ - word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b12 b11 b10 b9 */ - word12 = (word2 >> 8); /* 0 b8 b7 b6 */ - word12 |= (word1 << 24); /* b9 b8 b7 b6 */ - word3 = word2 & word12; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - - prev += offset; - } - return 1; - } /* rnd1 */ - } - else if (tmp == 1) - { - prev--; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b3 b2 b1 b0 */ - word2 = *((ULong*)(prev += 4)); /* b7 b6 b5 b4 */ - word12 = (word1 >> 8); /* 0 b3 b2 b1 */ - word1 >>= 16; /* 0 0 b3 b2 */ - word12 |= (word2 << 24); /* b4 b3 b2 b1 */ - word1 |= (word2 << 16); /* b5 b4 b3 b2 */ - word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b11 b10 b9 b8 */ - word12 = (word2 >> 8); /* 0 b7 b6 b5 */ - word2 >>= 16; /* 0 0 b7 b6 */ - word12 |= (word1 << 24); /* b8 b7 b6 b5 */ - word2 |= (word1 << 16); /* b9 b8 b7 b6 */ - word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word2&word12 - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - - prev += offset; - } - return 1; - } - else /* rnd1 = 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b3 b2 b1 b0 */ - - word2 = *((ULong*)(prev += 4)); /* b7 b6 b5 b4 */ - word12 = (word1 >> 8); /* 0 b3 b2 b1 */ - word1 >>= 16; /* 0 0 b3 b2 */ - word12 |= (word2 << 24); /* b4 b3 b2 b1 */ - word1 |= (word2 << 16); /* b5 b4 b3 b2 */ - word3 = word1 & word12; - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b11 b10 b9 b8 */ - word12 = (word2 >> 8); /* 0 b7 b6 b5 */ - word2 >>= 16; /* 0 0 b7 b6 */ - word12 |= (word1 << 24); /* b8 b7 b6 b5 */ - word2 |= (word1 << 16); /* b9 b8 b7 b6 */ - word3 = word2 & word12; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - - prev += offset; - } - return 1; - } /* rnd1 */ - } - else if (tmp == 2) - { - prev -= 2; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b2 b1 b0 bN1 */ - word2 = *((ULong*)(prev += 4)); /* b6 b5 b4 b3 */ - word12 = (word1 >> 16); /* 0 0 b2 b1 */ - word1 >>= 24; /* 0 0 0 b2 */ - word12 |= (word2 << 16); /* b4 b3 b2 b1 */ - word1 |= (word2 << 8); /* b5 b4 b3 b2 */ - word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b10 b9 b8 b7 */ - word12 = (word2 >> 16); /* 0 0 b6 b5 */ - word2 >>= 24; /* 0 0 0 b6 */ - word12 |= (word1 << 16); /* b8 b7 b6 b5 */ - word2 |= (word1 << 8); /* b9 b8 b7 b6 */ - word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - prev += offset; - } - return 1; - } - else /* rnd1 == 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b2 b1 b0 bN1 */ - word2 = *((ULong*)(prev += 4)); /* b6 b5 b4 b3 */ - word12 = (word1 >> 16); /* 0 0 b2 b1 */ - word1 >>= 24; /* 0 0 0 b2 */ - word12 |= (word2 << 16); /* b4 b3 b2 b1 */ - word1 |= (word2 << 8); /* b5 b4 b3 b2 */ - word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b10 b9 b8 b7 */ - word12 = (word2 >> 16); /* 0 0 b6 b5 */ - word2 >>= 24; /* 0 0 0 b6 */ - word12 |= (word1 << 16); /* b8 b7 b6 b5 */ - word2 |= (word1 << 8); /* b9 b8 b7 b6 */ - word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12 - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - prev += offset; - } - return 1; - } - } - else /* tmp = 3 */ - { - prev -= 3; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b1 b0 bN1 bN2 */ - word2 = *((ULong*)(prev += 4)); /* b5 b4 b3 b2 */ - word12 = (word1 >> 24); /* 0 0 0 b1 */ - word12 |= (word2 << 8); /* b4 b3 b2 b1 */ - word1 = word2; - word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b9 b8 b7 b6 */ - word12 = (word2 >> 24); /* 0 0 0 b5 */ - word12 |= (word1 << 8); /* b8 b7 b6 b5 */ - word2 = word1; /* b9 b8 b7 b6 */ - word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12 - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - prev += offset; - } - return 1; - } - else - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)prev); /* b1 b0 bN1 bN2 */ - word2 = *((ULong*)(prev += 4)); /* b5 b4 b3 b2 */ - word12 = (word1 >> 24); /* 0 0 0 b1 */ - word12 |= (word2 << 8); /* b4 b3 b2 b1 */ - word1 = word2; - word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word1 >>= 1; - word1 = word1 + (word12 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; /* write 4 pixels */ - - word1 = *((ULong*)(prev += 4)); /* b9 b8 b7 b6 */ - word12 = (word2 >> 24); /* 0 0 0 b5 */ - word12 |= (word1 << 8); /* b8 b7 b6 b5 */ - word2 = word1; /* b9 b8 b7 b6 */ - word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12 - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 &= mask; - word2 >>= 1; - word2 = word2 + (word12 >> 1); - word2 += word3; - *((ULong*)(rec += 4)) = word2; /* write 4 pixels */ - prev += offset; - } - return 1; - } - } -} - -/**************************************************************************/ -Int GetPredAdvBy1x0( - UChar *prev, /* i */ - UChar *rec, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ -) -{ - Int i; /* loop variable */ - Int offset; - ULong word1, word2, word3, word12, word22; - Int tmp; - ULong mask; - - /* initialize offset to adjust pixel counter */ - /* the next row; full-pel resolution */ - offset = lx - B_SIZE; /* offset for prev */ - - /* Branch based on pixel location (half-pel or full-pel) for x and y */ - rec -= 12; /* preset */ - - tmp = (ULong)prev & 3; - mask = 254; - mask |= (mask << 8); - mask |= (mask << 16); /* 0xFEFEFEFE */ - - if (tmp == 0) /* word-aligned */ - { - prev -= 4; - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)(prev += 4)); - word2 = *((ULong*)(prev + lx)); - word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word2 &= mask; - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; - word1 = *((ULong*)(prev += 4)); - word2 = *((ULong*)(prev + lx)); - word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2 - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word2 &= mask; - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - - prev += offset; - } - return 1; - } - else /* rnd1 = 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word1 = *((ULong*)(prev += 4)); - word2 = *((ULong*)(prev + lx)); - word3 = word1 & word2; /* rnd1 = 0; */ - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word2 &= mask; - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 12)) = word1; - word1 = *((ULong*)(prev += 4)); - word2 = *((ULong*)(prev + lx)); - word3 = word1 & word2; /* rnd1 = 0; */ - word1 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word2 &= mask; - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - - prev += offset; - } - return 1; - } - } - else if (tmp == 1) - { - prev--; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 8; /* 0 b4 b3 b2 */ - word22 >>= 8; - word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */ - word22 = word22 | (word2 << 24); - word3 = word12 | word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 8; /* 0 b8 b7 b6 */ - word2 >>= 8; - word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */ - word2 = word2 | (word22 << 24); - word3 = word1 | word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - return 1; - } - else /* rnd1 = 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 8; /* 0 b4 b3 b2 */ - word22 >>= 8; - word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */ - word22 = word22 | (word2 << 24); - word3 = word12 & word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 8; /* 0 b8 b7 b6 */ - word2 >>= 8; - word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */ - word2 = word2 | (word22 << 24); - word3 = word1 & word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - return 1; - } - } - else if (tmp == 2) - { - prev -= 2; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 16; /* 0 0 b4 b3 */ - word22 >>= 16; - word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */ - word22 = word22 | (word2 << 16); - word3 = word12 | word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 16; /* 0 0 b8 b7 */ - word2 >>= 16; - word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */ - word2 = word2 | (word22 << 16); - word3 = word1 | word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - return 1; - } - else /* rnd1 = 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 16; /* 0 0 b4 b3 */ - word22 >>= 16; - word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */ - word22 = word22 | (word2 << 16); - word3 = word12 & word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 16; /* 0 0 b8 b7 */ - word2 >>= 16; - word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */ - word2 = word2 | (word22 << 16); - word3 = word1 & word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - - return 1; - } - } - else /* tmp == 3 */ - { - prev -= 3; /* word-aligned */ - if (rnd1 == 1) - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 24; /* 0 0 0 b4 */ - word22 >>= 24; - word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */ - word22 = word22 | (word2 << 8); - word3 = word12 | word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 24; /* 0 0 0 b8 */ - word2 >>= 24; - word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */ - word2 = word2 | (word22 << 8); - word3 = word1 | word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - return 1; - } - else /* rnd1 = 0 */ - { - for (i = B_SIZE; i > 0; i--) - { - word12 = *((ULong*)prev); /* read b4 b3 b2 b1 */ - word22 = *((ULong*)(prev + lx)); - - word1 = *((ULong*)(prev += 4)); /* read b8 b7 b6 b5 */ - word2 = *((ULong*)(prev + lx)); - word12 >>= 24; /* 0 0 0 b4 */ - word22 >>= 24; - word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */ - word22 = word22 | (word2 << 8); - word3 = word12 & word22; - word12 &= mask; - word22 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word12 >>= 1; - word12 = word12 + (word22 >> 1); - word12 += word3; - *((ULong*)(rec += 12)) = word12; - - word12 = *((ULong*)(prev += 4)); /* read b12 b11 b10 b9 */ - word22 = *((ULong*)(prev + lx)); - word1 >>= 24; /* 0 0 0 b8 */ - word2 >>= 24; - word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */ - word2 = word2 | (word22 << 8); - word3 = word1 & word2; - word1 &= mask; - word2 &= mask; - word3 &= (~mask); /* 0x1010101, check last bit */ - word1 >>= 1; - word1 = word1 + (word2 >> 1); - word1 += word3; - *((ULong*)(rec += 4)) = word1; - prev += offset; - } - return 1; - } /* rnd */ - } /* tmp */ -} - -/**********************************************************************************/ -Int GetPredAdvBy1x1( - UChar *prev, /* i */ - UChar *rec, /* i */ - Int lx, /* i */ - Int rnd1 /* i */ -) -{ - Int i; /* loop variable */ - Int offset; - ULong x1, x2, x1m, x2m, y1, y2, y1m, y2m; /* new way */ - Int tmp; - Int rnd2; - ULong mask; - - /* initialize offset to adjust pixel counter */ - /* the next row; full-pel resolution */ - offset = lx - B_SIZE; /* offset for prev */ - - rnd2 = rnd1 + 1; - rnd2 |= (rnd2 << 8); - rnd2 |= (rnd2 << 16); - - mask = 0x3F; - mask |= (mask << 8); - mask |= (mask << 16); /* 0x3f3f3f3f */ - - tmp = (ULong)prev & 3; - - rec -= 4; /* preset */ - - if (tmp == 0) /* word-aligned */ - { - for (i = B_SIZE; i > 0; i--) - { - x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */ - x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */ - y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */ - y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */ - - x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ - x2m = (x2 >> 2) & mask; - x1 = x1 ^(x1m << 2); - x2 = x2 ^(x2m << 2); - x1m += x2m; - x1 += x2; - - /* x2m, x2 free */ - y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ - y2m = (y2 >> 2) & mask; - y1 = y1 ^(y1m << 2); - y2 = y2 ^(y2m << 2); - y1m += y2m; - y1 += y2; - - /* y2m, y2 free */ - /* x2m, x2 free */ - x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */ - y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */ - x2m = (x2 >> 2) & mask; - y2m = (y2 >> 2) & mask; - x2 = x2 ^(x2m << 2); - y2 = y2 ^(y2m << 2); - x2m += y2m; - x2 += y2; - /* y2m, y2 free */ - - /* now operate on x1m, x1, y1m, y1, x2m, x2 */ - /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ - /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ - /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ - /* x1, y1, x2 */ - - y2m = x1m >> 8; - y2 = x1 >> 8; - y2m |= (y1m << 24); /* a4+b4, a3+b3, a2+b2, a1+b1 */ - y2 |= (y1 << 24); - x1m += y2m; /* a3+b3+a4+b4, ....., a0+b0+a1+b1 */ - x1 += y2; - x1 += rnd2; - x1 &= (mask << 2); - x1m += (x1 >> 2); - *((ULong*)(rec += 4)) = x1m; /* save x1m */ - - y2m = y1m >> 8; - y2 = y1 >> 8; - y2m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */ - y2 |= (x2 << 24); - y1m += y2m; /* a7+b7+a8+b8, ....., a4+b4+a5+b5 */ - y1 += y2; - y1 += rnd2; - y1 &= (mask << 2); - y1m += (y1 >> 2); - *((ULong*)(rec += 4)) = y1m; /* save y1m */ - - rec += 8; - prev += offset; - } - - return 1; - } - else if (tmp == 1) - { - prev--; /* to word-aligned */ - for (i = B_SIZE; i > 0; i--) - { - x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */ - x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */ - y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */ - y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */ - - x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ - x2m = (x2 >> 2) & mask; - x1 = x1 ^(x1m << 2); - x2 = x2 ^(x2m << 2); - x1m += x2m; - x1 += x2; - - /* x2m, x2 free */ - y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ - y2m = (y2 >> 2) & mask; - y1 = y1 ^(y1m << 2); - y2 = y2 ^(y2m << 2); - y1m += y2m; - y1 += y2; - - /* y2m, y2 free */ - /* x2m, x2 free */ - x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */ - y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */ - x2m = (x2 >> 2) & mask; - y2m = (y2 >> 2) & mask; - x2 = x2 ^(x2m << 2); - y2 = y2 ^(y2m << 2); - x2m += y2m; - x2 += y2; - /* y2m, y2 free */ - - /* now operate on x1m, x1, y1m, y1, x2m, x2 */ - /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ - /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ - /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ - /* x1, y1, x2 */ - - x1m >>= 8 ; - x1 >>= 8; - x1m |= (y1m << 24); /* a4+b4, a3+b3, a2+b2, a1+b1 */ - x1 |= (y1 << 24); - y2m = (y1m << 16); - y2 = (y1 << 16); - y2m |= (x1m >> 8); /* a5+b5, a4+b4, a3+b3, a2+b2 */ - y2 |= (x1 >> 8); - x1 += rnd2; - x1m += y2m; /* a4+b4+a5+b5, ....., a1+b1+a2+b2 */ - x1 += y2; - x1 &= (mask << 2); - x1m += (x1 >> 2); - *((ULong*)(rec += 4)) = x1m; /* save x1m */ - - y1m >>= 8; - y1 >>= 8; - y1m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */ - y1 |= (x2 << 24); - y2m = (x2m << 16); - y2 = (x2 << 16); - y2m |= (y1m >> 8); /* a9+b9, a8+b8, a7+b7, a6+b6,*/ - y2 |= (y1 >> 8); - y1 += rnd2; - y1m += y2m; /* a8+b8+a9+b9, ....., a5+b5+a6+b6 */ - y1 += y2; - y1 &= (mask << 2); - y1m += (y1 >> 2); - *((ULong*)(rec += 4)) = y1m; /* save y1m */ - - rec += 8; - prev += offset; - } - return 1; - } - else if (tmp == 2) - { - prev -= 2; /* to word-aligned */ - for (i = B_SIZE; i > 0; i--) - { - x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */ - x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */ - y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */ - y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */ - - x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ - x2m = (x2 >> 2) & mask; - x1 = x1 ^(x1m << 2); - x2 = x2 ^(x2m << 2); - x1m += x2m; - x1 += x2; - - /* x2m, x2 free */ - y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ - y2m = (y2 >> 2) & mask; - y1 = y1 ^(y1m << 2); - y2 = y2 ^(y2m << 2); - y1m += y2m; - y1 += y2; - - /* y2m, y2 free */ - /* x2m, x2 free */ - x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */ - y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */ - x2m = (x2 >> 2) & mask; - y2m = (y2 >> 2) & mask; - x2 = x2 ^(x2m << 2); - y2 = y2 ^(y2m << 2); - x2m += y2m; - x2 += y2; - /* y2m, y2 free */ - - /* now operate on x1m, x1, y1m, y1, x2m, x2 */ - /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ - /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ - /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ - /* x1, y1, x2 */ - - x1m >>= 16 ; - x1 >>= 16; - x1m |= (y1m << 16); /* a5+b5, a4+b4, a3+b3, a2+b2 */ - x1 |= (y1 << 16); - y2m = (y1m << 8); - y2 = (y1 << 8); - y2m |= (x1m >> 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */ - y2 |= (x1 >> 8); - x1 += rnd2; - x1m += y2m; /* a5+b5+a6+b6, ....., a2+b2+a3+b3 */ - x1 += y2; - x1 &= (mask << 2); - x1m += (x1 >> 2); - *((ULong*)(rec += 4)) = x1m; /* save x1m */ - - y1m >>= 16; - y1 >>= 16; - y1m |= (x2m << 16); /* a9+b9, a8+b8, a7+b7, a6+b6 */ - y1 |= (x2 << 16); - y2m = (x2m << 8); - y2 = (x2 << 8); - y2m |= (y1m >> 8); /* a10+b10, a9+b9, a8+b8, a7+b7,*/ - y2 |= (y1 >> 8); - y1 += rnd2; - y1m += y2m; /* a9+b9+a10+b10, ....., a6+b6+a7+b7 */ - y1 += y2; - y1 &= (mask << 2); - y1m += (y1 >> 2); - *((ULong*)(rec += 4)) = y1m; /* save y1m */ - - rec += 8; - prev += offset; - } - return 1; - } - else /* tmp == 3 */ - { - prev -= 3; /* to word-aligned */ - for (i = B_SIZE; i > 0; i--) - { - x1 = *((ULong*)prev); /* load a3 a2 a1 a0 */ - x2 = *((ULong*)(prev + lx)); /* load b3 b2 b1 b0, another line */ - y1 = *((ULong*)(prev += 4)); /* a7 a6 a5 a4 */ - y2 = *((ULong*)(prev + lx)); /* b7 b6 b5 b4 */ - - x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ - x2m = (x2 >> 2) & mask; - x1 = x1 ^(x1m << 2); - x2 = x2 ^(x2m << 2); - x1m += x2m; - x1 += x2; - - /* x2m, x2 free */ - y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ - y2m = (y2 >> 2) & mask; - y1 = y1 ^(y1m << 2); - y2 = y2 ^(y2m << 2); - y1m += y2m; - y1 += y2; - - /* y2m, y2 free */ - /* x2m, x2 free */ - x2 = *((ULong*)(prev += 4)); /* a11 a10 a9 a8 */ - y2 = *((ULong*)(prev + lx)); /* b11 b10 b9 b8 */ - x2m = (x2 >> 2) & mask; - y2m = (y2 >> 2) & mask; - x2 = x2 ^(x2m << 2); - y2 = y2 ^(y2m << 2); - x2m += y2m; - x2 += y2; - /* y2m, y2 free */ - - /* now operate on x1m, x1, y1m, y1, x2m, x2 */ - /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ - /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ - /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ - /* x1, y1, x2 */ - - x1m >>= 24 ; - x1 >>= 24; - x1m |= (y1m << 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */ - x1 |= (y1 << 8); - - x1m += y1m; /* a6+b6+a7+b7, ....., a3+b3+a4+b4 */ - x1 += y1; - x1 += rnd2; - x1 &= (mask << 2); - x1m += (x1 >> 2); - *((ULong*)(rec += 4)) = x1m; /* save x1m */ - - y1m >>= 24; - y1 >>= 24; - y1m |= (x2m << 8); /* a10+b10, a9+b9, a8+b8, a7+b7 */ - y1 |= (x2 << 8); - y1m += x2m; /* a10+b10+a11+b11, ....., a7+b7+a8+b8 */ - y1 += x2; - y1 += rnd2; - y1 &= (mask << 2); - y1m += (y1 >> 2); - *((ULong*)(rec += 4)) = y1m; /* save y1m */ - - rec += 8; - prev += offset; - } - return 1; - } -} - - -/*============================================================================= - Function: EncGetPredOutside - Date: 04/17/2001 - Purpose: - modified from GetPredOutside in the decoder. - Modified: 09/24/05 - use the existing non-initialized padded region -=============================================================================*/ -// not really needed since padding is included -#define PAD_CORNER { temp = *src; \ - temp |= (temp<<8); \ - temp |= (temp<<16); \ - *((ULong*)dst) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; } - -#define PAD_ROW { temp = *((ULong*)src); \ - temp2 = *((ULong*)(src+4)); \ - *((ULong*)dst) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp2; } - -#define PAD_COL { temp = *src; temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)dst) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; \ - temp = *(src+=lx); temp |= (temp<<8); temp |= (temp<<16); \ - *((ULong*)(dst+=lx)) = temp; \ - *((ULong*)(dst+4)) = temp; } - - -Int EncGetPredOutside(Int xpos, Int ypos, UChar *c_prev, UChar *rec, - Int width, Int height, Int rnd1) -{ - Int lx; - UChar *src, *dst; - ULong temp, temp2; - Int xoffset; - - lx = width + 16; /* only works for chroma */ - - if (xpos < 0) - { - if (ypos < 0) /* pad top-left */ - { - /* pad corner */ - src = c_prev; - dst = c_prev - (lx << 3) - 8; - PAD_CORNER - - /* pad top */ - dst = c_prev - (lx << 3); - PAD_ROW - - /* pad left */ - dst = c_prev - 8; - PAD_COL - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - else if ((ypos >> 1) < (height - 8)) /* pad left of frame */ - { - /* pad left */ - src = c_prev + (ypos >> 1) * lx; - dst = src - 8; - PAD_COL - /* pad extra row */ - temp = *(src += lx); - temp |= (temp << 8); - temp |= (temp << 16); - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst + 4)) = temp; - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - else /* pad bottom-left */ - { - /* pad corner */ - src = c_prev + (height - 1) * lx; - dst = src + lx - 8; - PAD_CORNER - - /* pad bottom */ - dst = src + lx; - PAD_ROW - - /* pad left */ - src -= (lx << 3); - src += lx; - dst = src - 8; - PAD_COL - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - } - else if ((xpos >> 1) < (width - 8)) - { - if (ypos < 0) /* pad top of frame */ - { - xoffset = (xpos >> 1) & 0x3; - src = c_prev + (xpos >> 1) - xoffset; - dst = src - (lx << 3); - PAD_ROW - if (xoffset || (xpos&1)) - { - temp = *((ULong*)(src + 8)); - dst = src - (lx << 3) + 8; - *((ULong*)dst) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - } - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - else /* pad bottom of frame */ - { - xoffset = (xpos >> 1) & 0x3; - src = c_prev + (xpos >> 1) - xoffset + (height - 1) * lx; - dst = src + lx; - PAD_ROW - if (xoffset || (xpos&1)) - { - temp = *((ULong*)(src + 8)); - dst = src + lx + 8; - *((ULong*)dst) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst += lx)) = temp; - } - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - } - else - { - if (ypos < 0) /* pad top-right */ - { - /* pad corner */ - src = c_prev + width - 1; - dst = src - (lx << 3) + 1; - PAD_CORNER - - /* pad top */ - src -= 7; - dst = src - (lx << 3); - PAD_ROW - - /* pad left */ - src += 7; - dst = src + 1; - PAD_COL - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - else if ((ypos >> 1) < (height - B_SIZE)) /* pad right of frame */ - { - /* pad left */ - src = c_prev + (ypos >> 1) * lx + width - 1; - dst = src + 1; - PAD_COL - /* pad extra row */ - temp = *(src += lx); - temp |= (temp << 8); - temp |= (temp << 16); - *((ULong*)(dst += lx)) = temp; - *((ULong*)(dst + 4)) = temp; - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - else /* pad bottom-right */ - { - /* pad left */ - src = c_prev + (height - 8) * lx + width - 1; - dst = src + 1; - PAD_COL - - /* pad corner */ - dst = src + lx + 1; - PAD_CORNER - - /* pad bottom */ - src -= 7; - dst = src + lx; - PAD_ROW - - GetPredAdvBTable[ypos&1][xpos&1](c_prev + (xpos >> 1) + ((ypos >> 1)*lx), - rec, lx, rnd1); - - return 1; - } - } -} - -/* ====================================================================== / - Function : Copy_MB_from_Vop() - Date : 04/17/2001 - ====================================================================== */ - -void Copy_MB_from_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int pitch) -{ - Int row, col, i; - Int *src1, *src2; - Int offset = pitch - MB_SIZE; - ULong temp; - - for (i = 0; i < 4; i += 2) - { - src1 = yChan[i]; - src2 = yChan[i+1]; - - row = B_SIZE; - while (row--) - { - col = B_SIZE; - while (col) - { - temp = *((ULong*)comp); - *src1++ = (Int)(temp & 0xFF); - *src1++ = (Int)((temp >> 8) & 0xFF); - *src1++ = (Int)((temp >> 16) & 0xFF); - *src1++ = (Int)((temp >> 24) & 0xFF); - comp += 4; - col -= 4; - } - col = B_SIZE; - while (col) - { - temp = *((ULong*)comp); - *src2++ = (Int)(temp & 0xFF); - *src2++ = (Int)((temp >> 8) & 0xFF); - *src2++ = (Int)((temp >> 16) & 0xFF); - *src2++ = (Int)((temp >> 24) & 0xFF); - comp += 4; - col -= 4; - } - comp += offset; - } - } - return ; -} - -/* ====================================================================== / - Function : Copy_B_from_Vop() - Date : 04/17/2001 -/ ====================================================================== */ - -void Copy_B_from_Vop(UChar *comp, Int cChan[], Int pitch) -{ - Int row, col; - Int offset = pitch - B_SIZE; - ULong temp; - - row = B_SIZE; - while (row--) - { - col = B_SIZE; - while (col) - { - temp = *((ULong*)comp); - *cChan++ = (Int)(temp & 0xFF); - *cChan++ = (Int)((temp >> 8) & 0xFF); - *cChan++ = (Int)((temp >> 16) & 0xFF); - *cChan++ = (Int)((temp >> 24) & 0xFF); - comp += 4; - col -= 4; - } - comp += offset; - } -} - -/* ====================================================================== / - Function : Copy_MB_into_Vop() - Date : 04/17/2001 - History : From decoder -/ ====================================================================== */ - -void Copy_MB_into_Vop(UChar *comp, Int yChan[][NCOEFF_BLOCK], Int pitch) -{ - Int row, col, i; - Int *src1, *src2; - Int offset = pitch - MB_SIZE; - UChar mask = 0xFF; - Int tmp; - ULong temp; - - for (i = 0; i < 4; i += 2) - { - src1 = yChan[i]; - src2 = yChan[i+1]; - - row = B_SIZE; - while (row--) - { - col = B_SIZE; - while (col) - { - tmp = (*src1++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp = tmp << 24; - tmp = (*src1++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 16); - tmp = (*src1++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 8); - tmp = (*src1++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= tmp; - *((ULong*)comp) = temp; - comp += 4; - col -= 4; - } - col = B_SIZE; - while (col) - { - tmp = (*src2++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp = tmp << 24; - tmp = (*src2++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 16); - tmp = (*src2++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 8); - tmp = (*src2++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= tmp; - *((ULong*)comp) = temp; - comp += 4; - col -= 4; - } - comp += offset; - } - } - return ; -} - - -/* ====================================================================== / - Function : Copy_B_into_Vop() - Date : 04/17/2001 - History : From decoder -/ ====================================================================== */ - -void Copy_B_into_Vop(UChar *comp, Int cChan[], Int pitch) -{ - Int row, col; - Int offset = pitch - B_SIZE; - Int tmp; - UChar mask = 0xFF; - ULong temp; - - row = B_SIZE; - while (row--) - { - col = B_SIZE; - while (col) - { - tmp = (*cChan++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp = tmp << 24; - tmp = (*cChan++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 16); - tmp = (*cChan++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= (tmp << 8); - tmp = (*cChan++); - if ((UInt)tmp > mask) tmp = mask & (~(tmp >> 31)); - temp |= tmp; - *((ULong*)comp) = temp; - comp += 4; - col -= 4; - } - comp += offset; - } -} - -/* ======================================================================== */ -/* Function : get_MB( ) */ -/* Date : 10/03/2000 */ -/* Purpose : Copy 4 Y to reference frame */ -/* In/out : */ -/* Return : */ -/* Modified : */ -/* ======================================================================== */ -void get_MB(UChar *c_prev, UChar *c_prev_u , UChar *c_prev_v, - Short mb[6][64], Int lx, Int lx_uv) - -{ - Int i, j, count = 0, count1 = 0; - Int k1 = lx - MB_SIZE, k2 = lx_uv - B_SIZE; - - for (i = 0; i < B_SIZE; i++) - { - for (j = 0; j < B_SIZE; j++) - { - mb[0][count] = (Int)(*c_prev++); - mb[4][count] = (Int)(*c_prev_u++); - mb[5][count++] = (Int)(*c_prev_v++); - } - - for (j = 0; j < B_SIZE; j++) - mb[1][count1++] = (Int)(*c_prev++); - - c_prev += k1; - c_prev_u += k2; - c_prev_v += k2; - - - } - - count = count1 = 0; - for (i = 0; i < B_SIZE; i++) - { - for (j = 0; j < B_SIZE; j++) - mb[2][count++] = (Int)(*c_prev++); - - for (j = 0; j < B_SIZE; j++) - mb[3][count1++] = (Int)(*c_prev++); - - c_prev += k1; - } -} - -void PutSkippedBlock(UChar *rec, UChar *prev, Int lx) -{ - UChar *end; - Int offset = (lx - 8) >> 2; - Int *src, *dst; - - dst = (Int*)rec; - src = (Int*)prev; - - end = prev + (lx << 3); - - do - { - *dst++ = *src++; - *dst++ = *src++; - dst += offset; - src += offset; - } - while ((UInt)src < (UInt)end); - - return ; -} |