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