1609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber/* ------------------------------------------------------------------ 2609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Copyright (C) 1998-2009 PacketVideo 3609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 4609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 5609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * you may not use this file except in compliance with the License. 6609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * You may obtain a copy of the License at 7609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 8609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * http://www.apache.org/licenses/LICENSE-2.0 9609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * 10609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * Unless required by applicable law or agreed to in writing, software 11609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 12609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 13609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * express or implied. 14609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * See the License for the specific language governing permissions 15609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * and limitations under the License. 16609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber * ------------------------------------------------------------------- 17609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber */ 18609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include <string.h> 19609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 20609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber#include "avclib_common.h" 21609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 22609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF void InitNeighborAvailability(AVCCommonObj *video, int mbNum) 23609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 24609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int PicWidthInMbs = video->PicWidthInMbs; 25609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 26609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber // do frame-only and postpone intraAvail calculattion 27609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAddrA = mbNum - 1; 28609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAddrB = mbNum - PicWidthInMbs; 29609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAddrC = mbNum - PicWidthInMbs + 1; 30609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAddrD = mbNum - PicWidthInMbs - 1; 31609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 32609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAvailA = video->mbAvailB = video->mbAvailC = video->mbAvailD = 0; 33609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mb_x) 34609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 35609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAvailA = (video->mblock[video->mbAddrA].slice_id == video->currMB->slice_id); 36609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mb_y) 37609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 38609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAvailD = (video->mblock[video->mbAddrD].slice_id == video->currMB->slice_id); 39609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 40609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 41609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 42609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mb_y) 43609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 44609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAvailB = (video->mblock[video->mbAddrB].slice_id == video->currMB->slice_id); 45609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mb_x < (PicWidthInMbs - 1)) 46609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 47609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mbAvailC = (video->mblock[video->mbAddrC].slice_id == video->currMB->slice_id); 48609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 49609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 50609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return ; 51609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 52609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 53609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huberbool mb_is_available(AVCMacroblock *mblock, uint PicSizeInMbs, int mbAddr, int currMbAddr) 54609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 55609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (mbAddr < 0 || mbAddr >= (int)PicSizeInMbs) 56609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 57609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return FALSE; 58609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 59609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 60609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (mblock[mbAddr].slice_id != mblock[currMbAddr].slice_id) 61609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 62609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return FALSE; 63609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 64609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 65609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return TRUE; 66609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 67609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 68609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF int predict_nnz(AVCCommonObj *video, int i, int j) 69609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 70609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int pred_nnz = 0; 71609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int cnt = 1; 72609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCMacroblock *tempMB; 73609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 74609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* left block */ 75609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /*getLuma4x4Neighbour(video, mb_nr, i, j, -1, 0, &pix); 76609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber leftMB = video->mblock + pix.mb_addr; */ 77609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 78609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 79609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (i) 80609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 81609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = video->currMB->nz_coeff[(j<<2)+i-1]; 82609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 83609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 84609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 85609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mbAvailA) 86609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 87609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tempMB = video->mblock + video->mbAddrA; 88609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = tempMB->nz_coeff[(j<<2)+3]; 89609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 90609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 91609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 92609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt = 0; 93609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 94609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 95609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 96609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 97609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* top block */ 98609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /*getLuma4x4Neighbour(video, mb_nr, i, j, 0, -1, &pix); 99609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber topMB = video->mblock + pix.mb_addr;*/ 100609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 101609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 102609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (j) 103609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 104609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz += video->currMB->nz_coeff[((j-1)<<2)+i]; 105609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt++; 106609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 107609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 108609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 109609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mbAvailB) 110609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 111609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tempMB = video->mblock + video->mbAddrB; 112609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz += tempMB->nz_coeff[12+i]; 113609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt++; 114609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 115609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 116609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 117609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 118609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (cnt == 2) 119609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 120609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = (pred_nnz + 1) >> 1; 121609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 122609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 123609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return pred_nnz; 124609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 125609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 126609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 127609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 128609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF int predict_nnz_chroma(AVCCommonObj *video, int i, int j) 129609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 130609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int pred_nnz = 0; 131609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int cnt = 1; 132609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCMacroblock *tempMB; 133609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 134609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* left block */ 135609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /*getChroma4x4Neighbour(video, mb_nr, i%2, j-4, -1, 0, &pix); 136609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber leftMB = video->mblock + pix.mb_addr;*/ 137609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 138609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (i&1) 139609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 140609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = video->currMB->nz_coeff[(j<<2)+i-1]; 141609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 142609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 143609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 144609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 145609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mbAvailA) 146609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 147609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tempMB = video->mblock + video->mbAddrA; 148609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = tempMB->nz_coeff[(j<<2)+i+1]; 149609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 150609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 151609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 152609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt = 0; 153609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 154609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 155609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 156609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 157609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* top block */ 158609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /*getChroma4x4Neighbour(video, mb_nr, i%2, j-4, 0, -1, &pix); 159609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber topMB = video->mblock + pix.mb_addr;*/ 160609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 161609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 162609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (j&1) 163609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 164609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz += video->currMB->nz_coeff[((j-1)<<2)+i]; 165609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt++; 166609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 167609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 168609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 169609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mbAvailB) 170609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 171609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber tempMB = video->mblock + video->mbAddrB; 172609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz += tempMB->nz_coeff[20+i]; 173609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber cnt++; 174609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 175609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 176609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 177609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 178609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (cnt == 2) 179609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 180609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pred_nnz = (pred_nnz + 1) >> 1; 181609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 182609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 183609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return pred_nnz; 184609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 185609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 186609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas HuberOSCL_EXPORT_REF void GetMotionVectorPredictor(AVCCommonObj *video, int encFlag) 187609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber{ 188609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCMacroblock *currMB = video->currMB; 189609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber AVCMacroblock *MB_A, *MB_B, *MB_C, *MB_D; 190609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int block_x, block_y, block_x_1, block_y_1, new_block_x; 191609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int mbPartIdx, subMbPartIdx, offset_indx; 192609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int16 *mv, pmv_x, pmv_y; 193609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int nmSubMbHeight, nmSubMbWidth, mbPartIdx_X, mbPartIdx_Y; 194609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int avail_a, avail_b, avail_c; 195609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber const static uint32 C = 0x5750; 196609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int i, j, offset_MbPart_indx, refIdxLXA, refIdxLXB, refIdxLXC = 0, curr_ref_idx; 197609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber int pmv_A_x, pmv_B_x, pmv_C_x = 0, pmv_A_y, pmv_B_y, pmv_C_y = 0; 198609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 199609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* we have to take care of Intra/skip blocks somewhere, i.e. set MV to 0 and set ref to -1! */ 200609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* we have to populate refIdx as well */ 201609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 202609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 203609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber MB_A = &video->mblock[video->mbAddrA]; 204609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber MB_B = &video->mblock[video->mbAddrB]; 205609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 206609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 207609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (currMB->mbMode == AVC_SKIP /* && !encFlag */) /* only for decoder */ 208609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 209609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber currMB->ref_idx_L0[0] = currMB->ref_idx_L0[1] = currMB->ref_idx_L0[2] = currMB->ref_idx_L0[3] = 0; 210609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (video->mbAvailA && video->mbAvailB) 211609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 212609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if ((MB_A->ref_idx_L0[1] == 0 && MB_A->mvL0[3] == 0) || 213609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber (MB_B->ref_idx_L0[2] == 0 && MB_B->mvL0[12] == 0)) 214609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 215609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber memset(currMB->mvL0, 0, sizeof(int32)*16); 216609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return; 217609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 218609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 219609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 220609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 221609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber memset(currMB->mvL0, 0, sizeof(int32)*16); 222609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber return; 223609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 224609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mvd_l0[0][0][0] = 0; 225609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mvd_l0[0][0][1] = 0; 226609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 227609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 228609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber MB_C = &video->mblock[video->mbAddrC]; 229609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber MB_D = &video->mblock[video->mbAddrD]; 230609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 231609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber offset_MbPart_indx = 0; 232609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (mbPartIdx = 0; mbPartIdx < currMB->NumMbPart; mbPartIdx++) 233609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 234609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber offset_indx = 0; 235609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber nmSubMbHeight = currMB->SubMbPartHeight[mbPartIdx] >> 2; 236609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber nmSubMbWidth = currMB->SubMbPartWidth[mbPartIdx] >> 2; 237609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mbPartIdx_X = ((mbPartIdx + offset_MbPart_indx) & 1) << 1; 238609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mbPartIdx_Y = (mbPartIdx + offset_MbPart_indx) & 2; 239609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 240609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (subMbPartIdx = 0; subMbPartIdx < currMB->NumSubMbPart[mbPartIdx]; subMbPartIdx++) 241609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 242609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber block_x = mbPartIdx_X + ((subMbPartIdx + offset_indx) & 1); 243609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber block_y = mbPartIdx_Y + (((subMbPartIdx + offset_indx) >> 1) & 1); 244609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 245609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber block_x_1 = block_x - 1; 246609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber block_y_1 = block_y - 1; 247609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXA = refIdxLXB = refIdxLXC = -1; 248609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_A_x = pmv_A_y = pmv_B_x = pmv_B_y = pmv_C_x = pmv_C_y = 0; 249609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 250609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (block_x) 251609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 252609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_a = 1; 253609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXA = currMB->ref_idx_L0[(block_y & 2) + (block_x_1 >> 1)]; 254609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(currMB->mvL0 + (block_y << 2) + block_x_1); 255609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_A_x = *mv++; 256609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_A_y = *mv; 257609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 258609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 259609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 260609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_a = video->mbAvailA; 261609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_a) 262609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 263609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXA = MB_A->ref_idx_L0[(block_y & 2) + 1]; 264609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_A->mvL0 + (block_y << 2) + 3); 265609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_A_x = *mv++; 266609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_A_y = *mv; 267609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 268609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 269609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 270609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (block_y) 271609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 272609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_b = 1; 273609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXB = currMB->ref_idx_L0[(block_y_1 & 2) + (block_x >> 1)]; 274609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + block_x); 275609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_B_x = *mv++; 276609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_B_y = *mv; 277609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 278609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 279609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 280609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 281609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_b = video->mbAvailB; 282609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_b) 283609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 284609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXB = MB_B->ref_idx_L0[2 + (block_x >> 1)]; 285609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_B->mvL0 + 12 + block_x); 286609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_B_x = *mv++; 287609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_B_y = *mv; 288609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 289609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 290609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 291609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber new_block_x = block_x + (currMB->SubMbPartWidth[mbPartIdx] >> 2) - 1; 292609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = (C >> ((block_y << 2) + new_block_x)) & 0x1; 293609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 294609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 295609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 296609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* it guaranteed that block_y > 0 && new_block_x<3 ) */ 297609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = currMB->ref_idx_L0[(block_y_1 & 2) + ((new_block_x+1) >> 1)]; 298609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + (new_block_x + 1)); 299609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 300609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 301609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 302609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 303609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 304609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (block_y == 0 && new_block_x < 3) 305609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 306609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = video->mbAvailB; 307609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 308609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 309609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = MB_B->ref_idx_L0[2 + ((new_block_x+1)>>1)]; 310609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_B->mvL0 + 12 + (new_block_x + 1)); 311609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 312609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 313609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 314609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 315609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (block_y == 0 && new_block_x == 3) 316609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 317609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = video->mbAvailC; 318609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 319609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 320609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = MB_C->ref_idx_L0[2]; 321609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_C->mvL0 + 12); 322609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 323609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 324609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 325609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 326609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 327609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c == 0) 328609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { /* check D */ 329609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (block_x && block_y) 330609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 331609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = 1; 332609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = currMB->ref_idx_L0[(block_y_1 & 2) + (block_x_1 >> 1)]; 333609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + block_x_1); 334609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 335609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 336609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 337609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (block_y) 338609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 339609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = video->mbAvailA; 340609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 341609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 342609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = MB_A->ref_idx_L0[(block_y_1 & 2) + 1]; 343609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_A->mvL0 + (block_y_1 << 2) + 3); 344609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 345609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 346609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 347609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 348609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (block_x) 349609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 350609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = video->mbAvailB; 351609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 352609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 353609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = MB_B->ref_idx_L0[2 + (block_x_1 >> 1)]; 354609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_B->mvL0 + 12 + block_x_1); 355609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 356609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 357609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 358609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 359609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 360609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 361609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber avail_c = video->mbAvailD; 362609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_c) 363609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 364609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber refIdxLXC = MB_D->ref_idx_L0[3]; 365609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(MB_D->mvL0 + 15); 366609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_x = *mv++; 367609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_C_y = *mv; 368609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 369609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 370609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 371609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 372609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 373609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber offset_indx = currMB->SubMbPartWidth[mbPartIdx] >> 3; 374609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 375609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber curr_ref_idx = currMB->ref_idx_L0[(block_y & 2) + (block_x >> 1)]; 376609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 377609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (avail_a && !(avail_b || avail_c)) 378609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 379609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_A_x; 380609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_A_y; 381609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 382609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (((curr_ref_idx == refIdxLXA) + (curr_ref_idx == refIdxLXB) + (curr_ref_idx == refIdxLXC)) == 1) 383609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 384609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (curr_ref_idx == refIdxLXA) 385609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 386609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_A_x; 387609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_A_y; 388609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 389609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (curr_ref_idx == refIdxLXB) 390609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 391609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_B_x; 392609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_B_y; 393609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 394609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 395609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 396609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_C_x; 397609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_C_y; 398609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 399609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 400609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 401609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 402609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = AVC_MEDIAN(pmv_A_x, pmv_B_x, pmv_C_x); 403609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = AVC_MEDIAN(pmv_A_y, pmv_B_y, pmv_C_y); 404609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 405609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 406609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber /* overwrite if special case */ 407609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (currMB->NumMbPart == 2) 408609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 409609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (currMB->MbPartWidth == 16) 410609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 411609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (mbPartIdx == 0) 412609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 413609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (refIdxLXB == curr_ref_idx) 414609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 415609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_B_x; 416609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_B_y; 417609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 418609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 419609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (refIdxLXA == curr_ref_idx) 420609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 421609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_A_x; 422609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_A_y; 423609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 424609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 425609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else 426609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 427609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (mbPartIdx == 0) 428609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 429609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (refIdxLXA == curr_ref_idx) 430609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 431609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_A_x; 432609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_A_y; 433609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 434609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 435609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else if (refIdxLXC == curr_ref_idx) 436609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 437609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x = pmv_C_x; 438609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y = pmv_C_y; 439609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 440609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 441609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 442609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 443609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv = (int16*)(currMB->mvL0 + block_x + (block_y << 2)); 444609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 445609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber if (encFlag) /* calculate residual MV video->mvd_l0 */ 446609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 447609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mvd_l0[mbPartIdx][subMbPartIdx][0] = *mv++ - pmv_x; 448609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber video->mvd_l0[mbPartIdx][subMbPartIdx][1] = *mv++ - pmv_y; 449609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 450609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber else /* calculate original MV currMB->mvL0 */ 451609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 452609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_x += video->mvd_l0[mbPartIdx][subMbPartIdx][0]; 453609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber pmv_y += video->mvd_l0[mbPartIdx][subMbPartIdx][1]; 454609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 455609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (i = 0; i < nmSubMbHeight; i++) 456609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 457609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber for (j = 0; j < nmSubMbWidth; j++) 458609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber { 459609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *mv++ = pmv_x; 460609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber *mv++ = pmv_y; 461609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 462609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber mv += (8 - (j << 1)); 463609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 464609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 465609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 466609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber offset_MbPart_indx = currMB->MbPartWidth >> 4; 467609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 468609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber } 469609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber} 470609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 471609f1a00c96cf5605f4614e7bb6d0487c98969c5Andreas Huber 472