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