14a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber/* ------------------------------------------------------------------ 24a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Copyright (C) 1998-2009 PacketVideo 34a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 44a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Licensed under the Apache License, Version 2.0 (the "License"); 54a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * you may not use this file except in compliance with the License. 64a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * You may obtain a copy of the License at 74a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 84a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * http://www.apache.org/licenses/LICENSE-2.0 94a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * 104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * Unless required by applicable law or agreed to in writing, software 114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * distributed under the License is distributed on an "AS IS" BASIS, 124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either 134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * express or implied. 144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * See the License for the specific language governing permissions 154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * and limitations under the License. 164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber * ------------------------------------------------------------------- 174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber */ 184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include <string.h> 194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber#include "avclib_common.h" 214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF void InitNeighborAvailability(AVCCommonObj *video, int mbNum) 234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int PicWidthInMbs = video->PicWidthInMbs; 254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber // do frame-only and postpone intraAvail calculattion 274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAddrA = mbNum - 1; 284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAddrB = mbNum - PicWidthInMbs; 294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAddrC = mbNum - PicWidthInMbs + 1; 304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAddrD = mbNum - PicWidthInMbs - 1; 314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAvailA = video->mbAvailB = video->mbAvailC = video->mbAvailD = 0; 334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mb_x) 344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAvailA = (video->mblock[video->mbAddrA].slice_id == video->currMB->slice_id); 364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mb_y) 374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAvailD = (video->mblock[video->mbAddrD].slice_id == video->currMB->slice_id); 394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mb_y) 434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAvailB = (video->mblock[video->mbAddrB].slice_id == video->currMB->slice_id); 454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mb_x < (PicWidthInMbs - 1)) 464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mbAvailC = (video->mblock[video->mbAddrC].slice_id == video->currMB->slice_id); 484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return ; 514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huberbool mb_is_available(AVCMacroblock *mblock, uint PicSizeInMbs, int mbAddr, int currMbAddr) 544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (mbAddr < 0 || mbAddr >= (int)PicSizeInMbs) 564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return FALSE; 584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (mblock[mbAddr].slice_id != mblock[currMbAddr].slice_id) 614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return FALSE; 634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return TRUE; 664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF int predict_nnz(AVCCommonObj *video, int i, int j) 694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int pred_nnz = 0; 714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int cnt = 1; 724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCMacroblock *tempMB; 734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* left block */ 754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /*getLuma4x4Neighbour(video, mb_nr, i, j, -1, 0, &pix); 764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber leftMB = video->mblock + pix.mb_addr; */ 774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (i) 804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = video->currMB->nz_coeff[(j<<2)+i-1]; 824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mbAvailA) 864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber tempMB = video->mblock + video->mbAddrA; 884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = tempMB->nz_coeff[(j<<2)+3]; 894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt = 0; 934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* top block */ 984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /*getLuma4x4Neighbour(video, mb_nr, i, j, 0, -1, &pix); 994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber topMB = video->mblock + pix.mb_addr;*/ 1004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 1014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (j) 1034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz += video->currMB->nz_coeff[((j-1)<<2)+i]; 1054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt++; 1064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 1084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mbAvailB) 1104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber tempMB = video->mblock + video->mbAddrB; 1124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz += tempMB->nz_coeff[12+i]; 1134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt++; 1144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (cnt == 2) 1194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = (pred_nnz + 1) >> 1; 1214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return pred_nnz; 1244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 1264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF int predict_nnz_chroma(AVCCommonObj *video, int i, int j) 1294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 1304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int pred_nnz = 0; 1314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int cnt = 1; 1324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCMacroblock *tempMB; 1334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* left block */ 1354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /*getChroma4x4Neighbour(video, mb_nr, i%2, j-4, -1, 0, &pix); 1364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber leftMB = video->mblock + pix.mb_addr;*/ 1374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 1384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (i&1) 1394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = video->currMB->nz_coeff[(j<<2)+i-1]; 1414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 1444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mbAvailA) 1464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber tempMB = video->mblock + video->mbAddrA; 1484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = tempMB->nz_coeff[(j<<2)+i+1]; 1494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 1514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt = 0; 1534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* top block */ 1584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /*getChroma4x4Neighbour(video, mb_nr, i%2, j-4, 0, -1, &pix); 1594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber topMB = video->mblock + pix.mb_addr;*/ 1604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* replace the above with below (won't work for field decoding), 1/19/04 */ 1614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (j&1) 1634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz += video->currMB->nz_coeff[((j-1)<<2)+i]; 1654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt++; 1664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 1684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mbAvailB) 1704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber tempMB = video->mblock + video->mbAddrB; 1724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz += tempMB->nz_coeff[20+i]; 1734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber cnt++; 1744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (cnt == 2) 1794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 1804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pred_nnz = (pred_nnz + 1) >> 1; 1814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 1824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return pred_nnz; 1844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 1854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas HuberOSCL_EXPORT_REF void GetMotionVectorPredictor(AVCCommonObj *video, int encFlag) 1874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber{ 1884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCMacroblock *currMB = video->currMB; 1894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber AVCMacroblock *MB_A, *MB_B, *MB_C, *MB_D; 1904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int block_x, block_y, block_x_1, block_y_1, new_block_x; 1914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int mbPartIdx, subMbPartIdx, offset_indx; 1924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int16 *mv, pmv_x, pmv_y; 1934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int nmSubMbHeight, nmSubMbWidth, mbPartIdx_X, mbPartIdx_Y; 1944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int avail_a, avail_b, avail_c; 1954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber const static uint32 C = 0x5750; 1964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int i, j, offset_MbPart_indx, refIdxLXA, refIdxLXB, refIdxLXC = 0, curr_ref_idx; 1974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber int pmv_A_x, pmv_B_x, pmv_C_x = 0, pmv_A_y, pmv_B_y, pmv_C_y = 0; 1984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 1994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* we have to take care of Intra/skip blocks somewhere, i.e. set MV to 0 and set ref to -1! */ 2004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* we have to populate refIdx as well */ 2014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MB_A = &video->mblock[video->mbAddrA]; 2044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MB_B = &video->mblock[video->mbAddrB]; 2054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (currMB->mbMode == AVC_SKIP /* && !encFlag */) /* only for decoder */ 2084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber currMB->ref_idx_L0[0] = currMB->ref_idx_L0[1] = currMB->ref_idx_L0[2] = currMB->ref_idx_L0[3] = 0; 2104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (video->mbAvailA && video->mbAvailB) 2114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if ((MB_A->ref_idx_L0[1] == 0 && MB_A->mvL0[3] == 0) || 2134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber (MB_B->ref_idx_L0[2] == 0 && MB_B->mvL0[12] == 0)) 2144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber memset(currMB->mvL0, 0, sizeof(int32)*16); 2164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return; 2174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 2204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber memset(currMB->mvL0, 0, sizeof(int32)*16); 2224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber return; 2234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mvd_l0[0][0][0] = 0; 2254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mvd_l0[0][0][1] = 0; 2264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MB_C = &video->mblock[video->mbAddrC]; 2294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber MB_D = &video->mblock[video->mbAddrD]; 2304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber offset_MbPart_indx = 0; 2324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (mbPartIdx = 0; mbPartIdx < currMB->NumMbPart; mbPartIdx++) 2334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber offset_indx = 0; 2354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber nmSubMbHeight = currMB->SubMbPartHeight[mbPartIdx] >> 2; 2364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber nmSubMbWidth = currMB->SubMbPartWidth[mbPartIdx] >> 2; 2374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mbPartIdx_X = ((mbPartIdx + offset_MbPart_indx) & 1) << 1; 2384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mbPartIdx_Y = (mbPartIdx + offset_MbPart_indx) & 2; 2394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (subMbPartIdx = 0; subMbPartIdx < currMB->NumSubMbPart[mbPartIdx]; subMbPartIdx++) 2414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber block_x = mbPartIdx_X + ((subMbPartIdx + offset_indx) & 1); 2434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber block_y = mbPartIdx_Y + (((subMbPartIdx + offset_indx) >> 1) & 1); 2444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber block_x_1 = block_x - 1; 2464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber block_y_1 = block_y - 1; 2474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXA = refIdxLXB = refIdxLXC = -1; 2484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_A_x = pmv_A_y = pmv_B_x = pmv_B_y = pmv_C_x = pmv_C_y = 0; 2494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (block_x) 2514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_a = 1; 2534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXA = currMB->ref_idx_L0[(block_y & 2) + (block_x_1 >> 1)]; 2544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(currMB->mvL0 + (block_y << 2) + block_x_1); 2554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_A_x = *mv++; 2564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_A_y = *mv; 2574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 2594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_a = video->mbAvailA; 2614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_a) 2624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXA = MB_A->ref_idx_L0[(block_y & 2) + 1]; 2644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_A->mvL0 + (block_y << 2) + 3); 2654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_A_x = *mv++; 2664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_A_y = *mv; 2674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (block_y) 2714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_b = 1; 2734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXB = currMB->ref_idx_L0[(block_y_1 & 2) + (block_x >> 1)]; 2744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + block_x); 2754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_B_x = *mv++; 2764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_B_y = *mv; 2774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 2804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_b = video->mbAvailB; 2824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_b) 2834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXB = MB_B->ref_idx_L0[2 + (block_x >> 1)]; 2854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_B->mvL0 + 12 + block_x); 2864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_B_x = *mv++; 2874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_B_y = *mv; 2884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 2904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber new_block_x = block_x + (currMB->SubMbPartWidth[mbPartIdx] >> 2) - 1; 2924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = (C >> ((block_y << 2) + new_block_x)) & 0x1; 2934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 2944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 2954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 2964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* it guaranteed that block_y > 0 && new_block_x<3 ) */ 2974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = currMB->ref_idx_L0[(block_y_1 & 2) + ((new_block_x+1) >> 1)]; 2984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + (new_block_x + 1)); 2994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 3034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (block_y == 0 && new_block_x < 3) 3054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = video->mbAvailB; 3074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 3084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = MB_B->ref_idx_L0[2 + ((new_block_x+1)>>1)]; 3104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_B->mvL0 + 12 + (new_block_x + 1)); 3114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (block_y == 0 && new_block_x == 3) 3164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = video->mbAvailC; 3184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 3194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = MB_C->ref_idx_L0[2]; 3214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_C->mvL0 + 12); 3224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c == 0) 3284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { /* check D */ 3294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (block_x && block_y) 3304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = 1; 3324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = currMB->ref_idx_L0[(block_y_1 & 2) + (block_x_1 >> 1)]; 3334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(currMB->mvL0 + (block_y_1 << 2) + block_x_1); 3344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (block_y) 3384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = video->mbAvailA; 3404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 3414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = MB_A->ref_idx_L0[(block_y_1 & 2) + 1]; 3434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_A->mvL0 + (block_y_1 << 2) + 3); 3444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (block_x) 3494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = video->mbAvailB; 3514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 3524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = MB_B->ref_idx_L0[2 + (block_x_1 >> 1)]; 3544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_B->mvL0 + 12 + block_x_1); 3554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 3604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber avail_c = video->mbAvailD; 3624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_c) 3634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber refIdxLXC = MB_D->ref_idx_L0[3]; 3654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(MB_D->mvL0 + 15); 3664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_x = *mv++; 3674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_C_y = *mv; 3684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3724a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3734a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber offset_indx = currMB->SubMbPartWidth[mbPartIdx] >> 3; 3744a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3754a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber curr_ref_idx = currMB->ref_idx_L0[(block_y & 2) + (block_x >> 1)]; 3764a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 3774a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (avail_a && !(avail_b || avail_c)) 3784a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3794a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_A_x; 3804a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_A_y; 3814a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3824a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (((curr_ref_idx == refIdxLXA) + (curr_ref_idx == refIdxLXB) + (curr_ref_idx == refIdxLXC)) == 1) 3834a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3844a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (curr_ref_idx == refIdxLXA) 3854a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3864a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_A_x; 3874a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_A_y; 3884a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3894a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (curr_ref_idx == refIdxLXB) 3904a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3914a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_B_x; 3924a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_B_y; 3934a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3944a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 3954a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 3964a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_C_x; 3974a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_C_y; 3984a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 3994a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4004a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 4014a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4024a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = AVC_MEDIAN(pmv_A_x, pmv_B_x, pmv_C_x); 4034a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = AVC_MEDIAN(pmv_A_y, pmv_B_y, pmv_C_y); 4044a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4054a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4064a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber /* overwrite if special case */ 4074a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (currMB->NumMbPart == 2) 4084a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4094a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (currMB->MbPartWidth == 16) 4104a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4114a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (mbPartIdx == 0) 4124a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4134a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (refIdxLXB == curr_ref_idx) 4144a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4154a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_B_x; 4164a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_B_y; 4174a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4184a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4194a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (refIdxLXA == curr_ref_idx) 4204a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4214a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_A_x; 4224a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_A_y; 4234a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4244a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4254a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else 4264a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4274a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (mbPartIdx == 0) 4284a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4294a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (refIdxLXA == curr_ref_idx) 4304a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4314a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_A_x; 4324a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_A_y; 4334a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4344a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4354a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else if (refIdxLXC == curr_ref_idx) 4364a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4374a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x = pmv_C_x; 4384a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y = pmv_C_y; 4394a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4404a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4414a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4424a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4434a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv = (int16*)(currMB->mvL0 + block_x + (block_y << 2)); 4444a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4454a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber if (encFlag) /* calculate residual MV video->mvd_l0 */ 4464a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4474a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mvd_l0[mbPartIdx][subMbPartIdx][0] = *mv++ - pmv_x; 4484a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber video->mvd_l0[mbPartIdx][subMbPartIdx][1] = *mv++ - pmv_y; 4494a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4504a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber else /* calculate original MV currMB->mvL0 */ 4514a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4524a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_x += video->mvd_l0[mbPartIdx][subMbPartIdx][0]; 4534a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber pmv_y += video->mvd_l0[mbPartIdx][subMbPartIdx][1]; 4544a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4554a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (i = 0; i < nmSubMbHeight; i++) 4564a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4574a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber for (j = 0; j < nmSubMbWidth; j++) 4584a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber { 4594a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *mv++ = pmv_x; 4604a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber *mv++ = pmv_y; 4614a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4624a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber mv += (8 - (j << 1)); 4634a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4644a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4654a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4664a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber offset_MbPart_indx = currMB->MbPartWidth >> 4; 4674a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4684a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber } 4694a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber} 4704a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 4714a0ec3fda9c0e8e74b36e4e201b65ced80263b1fAndreas Huber 472