102f5b5447de349216a40086ca6061efefb5a3025James Dong/* ------------------------------------------------------------------ 202f5b5447de349216a40086ca6061efefb5a3025James Dong * Copyright (C) 1998-2009 PacketVideo 302f5b5447de349216a40086ca6061efefb5a3025James Dong * 402f5b5447de349216a40086ca6061efefb5a3025James Dong * Licensed under the Apache License, Version 2.0 (the "License"); 502f5b5447de349216a40086ca6061efefb5a3025James Dong * you may not use this file except in compliance with the License. 602f5b5447de349216a40086ca6061efefb5a3025James Dong * You may obtain a copy of the License at 702f5b5447de349216a40086ca6061efefb5a3025James Dong * 802f5b5447de349216a40086ca6061efefb5a3025James Dong * http://www.apache.org/licenses/LICENSE-2.0 902f5b5447de349216a40086ca6061efefb5a3025James Dong * 1002f5b5447de349216a40086ca6061efefb5a3025James Dong * Unless required by applicable law or agreed to in writing, software 1102f5b5447de349216a40086ca6061efefb5a3025James Dong * distributed under the License is distributed on an "AS IS" BASIS, 1202f5b5447de349216a40086ca6061efefb5a3025James Dong * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 1302f5b5447de349216a40086ca6061efefb5a3025James Dong * express or implied. 1402f5b5447de349216a40086ca6061efefb5a3025James Dong * See the License for the specific language governing permissions 1502f5b5447de349216a40086ca6061efefb5a3025James Dong * and limitations under the License. 1602f5b5447de349216a40086ca6061efefb5a3025James Dong * ------------------------------------------------------------------- 1702f5b5447de349216a40086ca6061efefb5a3025James Dong */ 1802f5b5447de349216a40086ca6061efefb5a3025James Dong/* 1902f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------ 2002f5b5447de349216a40086ca6061efefb5a3025James Dong INPUT AND OUTPUT DEFINITIONS 2102f5b5447de349216a40086ca6061efefb5a3025James Dong 2202f5b5447de349216a40086ca6061efefb5a3025James Dong Inputs: 2302f5b5447de349216a40086ca6061efefb5a3025James Dong xpos = x half-pixel of (x,y) coordinates within a VOP; motion 2402f5b5447de349216a40086ca6061efefb5a3025James Dong compensated coordinates; native type 2502f5b5447de349216a40086ca6061efefb5a3025James Dong ypos = y half-pixel of (x,y) coordinates within a VOP; motion 2602f5b5447de349216a40086ca6061efefb5a3025James Dong compensated coordinates; native type 2702f5b5447de349216a40086ca6061efefb5a3025James Dong comp = pointer to 8-bit compensated prediction values within a VOP; 2802f5b5447de349216a40086ca6061efefb5a3025James Dong computed by this module (i/o); full-pel resolution 2902f5b5447de349216a40086ca6061efefb5a3025James Dong c_prev = pointer to previous 8-bit prediction values within a VOP; 3002f5b5447de349216a40086ca6061efefb5a3025James Dong values range from (0-255); full-pel resolution 3102f5b5447de349216a40086ca6061efefb5a3025James Dong sh_d = pointer to residual values used to compensate the predicted 3202f5b5447de349216a40086ca6061efefb5a3025James Dong value; values range from (-512 to 511); full-pel resolution 3302f5b5447de349216a40086ca6061efefb5a3025James Dong width = width of the VOP in pixels (x axis); full-pel resolution 3402f5b5447de349216a40086ca6061efefb5a3025James Dong rnd1 = rounding value for case when one dimension uses half-pel 3502f5b5447de349216a40086ca6061efefb5a3025James Dong resolution 3602f5b5447de349216a40086ca6061efefb5a3025James Dong rnd2 = rounding value for case when two dimensions uses half-pel 3702f5b5447de349216a40086ca6061efefb5a3025James Dong resolution 3802f5b5447de349216a40086ca6061efefb5a3025James Dong CBP = flag indicating whether residual is all zeros 3902f5b5447de349216a40086ca6061efefb5a3025James Dong (0 -> all zeros, 1 -> not all zeros) 4002f5b5447de349216a40086ca6061efefb5a3025James Dong outside_flag = flag indicating whether motion vector is outside the 4102f5b5447de349216a40086ca6061efefb5a3025James Dong VOP (0 -> inside, 1 -> outside) 4202f5b5447de349216a40086ca6061efefb5a3025James Dong 4302f5b5447de349216a40086ca6061efefb5a3025James Dong Outputs: 4402f5b5447de349216a40086ca6061efefb5a3025James Dong returns 1 4502f5b5447de349216a40086ca6061efefb5a3025James Dong 4602f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores/Buffers/Pointers Needed: 4702f5b5447de349216a40086ca6061efefb5a3025James Dong None 4802f5b5447de349216a40086ca6061efefb5a3025James Dong 4902f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores/Buffers/Pointers Needed: 5002f5b5447de349216a40086ca6061efefb5a3025James Dong None 5102f5b5447de349216a40086ca6061efefb5a3025James Dong 5202f5b5447de349216a40086ca6061efefb5a3025James Dong Pointers and Buffers Modified: 5302f5b5447de349216a40086ca6061efefb5a3025James Dong comp = buffer contains newly computed compensated prediction values 5402f5b5447de349216a40086ca6061efefb5a3025James Dong 5502f5b5447de349216a40086ca6061efefb5a3025James Dong Local Stores Modified: 5602f5b5447de349216a40086ca6061efefb5a3025James Dong None 5702f5b5447de349216a40086ca6061efefb5a3025James Dong 5802f5b5447de349216a40086ca6061efefb5a3025James Dong Global Stores Modified: 5902f5b5447de349216a40086ca6061efefb5a3025James Dong None 6002f5b5447de349216a40086ca6061efefb5a3025James Dong 6102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------ 6202f5b5447de349216a40086ca6061efefb5a3025James Dong FUNCTION DESCRIPTION 6302f5b5447de349216a40086ca6061efefb5a3025James Dong 6402f5b5447de349216a40086ca6061efefb5a3025James Dong Compute pixel values for a block in the current VOP. The prediction 6502f5b5447de349216a40086ca6061efefb5a3025James Dong values are generated by averaging pixel values in the previous VOP; the 6602f5b5447de349216a40086ca6061efefb5a3025James Dong block position in the previous frame is computed from the current block's 6702f5b5447de349216a40086ca6061efefb5a3025James Dong motion vector. The computed pixel values are then computed by adding the 6802f5b5447de349216a40086ca6061efefb5a3025James Dong prediction values to the block residual values. 6902f5b5447de349216a40086ca6061efefb5a3025James Dong 7002f5b5447de349216a40086ca6061efefb5a3025James Dong 7102f5b5447de349216a40086ca6061efefb5a3025James Dong------------------------------------------------------------------------------ 7202f5b5447de349216a40086ca6061efefb5a3025James Dong*/ 7302f5b5447de349216a40086ca6061efefb5a3025James Dong 7402f5b5447de349216a40086ca6061efefb5a3025James Dong/*---------------------------------------------------------------------------- 7502f5b5447de349216a40086ca6061efefb5a3025James Dong; INCLUDES 7602f5b5447de349216a40086ca6061efefb5a3025James Dong----------------------------------------------------------------------------*/ 7702f5b5447de349216a40086ca6061efefb5a3025James Dong#include "mp4dec_lib.h" 7802f5b5447de349216a40086ca6061efefb5a3025James Dong#include "motion_comp.h" 7902f5b5447de349216a40086ca6061efefb5a3025James Dong 8002f5b5447de349216a40086ca6061efefb5a3025James Dong#define OSCL_DISABLE_WARNING_CONV_POSSIBLE_LOSS_OF_DATA 8102f5b5447de349216a40086ca6061efefb5a3025James Dong 8202f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy0x0( 8302f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *prev, /* i */ 8402f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pred_block, /* i */ 8502f5b5447de349216a40086ca6061efefb5a3025James Dong int width, /* i */ 8602f5b5447de349216a40086ca6061efefb5a3025James Dong int pred_width_rnd /* i */ 8702f5b5447de349216a40086ca6061efefb5a3025James Dong) 8802f5b5447de349216a40086ca6061efefb5a3025James Dong{ 8902f5b5447de349216a40086ca6061efefb5a3025James Dong uint i; /* loop variable */ 9002f5b5447de349216a40086ca6061efefb5a3025James Dong int offset, offset2; 9102f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 pred_word, word1, word2; 9202f5b5447de349216a40086ca6061efefb5a3025James Dong int tmp; 9302f5b5447de349216a40086ca6061efefb5a3025James Dong 9402f5b5447de349216a40086ca6061efefb5a3025James Dong /* initialize offset to adjust pixel counter */ 9502f5b5447de349216a40086ca6061efefb5a3025James Dong /* the next row; full-pel resolution */ 9602f5b5447de349216a40086ca6061efefb5a3025James Dong offset = width - B_SIZE; /* offset for prev */ 9702f5b5447de349216a40086ca6061efefb5a3025James Dong offset2 = (pred_width_rnd >> 1) - 4; /* offset for pred_block */ 9802f5b5447de349216a40086ca6061efefb5a3025James Dong 9902f5b5447de349216a40086ca6061efefb5a3025James Dong tmp = (uint32)prev & 0x3; 10002f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block -= offset2; /* preset */ 10102f5b5447de349216a40086ca6061efefb5a3025James Dong 10202f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmp == 0) /* word-aligned */ 10302f5b5447de349216a40086ca6061efefb5a3025James Dong { 10402f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 10502f5b5447de349216a40086ca6061efefb5a3025James Dong { 10602f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = *((uint32*)prev); 10702f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = *((uint32*)(prev + 4)); 10802f5b5447de349216a40086ca6061efefb5a3025James Dong prev += width; 10902f5b5447de349216a40086ca6061efefb5a3025James Dong } 11002f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 11102f5b5447de349216a40086ca6061efefb5a3025James Dong } 11202f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 1) /* first position */ 11302f5b5447de349216a40086ca6061efefb5a3025James Dong { 11402f5b5447de349216a40086ca6061efefb5a3025James Dong prev--; /* word-aligned */ 11502f5b5447de349216a40086ca6061efefb5a3025James Dong 11602f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 11702f5b5447de349216a40086ca6061efefb5a3025James Dong { 11802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */ 11902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* read 4 bytes, b8 b7 b6 b5 */ 12002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 8; /* 0 b4 b3 b2 */ 12102f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word1 | (word2 << 24); /* b5 b4 b3 b2 */ 12202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = pred_word; 12302f5b5447de349216a40086ca6061efefb5a3025James Dong 12402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */ 12502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 8; /* 0 b8 b7 b6 */ 12602f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word2 | (word1 << 24); /* b9 b8 b7 b6 */ 12702f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = pred_word; 12802f5b5447de349216a40086ca6061efefb5a3025James Dong 12902f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 13002f5b5447de349216a40086ca6061efefb5a3025James Dong } 13102f5b5447de349216a40086ca6061efefb5a3025James Dong 13202f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 13302f5b5447de349216a40086ca6061efefb5a3025James Dong } 13402f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 2) /* second position */ 13502f5b5447de349216a40086ca6061efefb5a3025James Dong { 13602f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 2; /* word1-aligned */ 13702f5b5447de349216a40086ca6061efefb5a3025James Dong 13802f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 13902f5b5447de349216a40086ca6061efefb5a3025James Dong { 14002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */ 14102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* read 4 bytes, b8 b7 b6 b5 */ 14202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 16; /* 0 0 b4 b3 */ 14302f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word1 | (word2 << 16); /* b6 b5 b4 b3 */ 14402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = pred_word; 14502f5b5447de349216a40086ca6061efefb5a3025James Dong 14602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */ 14702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 16; /* 0 0 b8 b7 */ 14802f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word2 | (word1 << 16); /* b10 b9 b8 b7 */ 14902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = pred_word; 15002f5b5447de349216a40086ca6061efefb5a3025James Dong 15102f5b5447de349216a40086ca6061efefb5a3025James Dong 15202f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 15302f5b5447de349216a40086ca6061efefb5a3025James Dong } 15402f5b5447de349216a40086ca6061efefb5a3025James Dong 15502f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 15602f5b5447de349216a40086ca6061efefb5a3025James Dong } 15702f5b5447de349216a40086ca6061efefb5a3025James Dong else /* third position */ 15802f5b5447de349216a40086ca6061efefb5a3025James Dong { 15902f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 3; /* word1-aligned */ 16002f5b5447de349216a40086ca6061efefb5a3025James Dong 16102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 16202f5b5447de349216a40086ca6061efefb5a3025James Dong { 16302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* read 4 bytes, b4 b3 b2 b1 */ 16402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* read 4 bytes, b8 b7 b6 b5 */ 16502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 24; /* 0 0 0 b4 */ 16602f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word1 | (word2 << 8); /* b7 b6 b5 b4 */ 16702f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = pred_word; 16802f5b5447de349216a40086ca6061efefb5a3025James Dong 16902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */ 17002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 24; /* 0 0 0 b8 */ 17102f5b5447de349216a40086ca6061efefb5a3025James Dong pred_word = word2 | (word1 << 8); /* b11 b10 b9 b8 */ 17202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = pred_word; 17302f5b5447de349216a40086ca6061efefb5a3025James Dong 17402f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 17502f5b5447de349216a40086ca6061efefb5a3025James Dong } 17602f5b5447de349216a40086ca6061efefb5a3025James Dong 17702f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 17802f5b5447de349216a40086ca6061efefb5a3025James Dong } 17902f5b5447de349216a40086ca6061efefb5a3025James Dong} 18002f5b5447de349216a40086ca6061efefb5a3025James Dong 18102f5b5447de349216a40086ca6061efefb5a3025James Dong/**************************************************************************/ 18202f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy0x1( 18302f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *prev, /* i */ 18402f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pred_block, /* i */ 18502f5b5447de349216a40086ca6061efefb5a3025James Dong int width, /* i */ 18602f5b5447de349216a40086ca6061efefb5a3025James Dong int pred_width_rnd /* i */ 18702f5b5447de349216a40086ca6061efefb5a3025James Dong) 18802f5b5447de349216a40086ca6061efefb5a3025James Dong{ 18902f5b5447de349216a40086ca6061efefb5a3025James Dong uint i; /* loop variable */ 19002f5b5447de349216a40086ca6061efefb5a3025James Dong int offset, offset2; 19102f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 word1, word2, word3, word12; 19202f5b5447de349216a40086ca6061efefb5a3025James Dong int tmp; 19302f5b5447de349216a40086ca6061efefb5a3025James Dong int rnd1; 19402f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 mask; 19502f5b5447de349216a40086ca6061efefb5a3025James Dong 19602f5b5447de349216a40086ca6061efefb5a3025James Dong /* initialize offset to adjust pixel counter */ 19702f5b5447de349216a40086ca6061efefb5a3025James Dong /* the next row; full-pel resolution */ 19802f5b5447de349216a40086ca6061efefb5a3025James Dong offset = width - B_SIZE; /* offset for prev */ 19902f5b5447de349216a40086ca6061efefb5a3025James Dong offset2 = (pred_width_rnd >> 1) - 4; /* offset of pred_block */ 20002f5b5447de349216a40086ca6061efefb5a3025James Dong 20102f5b5447de349216a40086ca6061efefb5a3025James Dong rnd1 = pred_width_rnd & 1; 20202f5b5447de349216a40086ca6061efefb5a3025James Dong 20302f5b5447de349216a40086ca6061efefb5a3025James Dong /* Branch based on pixel location (half-pel or full-pel) for x and y */ 20402f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block -= offset2; /* preset */ 20502f5b5447de349216a40086ca6061efefb5a3025James Dong 20602f5b5447de349216a40086ca6061efefb5a3025James Dong tmp = (uint32)prev & 3; 20702f5b5447de349216a40086ca6061efefb5a3025James Dong mask = 254; 20802f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 8); 20902f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 16); /* 0xFEFEFEFE */ 21002f5b5447de349216a40086ca6061efefb5a3025James Dong 21102f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmp == 0) /* word-aligned */ 21202f5b5447de349216a40086ca6061efefb5a3025James Dong { 21302f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 21402f5b5447de349216a40086ca6061efefb5a3025James Dong { 21502f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 21602f5b5447de349216a40086ca6061efefb5a3025James Dong { 21702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b4 b3 b2 b1 */ 21802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b8 b7 b6 b5 */ 21902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 8); /* 0 b4 b3 b2 */ 22002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 24); /* b5 b4 b3 b2 */ 22102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 22202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 22302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 22402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 22502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 22602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 22702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 22802f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 22902f5b5447de349216a40086ca6061efefb5a3025James Dong 23002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */ 23102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 8); /* 0 b8 b7 b6 */ 23202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 24); /* b9 b8 b7 b6 */ 23302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 | word12; 23402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 23502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 23602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 23702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 23802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 23902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 24002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 24102f5b5447de349216a40086ca6061efefb5a3025James Dong 24202f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 24302f5b5447de349216a40086ca6061efefb5a3025James Dong } 24402f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 24502f5b5447de349216a40086ca6061efefb5a3025James Dong } 24602f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 == 0 */ 24702f5b5447de349216a40086ca6061efefb5a3025James Dong { 24802f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 24902f5b5447de349216a40086ca6061efefb5a3025James Dong { 25002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b4 b3 b2 b1 */ 25102f5b5447de349216a40086ca6061efefb5a3025James Dong 25202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b8 b7 b6 b5 */ 25302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 8); /* 0 b4 b3 b2 */ 25402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 24); /* b5 b4 b3 b2 */ 25502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 25602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 25702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 25802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 25902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 26002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 26102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 26202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 26302f5b5447de349216a40086ca6061efefb5a3025James Dong 26402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b12 b11 b10 b9 */ 26502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 8); /* 0 b8 b7 b6 */ 26602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 24); /* b9 b8 b7 b6 */ 26702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 & word12; 26802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 26902f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 27002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 27102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 27202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 27302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 27402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 27502f5b5447de349216a40086ca6061efefb5a3025James Dong 27602f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 27702f5b5447de349216a40086ca6061efefb5a3025James Dong } 27802f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 27902f5b5447de349216a40086ca6061efefb5a3025James Dong } /* rnd1 */ 28002f5b5447de349216a40086ca6061efefb5a3025James Dong } 28102f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 1) 28202f5b5447de349216a40086ca6061efefb5a3025James Dong { 28302f5b5447de349216a40086ca6061efefb5a3025James Dong prev--; /* word-aligned */ 28402f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 28502f5b5447de349216a40086ca6061efefb5a3025James Dong { 28602f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 28702f5b5447de349216a40086ca6061efefb5a3025James Dong { 28802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b3 b2 b1 b0 */ 28902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b7 b6 b5 b4 */ 29002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 8); /* 0 b3 b2 b1 */ 29102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 16; /* 0 0 b3 b2 */ 29202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 24); /* b4 b3 b2 b1 */ 29302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 |= (word2 << 16); /* b5 b4 b3 b2 */ 29402f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 29502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 29602f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 29702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 29802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 29902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 30002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 30102f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 30202f5b5447de349216a40086ca6061efefb5a3025James Dong 30302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b11 b10 b9 b8 */ 30402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 8); /* 0 b7 b6 b5 */ 30502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 16; /* 0 0 b7 b6 */ 30602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 24); /* b8 b7 b6 b5 */ 30702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 |= (word1 << 16); /* b9 b8 b7 b6 */ 30802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word2&word12 30902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 31002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 31102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 31202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 31302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 31402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 31502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 31602f5b5447de349216a40086ca6061efefb5a3025James Dong 31702f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 31802f5b5447de349216a40086ca6061efefb5a3025James Dong } 31902f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 32002f5b5447de349216a40086ca6061efefb5a3025James Dong } 32102f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 = 0 */ 32202f5b5447de349216a40086ca6061efefb5a3025James Dong { 32302f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 32402f5b5447de349216a40086ca6061efefb5a3025James Dong { 32502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b3 b2 b1 b0 */ 32602f5b5447de349216a40086ca6061efefb5a3025James Dong 32702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b7 b6 b5 b4 */ 32802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 8); /* 0 b3 b2 b1 */ 32902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 16; /* 0 0 b3 b2 */ 33002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 24); /* b4 b3 b2 b1 */ 33102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 |= (word2 << 16); /* b5 b4 b3 b2 */ 33202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word12; 33302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 33402f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 33502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 33602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 33702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 33802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 33902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 34002f5b5447de349216a40086ca6061efefb5a3025James Dong 34102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b11 b10 b9 b8 */ 34202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 8); /* 0 b7 b6 b5 */ 34302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 16; /* 0 0 b7 b6 */ 34402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 24); /* b8 b7 b6 b5 */ 34502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 |= (word1 << 16); /* b9 b8 b7 b6 */ 34602f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 & word12; 34702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 34802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 34902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 35002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 35102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 35202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 35302f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 35402f5b5447de349216a40086ca6061efefb5a3025James Dong 35502f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 35602f5b5447de349216a40086ca6061efefb5a3025James Dong } 35702f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 35802f5b5447de349216a40086ca6061efefb5a3025James Dong } /* rnd1 */ 35902f5b5447de349216a40086ca6061efefb5a3025James Dong } 36002f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 2) 36102f5b5447de349216a40086ca6061efefb5a3025James Dong { 36202f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 2; /* word-aligned */ 36302f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 36402f5b5447de349216a40086ca6061efefb5a3025James Dong { 36502f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 36602f5b5447de349216a40086ca6061efefb5a3025James Dong { 36702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b2 b1 b0 bN1 */ 36802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b6 b5 b4 b3 */ 36902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 16); /* 0 0 b2 b1 */ 37002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 24; /* 0 0 0 b2 */ 37102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 16); /* b4 b3 b2 b1 */ 37202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 |= (word2 << 8); /* b5 b4 b3 b2 */ 37302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 37402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 37502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 37602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 37702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 37802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 37902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 38002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 38102f5b5447de349216a40086ca6061efefb5a3025James Dong 38202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b10 b9 b8 b7 */ 38302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 16); /* 0 0 b6 b5 */ 38402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 24; /* 0 0 0 b6 */ 38502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 16); /* b8 b7 b6 b5 */ 38602f5b5447de349216a40086ca6061efefb5a3025James Dong word2 |= (word1 << 8); /* b9 b8 b7 b6 */ 38702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12 38802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 38902f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 39002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 39102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 39202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 39302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 39402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 39502f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 39602f5b5447de349216a40086ca6061efefb5a3025James Dong } 39702f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 39802f5b5447de349216a40086ca6061efefb5a3025James Dong } 39902f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 == 0 */ 40002f5b5447de349216a40086ca6061efefb5a3025James Dong { 40102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 40202f5b5447de349216a40086ca6061efefb5a3025James Dong { 40302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b2 b1 b0 bN1 */ 40402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b6 b5 b4 b3 */ 40502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 16); /* 0 0 b2 b1 */ 40602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 24; /* 0 0 0 b2 */ 40702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 16); /* b4 b3 b2 b1 */ 40802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 |= (word2 << 8); /* b5 b4 b3 b2 */ 40902f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 41002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 41102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 41202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 41302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 41402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 41502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 41602f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 41702f5b5447de349216a40086ca6061efefb5a3025James Dong 41802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b10 b9 b8 b7 */ 41902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 16); /* 0 0 b6 b5 */ 42002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 24; /* 0 0 0 b6 */ 42102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 16); /* b8 b7 b6 b5 */ 42202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 |= (word1 << 8); /* b9 b8 b7 b6 */ 42302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12 42402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 42502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 42602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 42702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 42802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 42902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 43002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 43102f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 43202f5b5447de349216a40086ca6061efefb5a3025James Dong } 43302f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 43402f5b5447de349216a40086ca6061efefb5a3025James Dong } 43502f5b5447de349216a40086ca6061efefb5a3025James Dong } 43602f5b5447de349216a40086ca6061efefb5a3025James Dong else /* tmp = 3 */ 43702f5b5447de349216a40086ca6061efefb5a3025James Dong { 43802f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 3; /* word-aligned */ 43902f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 44002f5b5447de349216a40086ca6061efefb5a3025James Dong { 44102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 44202f5b5447de349216a40086ca6061efefb5a3025James Dong { 44302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b1 b0 bN1 bN2 */ 44402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b5 b4 b3 b2 */ 44502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 24); /* 0 0 0 b1 */ 44602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 8); /* b4 b3 b2 b1 */ 44702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word2; 44802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word12; // rnd1 = 1; otherwise word3 = word1&word12 44902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 45002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 45102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 45202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 45302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 45402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 45502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 45602f5b5447de349216a40086ca6061efefb5a3025James Dong 45702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b9 b8 b7 b6 */ 45802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 24); /* 0 0 0 b5 */ 45902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 8); /* b8 b7 b6 b5 */ 46002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word1; /* b9 b8 b7 b6 */ 46102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 | word12; // rnd1 = 1; otherwise word3 = word1&word12 46202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 46302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 46402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 46502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 46602f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 46702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 46802f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 46902f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 47002f5b5447de349216a40086ca6061efefb5a3025James Dong } 47102f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 47202f5b5447de349216a40086ca6061efefb5a3025James Dong } 47302f5b5447de349216a40086ca6061efefb5a3025James Dong else 47402f5b5447de349216a40086ca6061efefb5a3025James Dong { 47502f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 47602f5b5447de349216a40086ca6061efefb5a3025James Dong { 47702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)prev); /* b1 b0 bN1 bN2 */ 47802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev += 4)); /* b5 b4 b3 b2 */ 47902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word1 >> 24); /* 0 0 0 b1 */ 48002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word2 << 8); /* b4 b3 b2 b1 */ 48102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word2; 48202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word12; // rnd1 = 1; otherwise word3 = word1&word12 48302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 48402f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 48502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 48602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 48702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word12 >> 1); 48802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 48902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; /* write 4 pixels */ 49002f5b5447de349216a40086ca6061efefb5a3025James Dong 49102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* b9 b8 b7 b6 */ 49202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = (word2 >> 24); /* 0 0 0 b5 */ 49302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 |= (word1 << 8); /* b8 b7 b6 b5 */ 49402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word1; /* b9 b8 b7 b6 */ 49502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word2 & word12; // rnd1 = 1; otherwise word3 = word1&word12 49602f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 49702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 49802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 49902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 1; 50002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 + (word12 >> 1); 50102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 += word3; 50202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word2; /* write 4 pixels */ 50302f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 50402f5b5447de349216a40086ca6061efefb5a3025James Dong } 50502f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 50602f5b5447de349216a40086ca6061efefb5a3025James Dong } 50702f5b5447de349216a40086ca6061efefb5a3025James Dong } 50802f5b5447de349216a40086ca6061efefb5a3025James Dong} 50902f5b5447de349216a40086ca6061efefb5a3025James Dong 51002f5b5447de349216a40086ca6061efefb5a3025James Dong/**************************************************************************/ 51102f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy1x0( 51202f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *prev, /* i */ 51302f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pred_block, /* i */ 51402f5b5447de349216a40086ca6061efefb5a3025James Dong int width, /* i */ 51502f5b5447de349216a40086ca6061efefb5a3025James Dong int pred_width_rnd /* i */ 51602f5b5447de349216a40086ca6061efefb5a3025James Dong) 51702f5b5447de349216a40086ca6061efefb5a3025James Dong{ 51802f5b5447de349216a40086ca6061efefb5a3025James Dong uint i; /* loop variable */ 51902f5b5447de349216a40086ca6061efefb5a3025James Dong int offset, offset2; 52002f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 word1, word2, word3, word12, word22; 52102f5b5447de349216a40086ca6061efefb5a3025James Dong int tmp; 52202f5b5447de349216a40086ca6061efefb5a3025James Dong int rnd1; 52302f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 mask; 52402f5b5447de349216a40086ca6061efefb5a3025James Dong 52502f5b5447de349216a40086ca6061efefb5a3025James Dong /* initialize offset to adjust pixel counter */ 52602f5b5447de349216a40086ca6061efefb5a3025James Dong /* the next row; full-pel resolution */ 52702f5b5447de349216a40086ca6061efefb5a3025James Dong offset = width - B_SIZE; /* offset for prev */ 52802f5b5447de349216a40086ca6061efefb5a3025James Dong offset2 = (pred_width_rnd >> 1) - 4; /* offset for pred_block */ 52902f5b5447de349216a40086ca6061efefb5a3025James Dong 53002f5b5447de349216a40086ca6061efefb5a3025James Dong rnd1 = pred_width_rnd & 1; 53102f5b5447de349216a40086ca6061efefb5a3025James Dong 53202f5b5447de349216a40086ca6061efefb5a3025James Dong /* Branch based on pixel location (half-pel or full-pel) for x and y */ 53302f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block -= offset2; /* preset */ 53402f5b5447de349216a40086ca6061efefb5a3025James Dong 53502f5b5447de349216a40086ca6061efefb5a3025James Dong tmp = (uint32)prev & 3; 53602f5b5447de349216a40086ca6061efefb5a3025James Dong mask = 254; 53702f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 8); 53802f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 16); /* 0xFEFEFEFE */ 53902f5b5447de349216a40086ca6061efefb5a3025James Dong 54002f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmp == 0) /* word-aligned */ 54102f5b5447de349216a40086ca6061efefb5a3025James Dong { 54202f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 4; 54302f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 54402f5b5447de349216a40086ca6061efefb5a3025James Dong { 54502f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 54602f5b5447de349216a40086ca6061efefb5a3025James Dong { 54702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); 54802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 54902f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2 55002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 55102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 55202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 55302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 55402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 55502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 55602f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; 55702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); 55802f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 55902f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word2; // rnd1 = 1; otherwise word3 = word1&word2 56002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 56102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 56202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 56302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 56402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 56502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 56602f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 56702f5b5447de349216a40086ca6061efefb5a3025James Dong 56802f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 56902f5b5447de349216a40086ca6061efefb5a3025James Dong } 57002f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 57102f5b5447de349216a40086ca6061efefb5a3025James Dong } 57202f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 = 0 */ 57302f5b5447de349216a40086ca6061efefb5a3025James Dong { 57402f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 57502f5b5447de349216a40086ca6061efefb5a3025James Dong { 57602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); 57702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 57802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word2; /* rnd1 = 0; */ 57902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 58002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 58102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 58202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 58302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 58402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 58502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word1; 58602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); 58702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 58802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word2; /* rnd1 = 0; */ 58902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 59002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 59102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 59202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 59302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 59402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 59502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 59602f5b5447de349216a40086ca6061efefb5a3025James Dong 59702f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 59802f5b5447de349216a40086ca6061efefb5a3025James Dong } 59902f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 60002f5b5447de349216a40086ca6061efefb5a3025James Dong } 60102f5b5447de349216a40086ca6061efefb5a3025James Dong } 60202f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 1) 60302f5b5447de349216a40086ca6061efefb5a3025James Dong { 60402f5b5447de349216a40086ca6061efefb5a3025James Dong prev--; /* word-aligned */ 60502f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 60602f5b5447de349216a40086ca6061efefb5a3025James Dong { 60702f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 60802f5b5447de349216a40086ca6061efefb5a3025James Dong { 60902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 61002f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 61102f5b5447de349216a40086ca6061efefb5a3025James Dong 61202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 61302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 61402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 8; /* 0 b4 b3 b2 */ 61502f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 8; 61602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */ 61702f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 24); 61802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 | word22; 61902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 62002f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 62102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 62202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 62302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 62402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 62502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 62602f5b5447de349216a40086ca6061efefb5a3025James Dong 62702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 62802f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 62902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 8; /* 0 b8 b7 b6 */ 63002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 8; 63102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */ 63202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 24); 63302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word2; 63402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 63502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 63602f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 63702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 63802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 63902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 64002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 64102f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 64202f5b5447de349216a40086ca6061efefb5a3025James Dong } 64302f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 64402f5b5447de349216a40086ca6061efefb5a3025James Dong } 64502f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 = 0 */ 64602f5b5447de349216a40086ca6061efefb5a3025James Dong { 64702f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 64802f5b5447de349216a40086ca6061efefb5a3025James Dong { 64902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 65002f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 65102f5b5447de349216a40086ca6061efefb5a3025James Dong 65202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 65302f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 65402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 8; /* 0 b4 b3 b2 */ 65502f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 8; 65602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 24); /* b5 b4 b3 b2 */ 65702f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 24); 65802f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 & word22; 65902f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 66002f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 66102f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 66202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 66302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 66402f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 66502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 66602f5b5447de349216a40086ca6061efefb5a3025James Dong 66702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 66802f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 66902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 8; /* 0 b8 b7 b6 */ 67002f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 8; 67102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 24); /* b9 b8 b7 b6 */ 67202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 24); 67302f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word2; 67402f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 67502f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 67602f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 67702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 67802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 67902f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 68002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 68102f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 68202f5b5447de349216a40086ca6061efefb5a3025James Dong } 68302f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 68402f5b5447de349216a40086ca6061efefb5a3025James Dong } 68502f5b5447de349216a40086ca6061efefb5a3025James Dong } 68602f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 2) 68702f5b5447de349216a40086ca6061efefb5a3025James Dong { 68802f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 2; /* word-aligned */ 68902f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 69002f5b5447de349216a40086ca6061efefb5a3025James Dong { 69102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 69202f5b5447de349216a40086ca6061efefb5a3025James Dong { 69302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 69402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 69502f5b5447de349216a40086ca6061efefb5a3025James Dong 69602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 69702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 69802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 16; /* 0 0 b4 b3 */ 69902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 16; 70002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */ 70102f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 16); 70202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 | word22; 70302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 70402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 70502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 70602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 70702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 70802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 70902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 71002f5b5447de349216a40086ca6061efefb5a3025James Dong 71102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 71202f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 71302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 16; /* 0 0 b8 b7 */ 71402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 16; 71502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */ 71602f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 16); 71702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word2; 71802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 71902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 72002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 72102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 72202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 72302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 72402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 72502f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 72602f5b5447de349216a40086ca6061efefb5a3025James Dong } 72702f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 72802f5b5447de349216a40086ca6061efefb5a3025James Dong } 72902f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 = 0 */ 73002f5b5447de349216a40086ca6061efefb5a3025James Dong { 73102f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 73202f5b5447de349216a40086ca6061efefb5a3025James Dong { 73302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 73402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 73502f5b5447de349216a40086ca6061efefb5a3025James Dong 73602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 73702f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 73802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 16; /* 0 0 b4 b3 */ 73902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 16; 74002f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 16); /* b6 b5 b4 b3 */ 74102f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 16); 74202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 & word22; 74302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 74402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 74502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 74602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 74702f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 74802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 74902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 75002f5b5447de349216a40086ca6061efefb5a3025James Dong 75102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 75202f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 75302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 16; /* 0 0 b8 b7 */ 75402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 16; 75502f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 16); /* b10 b9 b8 b7 */ 75602f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 16); 75702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word2; 75802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 75902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 76002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 76102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 76202f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 76302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 76402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 76502f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 76602f5b5447de349216a40086ca6061efefb5a3025James Dong } 76702f5b5447de349216a40086ca6061efefb5a3025James Dong 76802f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 76902f5b5447de349216a40086ca6061efefb5a3025James Dong } 77002f5b5447de349216a40086ca6061efefb5a3025James Dong } 77102f5b5447de349216a40086ca6061efefb5a3025James Dong else /* tmp == 3 */ 77202f5b5447de349216a40086ca6061efefb5a3025James Dong { 77302f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 3; /* word-aligned */ 77402f5b5447de349216a40086ca6061efefb5a3025James Dong if (rnd1 == 1) 77502f5b5447de349216a40086ca6061efefb5a3025James Dong { 77602f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 77702f5b5447de349216a40086ca6061efefb5a3025James Dong { 77802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 77902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 78002f5b5447de349216a40086ca6061efefb5a3025James Dong 78102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 78202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 78302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 24; /* 0 0 0 b4 */ 78402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 24; 78502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */ 78602f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 8); 78702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 | word22; 78802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 78902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 79002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 79102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 79202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 79302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 79402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 79502f5b5447de349216a40086ca6061efefb5a3025James Dong 79602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 79702f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 79802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 24; /* 0 0 0 b8 */ 79902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 24; 80002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */ 80102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 8); 80202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 | word2; 80302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 80402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 80502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 80602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 80702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 80802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 80902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 81002f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 81102f5b5447de349216a40086ca6061efefb5a3025James Dong } 81202f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 81302f5b5447de349216a40086ca6061efefb5a3025James Dong } 81402f5b5447de349216a40086ca6061efefb5a3025James Dong else /* rnd1 = 0 */ 81502f5b5447de349216a40086ca6061efefb5a3025James Dong { 81602f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 81702f5b5447de349216a40086ca6061efefb5a3025James Dong { 81802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)prev); /* read b4 b3 b2 b1 */ 81902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 82002f5b5447de349216a40086ca6061efefb5a3025James Dong 82102f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = *((uint32*)(prev += 4)); /* read b8 b7 b6 b5 */ 82202f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = *((uint32*)(prev + width)); 82302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 24; /* 0 0 0 b4 */ 82402f5b5447de349216a40086ca6061efefb5a3025James Dong word22 >>= 24; 82502f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 | (word1 << 8); /* b7 b6 b5 b4 */ 82602f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = word22 | (word2 << 8); 82702f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word12 & word22; 82802f5b5447de349216a40086ca6061efefb5a3025James Dong word12 &= mask; 82902f5b5447de349216a40086ca6061efefb5a3025James Dong word22 &= mask; 83002f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 83102f5b5447de349216a40086ca6061efefb5a3025James Dong word12 >>= 1; 83202f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = word12 + (word22 >> 1); 83302f5b5447de349216a40086ca6061efefb5a3025James Dong word12 += word3; 83402f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += offset2)) = word12; 83502f5b5447de349216a40086ca6061efefb5a3025James Dong 83602f5b5447de349216a40086ca6061efefb5a3025James Dong word12 = *((uint32*)(prev += 4)); /* read b12 b11 b10 b9 */ 83702f5b5447de349216a40086ca6061efefb5a3025James Dong word22 = *((uint32*)(prev + width)); 83802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 24; /* 0 0 0 b8 */ 83902f5b5447de349216a40086ca6061efefb5a3025James Dong word2 >>= 24; 84002f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 | (word12 << 8); /* b11 b10 b9 b8 */ 84102f5b5447de349216a40086ca6061efefb5a3025James Dong word2 = word2 | (word22 << 8); 84202f5b5447de349216a40086ca6061efefb5a3025James Dong word3 = word1 & word2; 84302f5b5447de349216a40086ca6061efefb5a3025James Dong word1 &= mask; 84402f5b5447de349216a40086ca6061efefb5a3025James Dong word2 &= mask; 84502f5b5447de349216a40086ca6061efefb5a3025James Dong word3 &= (~mask); /* 0x1010101, check last bit */ 84602f5b5447de349216a40086ca6061efefb5a3025James Dong word1 >>= 1; 84702f5b5447de349216a40086ca6061efefb5a3025James Dong word1 = word1 + (word2 >> 1); 84802f5b5447de349216a40086ca6061efefb5a3025James Dong word1 += word3; 84902f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = word1; 85002f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 85102f5b5447de349216a40086ca6061efefb5a3025James Dong } 85202f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 85302f5b5447de349216a40086ca6061efefb5a3025James Dong } /* rnd */ 85402f5b5447de349216a40086ca6061efefb5a3025James Dong } /* tmp */ 85502f5b5447de349216a40086ca6061efefb5a3025James Dong} 85602f5b5447de349216a40086ca6061efefb5a3025James Dong 85702f5b5447de349216a40086ca6061efefb5a3025James Dong/**********************************************************************************/ 85802f5b5447de349216a40086ca6061efefb5a3025James Dongint GetPredAdvancedBy1x1( 85902f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *prev, /* i */ 86002f5b5447de349216a40086ca6061efefb5a3025James Dong uint8 *pred_block, /* i */ 86102f5b5447de349216a40086ca6061efefb5a3025James Dong int width, /* i */ 86202f5b5447de349216a40086ca6061efefb5a3025James Dong int pred_width_rnd /* i */ 86302f5b5447de349216a40086ca6061efefb5a3025James Dong) 86402f5b5447de349216a40086ca6061efefb5a3025James Dong{ 86502f5b5447de349216a40086ca6061efefb5a3025James Dong uint i; /* loop variable */ 86602f5b5447de349216a40086ca6061efefb5a3025James Dong int offset, offset2; 86702f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 x1, x2, x1m, x2m, y1, y2, y1m, y2m; /* new way */ 86802f5b5447de349216a40086ca6061efefb5a3025James Dong int tmp; 86902f5b5447de349216a40086ca6061efefb5a3025James Dong int rnd1, rnd2; 87002f5b5447de349216a40086ca6061efefb5a3025James Dong uint32 mask; 87102f5b5447de349216a40086ca6061efefb5a3025James Dong 87202f5b5447de349216a40086ca6061efefb5a3025James Dong /* initialize offset to adjust pixel counter */ 87302f5b5447de349216a40086ca6061efefb5a3025James Dong /* the next row; full-pel resolution */ 87402f5b5447de349216a40086ca6061efefb5a3025James Dong offset = width - B_SIZE; /* offset for prev */ 87502f5b5447de349216a40086ca6061efefb5a3025James Dong offset2 = (pred_width_rnd >> 1) - 8; /* offset for pred_block */ 87602f5b5447de349216a40086ca6061efefb5a3025James Dong 87702f5b5447de349216a40086ca6061efefb5a3025James Dong rnd1 = pred_width_rnd & 1; 87802f5b5447de349216a40086ca6061efefb5a3025James Dong 87902f5b5447de349216a40086ca6061efefb5a3025James Dong rnd2 = rnd1 + 1; 88002f5b5447de349216a40086ca6061efefb5a3025James Dong rnd2 |= (rnd2 << 8); 88102f5b5447de349216a40086ca6061efefb5a3025James Dong rnd2 |= (rnd2 << 16); 88202f5b5447de349216a40086ca6061efefb5a3025James Dong 88302f5b5447de349216a40086ca6061efefb5a3025James Dong mask = 0x3F; 88402f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 8); 88502f5b5447de349216a40086ca6061efefb5a3025James Dong mask |= (mask << 16); /* 0x3f3f3f3f */ 88602f5b5447de349216a40086ca6061efefb5a3025James Dong 88702f5b5447de349216a40086ca6061efefb5a3025James Dong tmp = (uint32)prev & 3; 88802f5b5447de349216a40086ca6061efefb5a3025James Dong 88902f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block -= 4; /* preset */ 89002f5b5447de349216a40086ca6061efefb5a3025James Dong 89102f5b5447de349216a40086ca6061efefb5a3025James Dong if (tmp == 0) /* word-aligned */ 89202f5b5447de349216a40086ca6061efefb5a3025James Dong { 89302f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 89402f5b5447de349216a40086ca6061efefb5a3025James Dong { 89502f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */ 89602f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */ 89702f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */ 89802f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */ 89902f5b5447de349216a40086ca6061efefb5a3025James Dong 90002f5b5447de349216a40086ca6061efefb5a3025James Dong x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ 90102f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 90202f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = x1 ^(x1m << 2); 90302f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 90402f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += x2m; 90502f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += x2; 90602f5b5447de349216a40086ca6061efefb5a3025James Dong 90702f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 90802f5b5447de349216a40086ca6061efefb5a3025James Dong y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ 90902f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 91002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = y1 ^(y1m << 2); 91102f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 91202f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; 91302f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 91402f5b5447de349216a40086ca6061efefb5a3025James Dong 91502f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 91602f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 91702f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */ 91802f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */ 91902f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 92002f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 92102f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 92202f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 92302f5b5447de349216a40086ca6061efefb5a3025James Dong x2m += y2m; 92402f5b5447de349216a40086ca6061efefb5a3025James Dong x2 += y2; 92502f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 92602f5b5447de349216a40086ca6061efefb5a3025James Dong 92702f5b5447de349216a40086ca6061efefb5a3025James Dong /* now operate on x1m, x1, y1m, y1, x2m, x2 */ 92802f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ 92902f5b5447de349216a40086ca6061efefb5a3025James Dong /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ 93002f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ 93102f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1, y1, x2 */ 93202f5b5447de349216a40086ca6061efefb5a3025James Dong 93302f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = x1m >> 8; 93402f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = x1 >> 8; 93502f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (y1m << 24); /* a4+b4, a3+b3, a2+b2, a1+b1 */ 93602f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (y1 << 24); 93702f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += y2m; /* a3+b3+a4+b4, ....., a0+b0+a1+b1 */ 93802f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += y2; 93902f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += rnd2; 94002f5b5447de349216a40086ca6061efefb5a3025James Dong x1 &= (mask << 2); 94102f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += (x1 >> 2); 94202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = x1m; /* save x1m */ 94302f5b5447de349216a40086ca6061efefb5a3025James Dong 94402f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = y1m >> 8; 94502f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y1 >> 8; 94602f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */ 94702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (x2 << 24); 94802f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; /* a7+b7+a8+b8, ....., a4+b4+a5+b5 */ 94902f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 95002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += rnd2; 95102f5b5447de349216a40086ca6061efefb5a3025James Dong y1 &= (mask << 2); 95202f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += (y1 >> 2); 95302f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = y1m; /* save y1m */ 95402f5b5447de349216a40086ca6061efefb5a3025James Dong 95502f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block += offset2; 95602f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 95702f5b5447de349216a40086ca6061efefb5a3025James Dong } 95802f5b5447de349216a40086ca6061efefb5a3025James Dong 95902f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 96002f5b5447de349216a40086ca6061efefb5a3025James Dong } 96102f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 1) 96202f5b5447de349216a40086ca6061efefb5a3025James Dong { 96302f5b5447de349216a40086ca6061efefb5a3025James Dong prev--; /* to word-aligned */ 96402f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 96502f5b5447de349216a40086ca6061efefb5a3025James Dong { 96602f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */ 96702f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */ 96802f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */ 96902f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */ 97002f5b5447de349216a40086ca6061efefb5a3025James Dong 97102f5b5447de349216a40086ca6061efefb5a3025James Dong x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ 97202f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 97302f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = x1 ^(x1m << 2); 97402f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 97502f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += x2m; 97602f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += x2; 97702f5b5447de349216a40086ca6061efefb5a3025James Dong 97802f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 97902f5b5447de349216a40086ca6061efefb5a3025James Dong y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ 98002f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 98102f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = y1 ^(y1m << 2); 98202f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 98302f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; 98402f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 98502f5b5447de349216a40086ca6061efefb5a3025James Dong 98602f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 98702f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 98802f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */ 98902f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */ 99002f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 99102f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 99202f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 99302f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 99402f5b5447de349216a40086ca6061efefb5a3025James Dong x2m += y2m; 99502f5b5447de349216a40086ca6061efefb5a3025James Dong x2 += y2; 99602f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 99702f5b5447de349216a40086ca6061efefb5a3025James Dong 99802f5b5447de349216a40086ca6061efefb5a3025James Dong /* now operate on x1m, x1, y1m, y1, x2m, x2 */ 99902f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ 100002f5b5447de349216a40086ca6061efefb5a3025James Dong /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ 100102f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ 100202f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1, y1, x2 */ 100302f5b5447de349216a40086ca6061efefb5a3025James Dong 100402f5b5447de349216a40086ca6061efefb5a3025James Dong x1m >>= 8 ; 100502f5b5447de349216a40086ca6061efefb5a3025James Dong x1 >>= 8; 100602f5b5447de349216a40086ca6061efefb5a3025James Dong x1m |= (y1m << 24); /* a4+b4, a3+b3, a2+b2, a1+b1 */ 100702f5b5447de349216a40086ca6061efefb5a3025James Dong x1 |= (y1 << 24); 100802f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y1m << 16); 100902f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = (y1 << 16); 101002f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (x1m >> 8); /* a5+b5, a4+b4, a3+b3, a2+b2 */ 101102f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (x1 >> 8); 101202f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += rnd2; 101302f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += y2m; /* a4+b4+a5+b5, ....., a1+b1+a2+b2 */ 101402f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += y2; 101502f5b5447de349216a40086ca6061efefb5a3025James Dong x1 &= (mask << 2); 101602f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += (x1 >> 2); 101702f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = x1m; /* save x1m */ 101802f5b5447de349216a40086ca6061efefb5a3025James Dong 101902f5b5447de349216a40086ca6061efefb5a3025James Dong y1m >>= 8; 102002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 >>= 8; 102102f5b5447de349216a40086ca6061efefb5a3025James Dong y1m |= (x2m << 24); /* a8+b8, a7+b7, a6+b6, a5+b5 */ 102202f5b5447de349216a40086ca6061efefb5a3025James Dong y1 |= (x2 << 24); 102302f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (x2m << 16); 102402f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = (x2 << 16); 102502f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (y1m >> 8); /* a9+b9, a8+b8, a7+b7, a6+b6,*/ 102602f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (y1 >> 8); 102702f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += rnd2; 102802f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; /* a8+b8+a9+b9, ....., a5+b5+a6+b6 */ 102902f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 103002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 &= (mask << 2); 103102f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += (y1 >> 2); 103202f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = y1m; /* save y1m */ 103302f5b5447de349216a40086ca6061efefb5a3025James Dong 103402f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block += offset2; 103502f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 103602f5b5447de349216a40086ca6061efefb5a3025James Dong } 103702f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 103802f5b5447de349216a40086ca6061efefb5a3025James Dong } 103902f5b5447de349216a40086ca6061efefb5a3025James Dong else if (tmp == 2) 104002f5b5447de349216a40086ca6061efefb5a3025James Dong { 104102f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 2; /* to word-aligned */ 104202f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 104302f5b5447de349216a40086ca6061efefb5a3025James Dong { 104402f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */ 104502f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */ 104602f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */ 104702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */ 104802f5b5447de349216a40086ca6061efefb5a3025James Dong 104902f5b5447de349216a40086ca6061efefb5a3025James Dong x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ 105002f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 105102f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = x1 ^(x1m << 2); 105202f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 105302f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += x2m; 105402f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += x2; 105502f5b5447de349216a40086ca6061efefb5a3025James Dong 105602f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 105702f5b5447de349216a40086ca6061efefb5a3025James Dong y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ 105802f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 105902f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = y1 ^(y1m << 2); 106002f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 106102f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; 106202f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 106302f5b5447de349216a40086ca6061efefb5a3025James Dong 106402f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 106502f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 106602f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */ 106702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */ 106802f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 106902f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 107002f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 107102f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 107202f5b5447de349216a40086ca6061efefb5a3025James Dong x2m += y2m; 107302f5b5447de349216a40086ca6061efefb5a3025James Dong x2 += y2; 107402f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 107502f5b5447de349216a40086ca6061efefb5a3025James Dong 107602f5b5447de349216a40086ca6061efefb5a3025James Dong /* now operate on x1m, x1, y1m, y1, x2m, x2 */ 107702f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ 107802f5b5447de349216a40086ca6061efefb5a3025James Dong /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ 107902f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ 108002f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1, y1, x2 */ 108102f5b5447de349216a40086ca6061efefb5a3025James Dong 108202f5b5447de349216a40086ca6061efefb5a3025James Dong x1m >>= 16 ; 108302f5b5447de349216a40086ca6061efefb5a3025James Dong x1 >>= 16; 108402f5b5447de349216a40086ca6061efefb5a3025James Dong x1m |= (y1m << 16); /* a5+b5, a4+b4, a3+b3, a2+b2 */ 108502f5b5447de349216a40086ca6061efefb5a3025James Dong x1 |= (y1 << 16); 108602f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y1m << 8); 108702f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = (y1 << 8); 108802f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (x1m >> 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */ 108902f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (x1 >> 8); 109002f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += rnd2; 109102f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += y2m; /* a5+b5+a6+b6, ....., a2+b2+a3+b3 */ 109202f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += y2; 109302f5b5447de349216a40086ca6061efefb5a3025James Dong x1 &= (mask << 2); 109402f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += (x1 >> 2); 109502f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = x1m; /* save x1m */ 109602f5b5447de349216a40086ca6061efefb5a3025James Dong 109702f5b5447de349216a40086ca6061efefb5a3025James Dong y1m >>= 16; 109802f5b5447de349216a40086ca6061efefb5a3025James Dong y1 >>= 16; 109902f5b5447de349216a40086ca6061efefb5a3025James Dong y1m |= (x2m << 16); /* a9+b9, a8+b8, a7+b7, a6+b6 */ 110002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 |= (x2 << 16); 110102f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (x2m << 8); 110202f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = (x2 << 8); 110302f5b5447de349216a40086ca6061efefb5a3025James Dong y2m |= (y1m >> 8); /* a10+b10, a9+b9, a8+b8, a7+b7,*/ 110402f5b5447de349216a40086ca6061efefb5a3025James Dong y2 |= (y1 >> 8); 110502f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += rnd2; 110602f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; /* a9+b9+a10+b10, ....., a6+b6+a7+b7 */ 110702f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 110802f5b5447de349216a40086ca6061efefb5a3025James Dong y1 &= (mask << 2); 110902f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += (y1 >> 2); 111002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = y1m; /* save y1m */ 111102f5b5447de349216a40086ca6061efefb5a3025James Dong 111202f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block += offset2; 111302f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 111402f5b5447de349216a40086ca6061efefb5a3025James Dong } 111502f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 111602f5b5447de349216a40086ca6061efefb5a3025James Dong } 111702f5b5447de349216a40086ca6061efefb5a3025James Dong else /* tmp == 3 */ 111802f5b5447de349216a40086ca6061efefb5a3025James Dong { 111902f5b5447de349216a40086ca6061efefb5a3025James Dong prev -= 3; /* to word-aligned */ 112002f5b5447de349216a40086ca6061efefb5a3025James Dong for (i = B_SIZE; i > 0; i--) 112102f5b5447de349216a40086ca6061efefb5a3025James Dong { 112202f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = *((uint32*)prev); /* load a3 a2 a1 a0 */ 112302f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev + width)); /* load b3 b2 b1 b0, another line */ 112402f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = *((uint32*)(prev += 4)); /* a7 a6 a5 a4 */ 112502f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b7 b6 b5 b4 */ 112602f5b5447de349216a40086ca6061efefb5a3025James Dong 112702f5b5447de349216a40086ca6061efefb5a3025James Dong x1m = (x1 >> 2) & mask; /* zero out last 2 bits */ 112802f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 112902f5b5447de349216a40086ca6061efefb5a3025James Dong x1 = x1 ^(x1m << 2); 113002f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 113102f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += x2m; 113202f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += x2; 113302f5b5447de349216a40086ca6061efefb5a3025James Dong 113402f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 113502f5b5447de349216a40086ca6061efefb5a3025James Dong y1m = (y1 >> 2) & mask; /* zero out last 2 bits */ 113602f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 113702f5b5447de349216a40086ca6061efefb5a3025James Dong y1 = y1 ^(y1m << 2); 113802f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 113902f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += y2m; 114002f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += y2; 114102f5b5447de349216a40086ca6061efefb5a3025James Dong 114202f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 114302f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m, x2 free */ 114402f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = *((uint32*)(prev += 4)); /* a11 a10 a9 a8 */ 114502f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = *((uint32*)(prev + width)); /* b11 b10 b9 b8 */ 114602f5b5447de349216a40086ca6061efefb5a3025James Dong x2m = (x2 >> 2) & mask; 114702f5b5447de349216a40086ca6061efefb5a3025James Dong y2m = (y2 >> 2) & mask; 114802f5b5447de349216a40086ca6061efefb5a3025James Dong x2 = x2 ^(x2m << 2); 114902f5b5447de349216a40086ca6061efefb5a3025James Dong y2 = y2 ^(y2m << 2); 115002f5b5447de349216a40086ca6061efefb5a3025James Dong x2m += y2m; 115102f5b5447de349216a40086ca6061efefb5a3025James Dong x2 += y2; 115202f5b5447de349216a40086ca6061efefb5a3025James Dong /* y2m, y2 free */ 115302f5b5447de349216a40086ca6061efefb5a3025James Dong 115402f5b5447de349216a40086ca6061efefb5a3025James Dong /* now operate on x1m, x1, y1m, y1, x2m, x2 */ 115502f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1m = a3+b3, a2+b2, a1+b1, a0+b0 */ 115602f5b5447de349216a40086ca6061efefb5a3025James Dong /* y1m = a7+b7, a6+b6, a5+b5, a4+b4 */ 115702f5b5447de349216a40086ca6061efefb5a3025James Dong /* x2m = a11+b11, a10+b10, a9+b9, a8+b8 */ 115802f5b5447de349216a40086ca6061efefb5a3025James Dong /* x1, y1, x2 */ 115902f5b5447de349216a40086ca6061efefb5a3025James Dong 116002f5b5447de349216a40086ca6061efefb5a3025James Dong x1m >>= 24 ; 116102f5b5447de349216a40086ca6061efefb5a3025James Dong x1 >>= 24; 116202f5b5447de349216a40086ca6061efefb5a3025James Dong x1m |= (y1m << 8); /* a6+b6, a5+b5, a4+b4, a3+b3 */ 116302f5b5447de349216a40086ca6061efefb5a3025James Dong x1 |= (y1 << 8); 116402f5b5447de349216a40086ca6061efefb5a3025James Dong 116502f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += y1m; /* a6+b6+a7+b7, ....., a3+b3+a4+b4 */ 116602f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += y1; 116702f5b5447de349216a40086ca6061efefb5a3025James Dong x1 += rnd2; 116802f5b5447de349216a40086ca6061efefb5a3025James Dong x1 &= (mask << 2); 116902f5b5447de349216a40086ca6061efefb5a3025James Dong x1m += (x1 >> 2); 117002f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = x1m; /* save x1m */ 117102f5b5447de349216a40086ca6061efefb5a3025James Dong 117202f5b5447de349216a40086ca6061efefb5a3025James Dong y1m >>= 24; 117302f5b5447de349216a40086ca6061efefb5a3025James Dong y1 >>= 24; 117402f5b5447de349216a40086ca6061efefb5a3025James Dong y1m |= (x2m << 8); /* a10+b10, a9+b9, a8+b8, a7+b7 */ 117502f5b5447de349216a40086ca6061efefb5a3025James Dong y1 |= (x2 << 8); 117602f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += x2m; /* a10+b10+a11+b11, ....., a7+b7+a8+b8 */ 117702f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += x2; 117802f5b5447de349216a40086ca6061efefb5a3025James Dong y1 += rnd2; 117902f5b5447de349216a40086ca6061efefb5a3025James Dong y1 &= (mask << 2); 118002f5b5447de349216a40086ca6061efefb5a3025James Dong y1m += (y1 >> 2); 118102f5b5447de349216a40086ca6061efefb5a3025James Dong *((uint32*)(pred_block += 4)) = y1m; /* save y1m */ 118202f5b5447de349216a40086ca6061efefb5a3025James Dong 118302f5b5447de349216a40086ca6061efefb5a3025James Dong pred_block += offset2; 118402f5b5447de349216a40086ca6061efefb5a3025James Dong prev += offset; 118502f5b5447de349216a40086ca6061efefb5a3025James Dong } 118602f5b5447de349216a40086ca6061efefb5a3025James Dong return 1; 118702f5b5447de349216a40086ca6061efefb5a3025James Dong } 118802f5b5447de349216a40086ca6061efefb5a3025James Dong} 118902f5b5447de349216a40086ca6061efefb5a3025James Dong 119002f5b5447de349216a40086ca6061efefb5a3025James Dong 1191