xref: /aosp_15_r20/external/libhevc/decoder/ihevcd_mv_pred.c (revision c83a76b084498d55f252f48b2e3786804cdf24b7)
1*c83a76b0SSuyog Pawar /******************************************************************************
2*c83a76b0SSuyog Pawar *
3*c83a76b0SSuyog Pawar * Copyright (C) 2012 Ittiam Systems Pvt Ltd, Bangalore
4*c83a76b0SSuyog Pawar *
5*c83a76b0SSuyog Pawar * Licensed under the Apache License, Version 2.0 (the "License");
6*c83a76b0SSuyog Pawar * you may not use this file except in compliance with the License.
7*c83a76b0SSuyog Pawar * You may obtain a copy of the License at:
8*c83a76b0SSuyog Pawar *
9*c83a76b0SSuyog Pawar * http://www.apache.org/licenses/LICENSE-2.0
10*c83a76b0SSuyog Pawar *
11*c83a76b0SSuyog Pawar * Unless required by applicable law or agreed to in writing, software
12*c83a76b0SSuyog Pawar * distributed under the License is distributed on an "AS IS" BASIS,
13*c83a76b0SSuyog Pawar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*c83a76b0SSuyog Pawar * See the License for the specific language governing permissions and
15*c83a76b0SSuyog Pawar * limitations under the License.
16*c83a76b0SSuyog Pawar *
17*c83a76b0SSuyog Pawar ******************************************************************************/
18*c83a76b0SSuyog Pawar /**
19*c83a76b0SSuyog Pawar  *******************************************************************************
20*c83a76b0SSuyog Pawar  * @file
21*c83a76b0SSuyog Pawar  *  ihevcd_mv_pred.c
22*c83a76b0SSuyog Pawar  *
23*c83a76b0SSuyog Pawar  * @brief
24*c83a76b0SSuyog Pawar  *  Contains functions for motion vector prediction
25*c83a76b0SSuyog Pawar  *
26*c83a76b0SSuyog Pawar  * @author
27*c83a76b0SSuyog Pawar  *  Ittiam
28*c83a76b0SSuyog Pawar  *
29*c83a76b0SSuyog Pawar  * @par List of Functions:
30*c83a76b0SSuyog Pawar  * - ihevcd_scale_mv()
31*c83a76b0SSuyog Pawar  * - ihevcd_mv_pred()
32*c83a76b0SSuyog Pawar  *
33*c83a76b0SSuyog Pawar  * @remarks
34*c83a76b0SSuyog Pawar  *  None
35*c83a76b0SSuyog Pawar  *
36*c83a76b0SSuyog Pawar  *******************************************************************************
37*c83a76b0SSuyog Pawar  */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar /* File Includes                                                             */
40*c83a76b0SSuyog Pawar /*****************************************************************************/
41*c83a76b0SSuyog Pawar 
42*c83a76b0SSuyog Pawar #include <stdio.h>
43*c83a76b0SSuyog Pawar #include <stddef.h>
44*c83a76b0SSuyog Pawar #include <stdlib.h>
45*c83a76b0SSuyog Pawar #include <string.h>
46*c83a76b0SSuyog Pawar 
47*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
48*c83a76b0SSuyog Pawar #include "iv.h"
49*c83a76b0SSuyog Pawar #include "ivd.h"
50*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
51*c83a76b0SSuyog Pawar #include "ithread.h"
52*c83a76b0SSuyog Pawar 
53*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
54*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
55*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
56*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
57*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
58*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
59*c83a76b0SSuyog Pawar #include "ihevc_disp_mgr.h"
60*c83a76b0SSuyog Pawar #include "ihevc_buf_mgr.h"
61*c83a76b0SSuyog Pawar #include "ihevc_dpb_mgr.h"
62*c83a76b0SSuyog Pawar 
63*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
64*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
65*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
66*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
67*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
68*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_fmt_conv.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_debug.h"
72*c83a76b0SSuyog Pawar #include "ihevcd_mv_merge.h"
73*c83a76b0SSuyog Pawar 
74*c83a76b0SSuyog Pawar /**
75*c83a76b0SSuyog Pawar  *******************************************************************************
76*c83a76b0SSuyog Pawar  *
77*c83a76b0SSuyog Pawar  * @brief Function scaling motion vector
78*c83a76b0SSuyog Pawar  *
79*c83a76b0SSuyog Pawar  *
80*c83a76b0SSuyog Pawar  * @par Description:
81*c83a76b0SSuyog Pawar  *   Scales mv based on difference between current POC and current
82*c83a76b0SSuyog Pawar  *   reference POC and neighbour reference poc
83*c83a76b0SSuyog Pawar  *
84*c83a76b0SSuyog Pawar  * @param[inout] mv
85*c83a76b0SSuyog Pawar  *   motion vector to be scaled
86*c83a76b0SSuyog Pawar  *
87*c83a76b0SSuyog Pawar  * @param[in] cur_ref_poc
88*c83a76b0SSuyog Pawar  *   Current PU refernce pic poc
89*c83a76b0SSuyog Pawar  *
90*c83a76b0SSuyog Pawar  * @param[in] nbr_ref_poc
91*c83a76b0SSuyog Pawar  *   Neighbor PU reference pic poc
92*c83a76b0SSuyog Pawar  *
93*c83a76b0SSuyog Pawar  * @param[in] cur_poc
94*c83a76b0SSuyog Pawar  *   Picture order count of current pic
95*c83a76b0SSuyog Pawar  *
96*c83a76b0SSuyog Pawar  * @returns
97*c83a76b0SSuyog Pawar  *  None
98*c83a76b0SSuyog Pawar  *
99*c83a76b0SSuyog Pawar  * @remarks
100*c83a76b0SSuyog Pawar  *
101*c83a76b0SSuyog Pawar  *******************************************************************************
102*c83a76b0SSuyog Pawar  */
ihevcd_scale_mv(mv_t * ps_mv,WORD32 cur_ref_poc,WORD32 nbr_ref_poc,WORD32 cur_poc)103*c83a76b0SSuyog Pawar void ihevcd_scale_mv(mv_t *ps_mv,
104*c83a76b0SSuyog Pawar                      WORD32 cur_ref_poc,
105*c83a76b0SSuyog Pawar                      WORD32 nbr_ref_poc,
106*c83a76b0SSuyog Pawar                      WORD32 cur_poc)
107*c83a76b0SSuyog Pawar {
108*c83a76b0SSuyog Pawar     WORD32 td, tb, tx;
109*c83a76b0SSuyog Pawar     WORD32 dist_scale_factor;
110*c83a76b0SSuyog Pawar     WORD32 mvx, mvy;
111*c83a76b0SSuyog Pawar 
112*c83a76b0SSuyog Pawar     td = CLIP_S8(cur_poc - nbr_ref_poc);
113*c83a76b0SSuyog Pawar     tb = CLIP_S8(cur_poc - cur_ref_poc);
114*c83a76b0SSuyog Pawar 
115*c83a76b0SSuyog Pawar     if(0 != td)
116*c83a76b0SSuyog Pawar     {
117*c83a76b0SSuyog Pawar         tx = (16384 + (abs(td) >> 1)) / td;
118*c83a76b0SSuyog Pawar 
119*c83a76b0SSuyog Pawar         dist_scale_factor = (tb * tx + 32) >> 6;
120*c83a76b0SSuyog Pawar         dist_scale_factor = CLIP3(dist_scale_factor, -4096, 4095);
121*c83a76b0SSuyog Pawar 
122*c83a76b0SSuyog Pawar         mvx = ps_mv->i2_mvx;
123*c83a76b0SSuyog Pawar         mvy = ps_mv->i2_mvy;
124*c83a76b0SSuyog Pawar 
125*c83a76b0SSuyog Pawar         mvx = SIGN(dist_scale_factor * mvx)
126*c83a76b0SSuyog Pawar                         * ((abs(dist_scale_factor * mvx) + 127) >> 8);
127*c83a76b0SSuyog Pawar         mvy = SIGN(dist_scale_factor * mvy)
128*c83a76b0SSuyog Pawar                         * ((abs(dist_scale_factor * mvy) + 127) >> 8);
129*c83a76b0SSuyog Pawar 
130*c83a76b0SSuyog Pawar         ps_mv->i2_mvx = CLIP_S16(mvx);
131*c83a76b0SSuyog Pawar         ps_mv->i2_mvy = CLIP_S16(mvy);
132*c83a76b0SSuyog Pawar     }
133*c83a76b0SSuyog Pawar }
134*c83a76b0SSuyog Pawar 
135*c83a76b0SSuyog Pawar /**
136*c83a76b0SSuyog Pawar  *******************************************************************************
137*c83a76b0SSuyog Pawar  *
138*c83a76b0SSuyog Pawar  * @brief Function scaling temporal motion vector
139*c83a76b0SSuyog Pawar  *
140*c83a76b0SSuyog Pawar  *
141*c83a76b0SSuyog Pawar  * @par Description:
142*c83a76b0SSuyog Pawar  *   Scales mv based on difference between current POC and current
143*c83a76b0SSuyog Pawar  *   reference POC and neighbour reference poc
144*c83a76b0SSuyog Pawar  *
145*c83a76b0SSuyog Pawar  * @param[inout] mv
146*c83a76b0SSuyog Pawar  *   motion vector to be scaled
147*c83a76b0SSuyog Pawar  *
148*c83a76b0SSuyog Pawar  * @param[in] cur_ref_poc
149*c83a76b0SSuyog Pawar  *   Current PU refernce pic poc
150*c83a76b0SSuyog Pawar  *
151*c83a76b0SSuyog Pawar  * @param[in] nbr_ref_poc
152*c83a76b0SSuyog Pawar  *   Neighbor PU reference pic poc
153*c83a76b0SSuyog Pawar  *
154*c83a76b0SSuyog Pawar  * @param[in] cur_poc
155*c83a76b0SSuyog Pawar  *   Picture order count of current pic
156*c83a76b0SSuyog Pawar  *
157*c83a76b0SSuyog Pawar  * @returns
158*c83a76b0SSuyog Pawar  *  None
159*c83a76b0SSuyog Pawar  *
160*c83a76b0SSuyog Pawar  * @remarks
161*c83a76b0SSuyog Pawar  *
162*c83a76b0SSuyog Pawar  *******************************************************************************
163*c83a76b0SSuyog Pawar  */
ihevcd_scale_collocated_mv(mv_t * ps_mv,WORD32 cur_ref_poc,WORD32 col_ref_poc,WORD32 col_poc,WORD32 cur_poc)164*c83a76b0SSuyog Pawar void ihevcd_scale_collocated_mv(mv_t *ps_mv,
165*c83a76b0SSuyog Pawar                                 WORD32 cur_ref_poc,
166*c83a76b0SSuyog Pawar                                 WORD32 col_ref_poc,
167*c83a76b0SSuyog Pawar                                 WORD32 col_poc,
168*c83a76b0SSuyog Pawar                                 WORD32 cur_poc)
169*c83a76b0SSuyog Pawar {
170*c83a76b0SSuyog Pawar     WORD32 td, tb, tx;
171*c83a76b0SSuyog Pawar     WORD32 dist_scale_factor;
172*c83a76b0SSuyog Pawar     WORD32 mvx, mvy;
173*c83a76b0SSuyog Pawar 
174*c83a76b0SSuyog Pawar     td = CLIP_S8(col_poc - col_ref_poc);
175*c83a76b0SSuyog Pawar     tb = CLIP_S8(cur_poc - cur_ref_poc);
176*c83a76b0SSuyog Pawar 
177*c83a76b0SSuyog Pawar     tx = (16384 + (abs(td) >> 1)) / td;
178*c83a76b0SSuyog Pawar 
179*c83a76b0SSuyog Pawar     dist_scale_factor = (tb * tx + 32) >> 6;
180*c83a76b0SSuyog Pawar     dist_scale_factor = CLIP3(dist_scale_factor, -4096, 4095);
181*c83a76b0SSuyog Pawar 
182*c83a76b0SSuyog Pawar     mvx = ps_mv->i2_mvx;
183*c83a76b0SSuyog Pawar     mvy = ps_mv->i2_mvy;
184*c83a76b0SSuyog Pawar 
185*c83a76b0SSuyog Pawar     mvx = SIGN(dist_scale_factor * mvx)
186*c83a76b0SSuyog Pawar                     * ((abs(dist_scale_factor * mvx) + 127) >> 8);
187*c83a76b0SSuyog Pawar     mvy = SIGN(dist_scale_factor * mvy)
188*c83a76b0SSuyog Pawar                     * ((abs(dist_scale_factor * mvy) + 127) >> 8);
189*c83a76b0SSuyog Pawar 
190*c83a76b0SSuyog Pawar     ps_mv->i2_mvx = CLIP_S16(mvx);
191*c83a76b0SSuyog Pawar     ps_mv->i2_mvy = CLIP_S16(mvy);
192*c83a76b0SSuyog Pawar }
193*c83a76b0SSuyog Pawar 
194*c83a76b0SSuyog Pawar #define CHECK_NBR_MV_ST(pi4_avail_flag, cur_ref_poc, u1_nbr_pred_flag, nbr_ref_poc,         \
195*c83a76b0SSuyog Pawar                         ps_mv, ps_nbr_mv )                                                  \
196*c83a76b0SSuyog Pawar {                                                                                           \
197*c83a76b0SSuyog Pawar     if((u1_nbr_pred_flag) && (cur_ref_poc == nbr_ref_poc))                                  \
198*c83a76b0SSuyog Pawar     {                                                                                       \
199*c83a76b0SSuyog Pawar         *pi4_avail_flag = 1;                                                                \
200*c83a76b0SSuyog Pawar         *ps_mv = *ps_nbr_mv;                                                                \
201*c83a76b0SSuyog Pawar         break ;                                                                             \
202*c83a76b0SSuyog Pawar     }                                                                                       \
203*c83a76b0SSuyog Pawar }
204*c83a76b0SSuyog Pawar #define CHECK_NBR_MV_LT(pi4_avail_flag, u1_cur_ref_lt, cur_poc, cur_ref_poc,                 \
205*c83a76b0SSuyog Pawar                       u1_nbr_pred_flag, u1_nbr_ref_lt, nbr_ref_poc,                          \
206*c83a76b0SSuyog Pawar                       ps_mv, ps_nbr_mv )                                                     \
207*c83a76b0SSuyog Pawar {                                                                                            \
208*c83a76b0SSuyog Pawar     WORD32 cur_lt, nbr_lt;                                                                   \
209*c83a76b0SSuyog Pawar     cur_lt = (LONG_TERM_REF == (u1_cur_ref_lt));                                             \
210*c83a76b0SSuyog Pawar     nbr_lt = (LONG_TERM_REF == (u1_nbr_ref_lt));                                             \
211*c83a76b0SSuyog Pawar     if((u1_nbr_pred_flag) && (cur_lt == nbr_lt))                                             \
212*c83a76b0SSuyog Pawar     {                                                                                        \
213*c83a76b0SSuyog Pawar         *pi4_avail_flag = 1;                                                                 \
214*c83a76b0SSuyog Pawar         *ps_mv = *ps_nbr_mv;                                                                 \
215*c83a76b0SSuyog Pawar         if(SHORT_TERM_REF == u1_nbr_ref_lt)                                                  \
216*c83a76b0SSuyog Pawar         {                                                                                    \
217*c83a76b0SSuyog Pawar             ihevcd_scale_mv(ps_mv, cur_ref_poc, nbr_ref_poc,                                 \
218*c83a76b0SSuyog Pawar                                                 cur_poc);                                    \
219*c83a76b0SSuyog Pawar         }                                                                                    \
220*c83a76b0SSuyog Pawar         break ;                                                                              \
221*c83a76b0SSuyog Pawar     }                                                                                        \
222*c83a76b0SSuyog Pawar }
223*c83a76b0SSuyog Pawar 
224*c83a76b0SSuyog Pawar 
GET_MV_NBR_ST(ref_list_t ** ps_ref_pic_list,WORD32 * pi4_avail_flag,pic_buf_t * ps_cur_pic_buf_lx,pu_t ** aps_nbr_pu,mv_t * ps_mv,WORD32 num_nbrs,WORD32 lx)225*c83a76b0SSuyog Pawar void GET_MV_NBR_ST(ref_list_t **ps_ref_pic_list, WORD32 *pi4_avail_flag, pic_buf_t *ps_cur_pic_buf_lx, pu_t **aps_nbr_pu, mv_t *ps_mv, WORD32 num_nbrs, WORD32 lx)
226*c83a76b0SSuyog Pawar {
227*c83a76b0SSuyog Pawar     WORD32 i, nbr_pred_lx;
228*c83a76b0SSuyog Pawar     pic_buf_t *ps_nbr_pic_buf_lx;
229*c83a76b0SSuyog Pawar     /* Short Term */
230*c83a76b0SSuyog Pawar     /* L0 */
231*c83a76b0SSuyog Pawar     if(0 == lx)
232*c83a76b0SSuyog Pawar     {
233*c83a76b0SSuyog Pawar         for(i = 0; i < num_nbrs; i++)
234*c83a76b0SSuyog Pawar         {
235*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L1 != aps_nbr_pu[i]->b2_pred_mode);
236*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[0][aps_nbr_pu[i]->mv.i1_l0_ref_idx].pv_pic_buf));
237*c83a76b0SSuyog Pawar             CHECK_NBR_MV_ST(pi4_avail_flag, ps_cur_pic_buf_lx->i4_abs_poc, nbr_pred_lx,
238*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->i4_abs_poc, ps_mv, &aps_nbr_pu[i]->mv.s_l0_mv);
239*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L0 != aps_nbr_pu[i]->b2_pred_mode);
240*c83a76b0SSuyog Pawar 
241*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L0 != aps_nbr_pu[i]->b2_pred_mode);
242*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[1][aps_nbr_pu[i]->mv.i1_l1_ref_idx].pv_pic_buf));
243*c83a76b0SSuyog Pawar             CHECK_NBR_MV_ST(pi4_avail_flag, ps_cur_pic_buf_lx->i4_abs_poc, nbr_pred_lx,
244*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->i4_abs_poc, ps_mv, &aps_nbr_pu[i]->mv.s_l1_mv);
245*c83a76b0SSuyog Pawar         }
246*c83a76b0SSuyog Pawar     }
247*c83a76b0SSuyog Pawar     /* L1 */
248*c83a76b0SSuyog Pawar     else
249*c83a76b0SSuyog Pawar     {
250*c83a76b0SSuyog Pawar         for(i = 0; i < num_nbrs; i++)
251*c83a76b0SSuyog Pawar         {
252*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L0 != aps_nbr_pu[i]->b2_pred_mode);
253*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[1][aps_nbr_pu[i]->mv.i1_l1_ref_idx].pv_pic_buf));
254*c83a76b0SSuyog Pawar             CHECK_NBR_MV_ST(pi4_avail_flag, ps_cur_pic_buf_lx->i4_abs_poc, nbr_pred_lx,
255*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->i4_abs_poc, ps_mv, &aps_nbr_pu[i]->mv.s_l1_mv);
256*c83a76b0SSuyog Pawar 
257*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L1 != aps_nbr_pu[i]->b2_pred_mode);
258*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[0][aps_nbr_pu[i]->mv.i1_l0_ref_idx].pv_pic_buf));
259*c83a76b0SSuyog Pawar             CHECK_NBR_MV_ST(pi4_avail_flag, ps_cur_pic_buf_lx->i4_abs_poc, nbr_pred_lx,
260*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->i4_abs_poc, ps_mv, &aps_nbr_pu[i]->mv.s_l0_mv);
261*c83a76b0SSuyog Pawar         }
262*c83a76b0SSuyog Pawar     }
263*c83a76b0SSuyog Pawar }
264*c83a76b0SSuyog Pawar 
GET_MV_NBR_LT(ref_list_t ** ps_ref_pic_list,slice_header_t * ps_slice_hdr,WORD32 * pi4_avail_flag,pic_buf_t * ps_cur_pic_buf_lx,pu_t ** aps_nbr_pu,mv_t * ps_mv,WORD32 num_nbrs,WORD32 lx)265*c83a76b0SSuyog Pawar void GET_MV_NBR_LT(ref_list_t **ps_ref_pic_list, slice_header_t *ps_slice_hdr, WORD32 *pi4_avail_flag, pic_buf_t *ps_cur_pic_buf_lx, pu_t **aps_nbr_pu, mv_t *ps_mv, WORD32 num_nbrs, WORD32 lx)
266*c83a76b0SSuyog Pawar {
267*c83a76b0SSuyog Pawar     WORD32 i, nbr_pred_lx;
268*c83a76b0SSuyog Pawar     pic_buf_t *ps_nbr_pic_buf_lx;
269*c83a76b0SSuyog Pawar     /* Long Term*/
270*c83a76b0SSuyog Pawar     /* L0 */
271*c83a76b0SSuyog Pawar     if(0 == lx)
272*c83a76b0SSuyog Pawar     {
273*c83a76b0SSuyog Pawar         for(i = 0; i < num_nbrs; i++)
274*c83a76b0SSuyog Pawar         {
275*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L1 != aps_nbr_pu[i]->b2_pred_mode);
276*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[0][aps_nbr_pu[i]->mv.i1_l0_ref_idx].pv_pic_buf));
277*c83a76b0SSuyog Pawar             CHECK_NBR_MV_LT(pi4_avail_flag, ps_cur_pic_buf_lx->u1_used_as_ref, ps_slice_hdr->i4_abs_pic_order_cnt, ps_cur_pic_buf_lx->i4_abs_poc,
278*c83a76b0SSuyog Pawar                             nbr_pred_lx,
279*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->u1_used_as_ref, ps_nbr_pic_buf_lx->i4_abs_poc,
280*c83a76b0SSuyog Pawar                             ps_mv, &aps_nbr_pu[i]->mv.s_l0_mv);
281*c83a76b0SSuyog Pawar 
282*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L0 != aps_nbr_pu[i]->b2_pred_mode);
283*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[1][aps_nbr_pu[i]->mv.i1_l1_ref_idx].pv_pic_buf));
284*c83a76b0SSuyog Pawar             CHECK_NBR_MV_LT(pi4_avail_flag, ps_cur_pic_buf_lx->u1_used_as_ref, ps_slice_hdr->i4_abs_pic_order_cnt, ps_cur_pic_buf_lx->i4_abs_poc,
285*c83a76b0SSuyog Pawar                             nbr_pred_lx,
286*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->u1_used_as_ref, ps_nbr_pic_buf_lx->i4_abs_poc,
287*c83a76b0SSuyog Pawar                             ps_mv, &aps_nbr_pu[i]->mv.s_l1_mv);
288*c83a76b0SSuyog Pawar         }
289*c83a76b0SSuyog Pawar     }
290*c83a76b0SSuyog Pawar     /* L1 */
291*c83a76b0SSuyog Pawar     else
292*c83a76b0SSuyog Pawar     {
293*c83a76b0SSuyog Pawar         for(i = 0; i < num_nbrs; i++)
294*c83a76b0SSuyog Pawar         {
295*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L0 != aps_nbr_pu[i]->b2_pred_mode);
296*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[1][aps_nbr_pu[i]->mv.i1_l1_ref_idx].pv_pic_buf));
297*c83a76b0SSuyog Pawar             CHECK_NBR_MV_LT(pi4_avail_flag, ps_cur_pic_buf_lx->u1_used_as_ref, ps_slice_hdr->i4_abs_pic_order_cnt, ps_cur_pic_buf_lx->i4_abs_poc,
298*c83a76b0SSuyog Pawar                             nbr_pred_lx,
299*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->u1_used_as_ref, ps_nbr_pic_buf_lx->i4_abs_poc,
300*c83a76b0SSuyog Pawar                             ps_mv, &aps_nbr_pu[i]->mv.s_l1_mv);
301*c83a76b0SSuyog Pawar 
302*c83a76b0SSuyog Pawar             nbr_pred_lx = (PRED_L1 != aps_nbr_pu[i]->b2_pred_mode);
303*c83a76b0SSuyog Pawar             ps_nbr_pic_buf_lx = (pic_buf_t *)((ps_ref_pic_list[0][aps_nbr_pu[i]->mv.i1_l0_ref_idx].pv_pic_buf));
304*c83a76b0SSuyog Pawar             CHECK_NBR_MV_LT(pi4_avail_flag, ps_cur_pic_buf_lx->u1_used_as_ref, ps_slice_hdr->i4_abs_pic_order_cnt, ps_cur_pic_buf_lx->i4_abs_poc,
305*c83a76b0SSuyog Pawar                             nbr_pred_lx,
306*c83a76b0SSuyog Pawar                             ps_nbr_pic_buf_lx->u1_used_as_ref, ps_nbr_pic_buf_lx->i4_abs_poc,
307*c83a76b0SSuyog Pawar                             ps_mv, &aps_nbr_pu[i]->mv.s_l0_mv);
308*c83a76b0SSuyog Pawar         }
309*c83a76b0SSuyog Pawar     }
310*c83a76b0SSuyog Pawar }
311*c83a76b0SSuyog Pawar /**
312*c83a76b0SSuyog Pawar  *******************************************************************************
313*c83a76b0SSuyog Pawar  *
314*c83a76b0SSuyog Pawar  * @brief
315*c83a76b0SSuyog Pawar  * This function performs Motion Vector prediction and return a list of mv
316*c83a76b0SSuyog Pawar  *
317*c83a76b0SSuyog Pawar  * @par Description:
318*c83a76b0SSuyog Pawar  *  MV predictor list is computed using neighbor mvs and colocated mv
319*c83a76b0SSuyog Pawar  *
320*c83a76b0SSuyog Pawar  * @param[in] ps_ctxt
321*c83a76b0SSuyog Pawar  * pointer to mv predictor context
322*c83a76b0SSuyog Pawar  *
323*c83a76b0SSuyog Pawar  * @param[in] ps_top_nbr_4x4
324*c83a76b0SSuyog Pawar  * pointer to top 4x4 nbr structure
325*c83a76b0SSuyog Pawar  *
326*c83a76b0SSuyog Pawar  * @param[in] ps_left_nbr_4x4
327*c83a76b0SSuyog Pawar  * pointer to left 4x4 nbr structure
328*c83a76b0SSuyog Pawar  *
329*c83a76b0SSuyog Pawar  * @param[in] ps_top_left_nbr_4x4
330*c83a76b0SSuyog Pawar  * pointer to top left 4x4 nbr structure
331*c83a76b0SSuyog Pawar  *
332*c83a76b0SSuyog Pawar  * @param[in] left_nbr_4x4_strd
333*c83a76b0SSuyog Pawar  * left nbr buffer stride in terms of 4x4 units
334*c83a76b0SSuyog Pawar  *
335*c83a76b0SSuyog Pawar  * @param[in] ps_avail_flags
336*c83a76b0SSuyog Pawar  * Neighbor availability flags container
337*c83a76b0SSuyog Pawar  *
338*c83a76b0SSuyog Pawar  * @param[in] ps_col_mv
339*c83a76b0SSuyog Pawar  * Colocated MV pointer
340*c83a76b0SSuyog Pawar  *
341*c83a76b0SSuyog Pawar  * @param[in] ps_pu
342*c83a76b0SSuyog Pawar  * Current Partition PU strucrture pointer
343*c83a76b0SSuyog Pawar  *
344*c83a76b0SSuyog Pawar  * @param[inout] ps_pred_mv
345*c83a76b0SSuyog Pawar  * pointer to store predicted MV list
346*c83a76b0SSuyog Pawar  *
347*c83a76b0SSuyog Pawar  * @returns
348*c83a76b0SSuyog Pawar  * None
349*c83a76b0SSuyog Pawar  * @remarks
350*c83a76b0SSuyog Pawar  *
351*c83a76b0SSuyog Pawar  *
352*c83a76b0SSuyog Pawar  *******************************************************************************
353*c83a76b0SSuyog Pawar  */
ihevcd_mv_pred(mv_ctxt_t * ps_mv_ctxt,UWORD32 * pu4_top_pu_idx,UWORD32 * pu4_left_pu_idx,UWORD32 * pu4_top_left_pu_idx,WORD32 left_nbr_4x4_strd,pu_t * ps_pu,WORD32 lb_avail,WORD32 l_avail,WORD32 tr_avail,WORD32 t_avail,WORD32 tl_avail,pu_mv_t * ps_pred_mv)354*c83a76b0SSuyog Pawar void ihevcd_mv_pred(mv_ctxt_t *ps_mv_ctxt,
355*c83a76b0SSuyog Pawar                     UWORD32 *pu4_top_pu_idx,
356*c83a76b0SSuyog Pawar                     UWORD32 *pu4_left_pu_idx,
357*c83a76b0SSuyog Pawar                     UWORD32 *pu4_top_left_pu_idx,
358*c83a76b0SSuyog Pawar                     WORD32 left_nbr_4x4_strd,
359*c83a76b0SSuyog Pawar                     pu_t *ps_pu,
360*c83a76b0SSuyog Pawar                     WORD32 lb_avail,
361*c83a76b0SSuyog Pawar                     WORD32 l_avail,
362*c83a76b0SSuyog Pawar                     WORD32 tr_avail,
363*c83a76b0SSuyog Pawar                     WORD32 t_avail,
364*c83a76b0SSuyog Pawar                     WORD32 tl_avail,
365*c83a76b0SSuyog Pawar                     pu_mv_t *ps_pred_mv)
366*c83a76b0SSuyog Pawar {
367*c83a76b0SSuyog Pawar     slice_header_t *ps_slice_hdr;
368*c83a76b0SSuyog Pawar     ref_list_t *ps_ref_pic_list[2];
369*c83a76b0SSuyog Pawar     pu_t *ps_pic_pu;
370*c83a76b0SSuyog Pawar     WORD32 max_l0_mvp_cand, max_l1_mvp_cand;
371*c83a76b0SSuyog Pawar     WORD32 l0_done_flag, l1_done_flag;
372*c83a76b0SSuyog Pawar     WORD32 num_l0_mvp_cand, num_l1_mvp_cand;
373*c83a76b0SSuyog Pawar     WORD32 is_scaled_flag_list /* Indicates whether A0 or A1 is available */;
374*c83a76b0SSuyog Pawar     WORD32 avail_a_flag[2];
375*c83a76b0SSuyog Pawar     mv_t as_mv_a[2];
376*c83a76b0SSuyog Pawar     WORD32 part_pos_x;
377*c83a76b0SSuyog Pawar     WORD32 part_pos_y;
378*c83a76b0SSuyog Pawar     WORD32 part_wd;
379*c83a76b0SSuyog Pawar     WORD32 part_ht;
380*c83a76b0SSuyog Pawar     pic_buf_t *ps_cur_pic_buf_l0, *ps_cur_pic_buf_l1;
381*c83a76b0SSuyog Pawar     WORD32 nbr_avail[3]; /*[A0/A1] */ /* [B0/B1/B2] */
382*c83a76b0SSuyog Pawar     pu_t *aps_nbr_pu[3];  /*[A0/A1] */ /* [B0/B1/B2] */
383*c83a76b0SSuyog Pawar     WORD32 num_nbrs = 0;
384*c83a76b0SSuyog Pawar 
385*c83a76b0SSuyog Pawar     /*******************************************/
386*c83a76b0SSuyog Pawar     /* Neighbor location: Graphical indication */
387*c83a76b0SSuyog Pawar     /*                                         */
388*c83a76b0SSuyog Pawar     /*          B2 _____________B1 B0          */
389*c83a76b0SSuyog Pawar     /*            |               |            */
390*c83a76b0SSuyog Pawar     /*            |               |            */
391*c83a76b0SSuyog Pawar     /*            |               |            */
392*c83a76b0SSuyog Pawar     /*            |      PU     ht|            */
393*c83a76b0SSuyog Pawar     /*            |               |            */
394*c83a76b0SSuyog Pawar     /*            |               |            */
395*c83a76b0SSuyog Pawar     /*          A1|______wd_______|            */
396*c83a76b0SSuyog Pawar     /*          A0                             */
397*c83a76b0SSuyog Pawar     /*                                         */
398*c83a76b0SSuyog Pawar     /*******************************************/
399*c83a76b0SSuyog Pawar 
400*c83a76b0SSuyog Pawar     ps_slice_hdr = ps_mv_ctxt->ps_slice_hdr;
401*c83a76b0SSuyog Pawar     ps_pic_pu = ps_mv_ctxt->ps_pic_pu;
402*c83a76b0SSuyog Pawar     max_l0_mvp_cand = ps_pu->b1_l0_mvp_idx + 1;
403*c83a76b0SSuyog Pawar     max_l1_mvp_cand = ps_pu->b1_l1_mvp_idx + 1;
404*c83a76b0SSuyog Pawar     num_l0_mvp_cand = 0;
405*c83a76b0SSuyog Pawar     num_l1_mvp_cand = 0;
406*c83a76b0SSuyog Pawar 
407*c83a76b0SSuyog Pawar     /* Initializing reference list */
408*c83a76b0SSuyog Pawar     ps_ref_pic_list[0] = ps_slice_hdr->as_ref_pic_list0;
409*c83a76b0SSuyog Pawar     ps_ref_pic_list[1] = ps_slice_hdr->as_ref_pic_list1;
410*c83a76b0SSuyog Pawar     if(PSLICE == ps_slice_hdr->i1_slice_type)
411*c83a76b0SSuyog Pawar         ps_ref_pic_list[1] = ps_slice_hdr->as_ref_pic_list0;
412*c83a76b0SSuyog Pawar 
413*c83a76b0SSuyog Pawar     ps_cur_pic_buf_l0 = (pic_buf_t *)((ps_ref_pic_list[0][ps_pu->mv.i1_l0_ref_idx].pv_pic_buf));
414*c83a76b0SSuyog Pawar     ps_cur_pic_buf_l1 = (pic_buf_t *)((ps_ref_pic_list[1][ps_pu->mv.i1_l1_ref_idx].pv_pic_buf));
415*c83a76b0SSuyog Pawar 
416*c83a76b0SSuyog Pawar     is_scaled_flag_list = 0;
417*c83a76b0SSuyog Pawar 
418*c83a76b0SSuyog Pawar     part_pos_x = ps_pu->b4_pos_x << 2;
419*c83a76b0SSuyog Pawar     part_pos_y = ps_pu->b4_pos_y << 2;
420*c83a76b0SSuyog Pawar     part_wd = (ps_pu->b4_wd + 1) << 2;
421*c83a76b0SSuyog Pawar     part_ht = (ps_pu->b4_ht + 1) << 2;
422*c83a76b0SSuyog Pawar 
423*c83a76b0SSuyog Pawar     /************************************************************/
424*c83a76b0SSuyog Pawar     /* Calculating of motion vector A from neighbors A0 and A1  */
425*c83a76b0SSuyog Pawar     /************************************************************/
426*c83a76b0SSuyog Pawar     {
427*c83a76b0SSuyog Pawar         nbr_avail[0] = 0;
428*c83a76b0SSuyog Pawar         nbr_avail[1] = 0;
429*c83a76b0SSuyog Pawar 
430*c83a76b0SSuyog Pawar         /* Pointers to A0 and A1 */
431*c83a76b0SSuyog Pawar         {
432*c83a76b0SSuyog Pawar             WORD32 y_a0, y_a1;
433*c83a76b0SSuyog Pawar             WORD32 pu_idx_a0, pu_idx_a1;
434*c83a76b0SSuyog Pawar 
435*c83a76b0SSuyog Pawar             /* TODO: y_a0, y_a1 is coded assuming left nbr pointer starts at PU */
436*c83a76b0SSuyog Pawar             y_a0 = (part_ht >> 2);
437*c83a76b0SSuyog Pawar             y_a1 = ((part_ht - 1) >> 2);
438*c83a76b0SSuyog Pawar 
439*c83a76b0SSuyog Pawar             pu_idx_a0 = *(pu4_left_pu_idx + (y_a0 * left_nbr_4x4_strd));
440*c83a76b0SSuyog Pawar             pu_idx_a1 = *(pu4_left_pu_idx + (y_a1 * left_nbr_4x4_strd));
441*c83a76b0SSuyog Pawar 
442*c83a76b0SSuyog Pawar             if(lb_avail && (!ps_pic_pu[pu_idx_a0].b1_intra_flag))
443*c83a76b0SSuyog Pawar             {
444*c83a76b0SSuyog Pawar                 aps_nbr_pu[num_nbrs] = &ps_pic_pu[pu_idx_a0];
445*c83a76b0SSuyog Pawar                 num_nbrs++;
446*c83a76b0SSuyog Pawar                 nbr_avail[0] = 1;
447*c83a76b0SSuyog Pawar             }
448*c83a76b0SSuyog Pawar             if(l_avail && (!ps_pic_pu[pu_idx_a1].b1_intra_flag))
449*c83a76b0SSuyog Pawar             {
450*c83a76b0SSuyog Pawar                 aps_nbr_pu[num_nbrs] = &ps_pic_pu[pu_idx_a1];
451*c83a76b0SSuyog Pawar                 num_nbrs++;
452*c83a76b0SSuyog Pawar                 nbr_avail[1] = 1;
453*c83a76b0SSuyog Pawar             }
454*c83a76b0SSuyog Pawar         }
455*c83a76b0SSuyog Pawar         /* Setting is scaled flag based on availability of A0 and A1 */
456*c83a76b0SSuyog Pawar         if((nbr_avail[0] == 1) || (nbr_avail[1]))
457*c83a76b0SSuyog Pawar         {
458*c83a76b0SSuyog Pawar             is_scaled_flag_list = 1;
459*c83a76b0SSuyog Pawar         }
460*c83a76b0SSuyog Pawar 
461*c83a76b0SSuyog Pawar         avail_a_flag[0] = 0;
462*c83a76b0SSuyog Pawar         avail_a_flag[1] = 0;
463*c83a76b0SSuyog Pawar 
464*c83a76b0SSuyog Pawar         /* L0 */
465*c83a76b0SSuyog Pawar         GET_MV_NBR_ST(ps_ref_pic_list, &avail_a_flag[0], ps_cur_pic_buf_l0, aps_nbr_pu, &as_mv_a[0], num_nbrs, 0);
466*c83a76b0SSuyog Pawar         if(0 == avail_a_flag[0])
467*c83a76b0SSuyog Pawar         {
468*c83a76b0SSuyog Pawar             GET_MV_NBR_LT(ps_ref_pic_list, ps_slice_hdr, &avail_a_flag[0], ps_cur_pic_buf_l0, aps_nbr_pu, &as_mv_a[0], num_nbrs, 0);
469*c83a76b0SSuyog Pawar         }
470*c83a76b0SSuyog Pawar 
471*c83a76b0SSuyog Pawar         /* L1 */
472*c83a76b0SSuyog Pawar         if(PRED_L0 != ps_pu->b2_pred_mode)
473*c83a76b0SSuyog Pawar         {
474*c83a76b0SSuyog Pawar             GET_MV_NBR_ST(ps_ref_pic_list, &avail_a_flag[1], ps_cur_pic_buf_l1, aps_nbr_pu, &as_mv_a[1], num_nbrs, 1);
475*c83a76b0SSuyog Pawar             if(0 == avail_a_flag[1])
476*c83a76b0SSuyog Pawar             {
477*c83a76b0SSuyog Pawar                 GET_MV_NBR_LT(ps_ref_pic_list, ps_slice_hdr, &avail_a_flag[1], ps_cur_pic_buf_l1, aps_nbr_pu, &as_mv_a[1], num_nbrs, 1);
478*c83a76b0SSuyog Pawar             }
479*c83a76b0SSuyog Pawar         }
480*c83a76b0SSuyog Pawar 
481*c83a76b0SSuyog Pawar         l0_done_flag = (PRED_L1 == ps_pu->b2_pred_mode);
482*c83a76b0SSuyog Pawar         l1_done_flag = (PRED_L0 == ps_pu->b2_pred_mode);
483*c83a76b0SSuyog Pawar 
484*c83a76b0SSuyog Pawar         if(avail_a_flag[0])
485*c83a76b0SSuyog Pawar         {
486*c83a76b0SSuyog Pawar             num_l0_mvp_cand++;
487*c83a76b0SSuyog Pawar             if(max_l0_mvp_cand == num_l0_mvp_cand)
488*c83a76b0SSuyog Pawar             {
489*c83a76b0SSuyog Pawar                 ps_pred_mv->s_l0_mv = as_mv_a[0];
490*c83a76b0SSuyog Pawar                 l0_done_flag = 1;
491*c83a76b0SSuyog Pawar             }
492*c83a76b0SSuyog Pawar         }
493*c83a76b0SSuyog Pawar         if(avail_a_flag[1])
494*c83a76b0SSuyog Pawar         {
495*c83a76b0SSuyog Pawar             num_l1_mvp_cand++;
496*c83a76b0SSuyog Pawar             if(max_l1_mvp_cand == num_l1_mvp_cand)
497*c83a76b0SSuyog Pawar             {
498*c83a76b0SSuyog Pawar                 ps_pred_mv->s_l1_mv = as_mv_a[1];
499*c83a76b0SSuyog Pawar                 l1_done_flag = 1;
500*c83a76b0SSuyog Pawar             }
501*c83a76b0SSuyog Pawar         }
502*c83a76b0SSuyog Pawar         if(l0_done_flag && l1_done_flag)
503*c83a76b0SSuyog Pawar             return;
504*c83a76b0SSuyog Pawar     }
505*c83a76b0SSuyog Pawar 
506*c83a76b0SSuyog Pawar     /************************************************************/
507*c83a76b0SSuyog Pawar     /* Calculating of motion vector B from neighbors B0 and B1  */
508*c83a76b0SSuyog Pawar     /************************************************************/
509*c83a76b0SSuyog Pawar     {
510*c83a76b0SSuyog Pawar         WORD32 avail_b_flag[2];
511*c83a76b0SSuyog Pawar         mv_t as_mv_b[2];
512*c83a76b0SSuyog Pawar 
513*c83a76b0SSuyog Pawar         /* Pointers to B0, B1 and B2 */
514*c83a76b0SSuyog Pawar         {
515*c83a76b0SSuyog Pawar             WORD32 x_b0, x_b1, x_b2;
516*c83a76b0SSuyog Pawar             WORD32 pu_idx_b0, pu_idx_b1, pu_idx_b2;
517*c83a76b0SSuyog Pawar 
518*c83a76b0SSuyog Pawar             /* Relative co-ordiante of Xp,Yp w.r.t CTB start will work */
519*c83a76b0SSuyog Pawar             /* as long as minCTB = 16                                  */
520*c83a76b0SSuyog Pawar             x_b0 = (part_pos_x + part_wd);
521*c83a76b0SSuyog Pawar             x_b1 = (part_pos_x + part_wd - 1);
522*c83a76b0SSuyog Pawar             x_b2 = (part_pos_x - 1);
523*c83a76b0SSuyog Pawar             /* Getting offset back to given pointer */
524*c83a76b0SSuyog Pawar             x_b0 = x_b0 - part_pos_x;
525*c83a76b0SSuyog Pawar             x_b1 = x_b1 - part_pos_x;
526*c83a76b0SSuyog Pawar             x_b2 = x_b2 - part_pos_x;
527*c83a76b0SSuyog Pawar 
528*c83a76b0SSuyog Pawar             /* Below derivation are based on top pointer */
529*c83a76b0SSuyog Pawar             /* is pointing first pixel of PU             */
530*c83a76b0SSuyog Pawar             pu_idx_b0 = *(pu4_top_pu_idx + (x_b0 >> 2));
531*c83a76b0SSuyog Pawar             pu_idx_b0 = pu_idx_b0 * tr_avail;
532*c83a76b0SSuyog Pawar             pu_idx_b1 = *(pu4_top_pu_idx + (x_b1 >> 2));
533*c83a76b0SSuyog Pawar             pu_idx_b1 = pu_idx_b1 * t_avail;
534*c83a76b0SSuyog Pawar             /* At CTB boundary, use top-left passed in */
535*c83a76b0SSuyog Pawar             if(part_pos_y)
536*c83a76b0SSuyog Pawar             {
537*c83a76b0SSuyog Pawar                 pu_idx_b2 = *pu4_top_left_pu_idx;
538*c83a76b0SSuyog Pawar             }
539*c83a76b0SSuyog Pawar             else
540*c83a76b0SSuyog Pawar             {
541*c83a76b0SSuyog Pawar                 /* Not at CTB boundary, use top and  */
542*c83a76b0SSuyog Pawar                 /* add correction to go to top-left */
543*c83a76b0SSuyog Pawar                 pu_idx_b2 = *((pu4_top_pu_idx)+(x_b2 >> 2));
544*c83a76b0SSuyog Pawar             }
545*c83a76b0SSuyog Pawar             pu_idx_b2 = pu_idx_b2 * tl_avail;
546*c83a76b0SSuyog Pawar 
547*c83a76b0SSuyog Pawar             num_nbrs = 0;
548*c83a76b0SSuyog Pawar             nbr_avail[0] = 0;
549*c83a76b0SSuyog Pawar             nbr_avail[1] = 0;
550*c83a76b0SSuyog Pawar             nbr_avail[2] = 0;
551*c83a76b0SSuyog Pawar 
552*c83a76b0SSuyog Pawar             if(tr_avail && (!ps_pic_pu[pu_idx_b0].b1_intra_flag))
553*c83a76b0SSuyog Pawar             {
554*c83a76b0SSuyog Pawar                 aps_nbr_pu[num_nbrs] = &ps_pic_pu[pu_idx_b0];
555*c83a76b0SSuyog Pawar                 num_nbrs++;
556*c83a76b0SSuyog Pawar                 nbr_avail[0] = 1;
557*c83a76b0SSuyog Pawar             }
558*c83a76b0SSuyog Pawar             if(t_avail && (!ps_pic_pu[pu_idx_b1].b1_intra_flag))
559*c83a76b0SSuyog Pawar             {
560*c83a76b0SSuyog Pawar                 aps_nbr_pu[num_nbrs] = &ps_pic_pu[pu_idx_b1];
561*c83a76b0SSuyog Pawar                 num_nbrs++;
562*c83a76b0SSuyog Pawar                 nbr_avail[1] = 1;
563*c83a76b0SSuyog Pawar             }
564*c83a76b0SSuyog Pawar             if(tl_avail && (!ps_pic_pu[pu_idx_b2].b1_intra_flag))
565*c83a76b0SSuyog Pawar             {
566*c83a76b0SSuyog Pawar                 aps_nbr_pu[num_nbrs] = &ps_pic_pu[pu_idx_b2];
567*c83a76b0SSuyog Pawar                 num_nbrs++;
568*c83a76b0SSuyog Pawar                 nbr_avail[2] = 1;
569*c83a76b0SSuyog Pawar             }
570*c83a76b0SSuyog Pawar         }
571*c83a76b0SSuyog Pawar 
572*c83a76b0SSuyog Pawar         /* L0 */
573*c83a76b0SSuyog Pawar         avail_b_flag[0] = 0;
574*c83a76b0SSuyog Pawar         avail_b_flag[1] = 0;
575*c83a76b0SSuyog Pawar 
576*c83a76b0SSuyog Pawar         GET_MV_NBR_ST(ps_ref_pic_list, &avail_b_flag[0], ps_cur_pic_buf_l0, aps_nbr_pu, &as_mv_b[0], num_nbrs, 0);
577*c83a76b0SSuyog Pawar 
578*c83a76b0SSuyog Pawar         /* L1 */
579*c83a76b0SSuyog Pawar         if(PRED_L0 != ps_pu->b2_pred_mode)
580*c83a76b0SSuyog Pawar         {
581*c83a76b0SSuyog Pawar             /* B0 Short Term */
582*c83a76b0SSuyog Pawar             GET_MV_NBR_ST(ps_ref_pic_list, &avail_b_flag[1], ps_cur_pic_buf_l1, aps_nbr_pu, &as_mv_b[1], num_nbrs, 1);
583*c83a76b0SSuyog Pawar         }
584*c83a76b0SSuyog Pawar 
585*c83a76b0SSuyog Pawar         if(avail_b_flag[0])
586*c83a76b0SSuyog Pawar         {
587*c83a76b0SSuyog Pawar             if(((0 == num_l0_mvp_cand)
588*c83a76b0SSuyog Pawar                             || (as_mv_a[0].i2_mvx != as_mv_b[0].i2_mvx)
589*c83a76b0SSuyog Pawar                             || (as_mv_a[0].i2_mvy != as_mv_b[0].i2_mvy)))
590*c83a76b0SSuyog Pawar             {
591*c83a76b0SSuyog Pawar                 num_l0_mvp_cand++;
592*c83a76b0SSuyog Pawar                 if(max_l0_mvp_cand == num_l0_mvp_cand)
593*c83a76b0SSuyog Pawar                 {
594*c83a76b0SSuyog Pawar                     ps_pred_mv->s_l0_mv = as_mv_b[0];
595*c83a76b0SSuyog Pawar                     l0_done_flag = 1;
596*c83a76b0SSuyog Pawar                 }
597*c83a76b0SSuyog Pawar             }
598*c83a76b0SSuyog Pawar         }
599*c83a76b0SSuyog Pawar         if(avail_b_flag[1])
600*c83a76b0SSuyog Pawar         {
601*c83a76b0SSuyog Pawar             if(((0 == num_l1_mvp_cand)
602*c83a76b0SSuyog Pawar                             || (as_mv_a[1].i2_mvx != as_mv_b[1].i2_mvx)
603*c83a76b0SSuyog Pawar                             || (as_mv_a[1].i2_mvy != as_mv_b[1].i2_mvy)))
604*c83a76b0SSuyog Pawar             {
605*c83a76b0SSuyog Pawar                 num_l1_mvp_cand++;
606*c83a76b0SSuyog Pawar                 if(max_l1_mvp_cand == num_l1_mvp_cand)
607*c83a76b0SSuyog Pawar                 {
608*c83a76b0SSuyog Pawar                     ps_pred_mv->s_l1_mv = as_mv_b[1];
609*c83a76b0SSuyog Pawar                     l1_done_flag = 1;
610*c83a76b0SSuyog Pawar                 }
611*c83a76b0SSuyog Pawar             }
612*c83a76b0SSuyog Pawar         }
613*c83a76b0SSuyog Pawar         if(l0_done_flag && l1_done_flag)
614*c83a76b0SSuyog Pawar             return;
615*c83a76b0SSuyog Pawar 
616*c83a76b0SSuyog Pawar         if((is_scaled_flag_list == 0) && (avail_b_flag[0] == 1))
617*c83a76b0SSuyog Pawar         {
618*c83a76b0SSuyog Pawar             avail_a_flag[0] = 1;
619*c83a76b0SSuyog Pawar             as_mv_a[0] = as_mv_b[0];
620*c83a76b0SSuyog Pawar         }
621*c83a76b0SSuyog Pawar         if((is_scaled_flag_list == 0) && (avail_b_flag[1] == 1))
622*c83a76b0SSuyog Pawar         {
623*c83a76b0SSuyog Pawar             avail_a_flag[1] = 1;
624*c83a76b0SSuyog Pawar             as_mv_a[1] = as_mv_b[1];
625*c83a76b0SSuyog Pawar         }
626*c83a76b0SSuyog Pawar 
627*c83a76b0SSuyog Pawar         if(0 == is_scaled_flag_list)
628*c83a76b0SSuyog Pawar         {
629*c83a76b0SSuyog Pawar             avail_b_flag[0] = avail_b_flag[1] = 0;
630*c83a76b0SSuyog Pawar 
631*c83a76b0SSuyog Pawar             GET_MV_NBR_LT(ps_ref_pic_list, ps_slice_hdr, &avail_b_flag[0], ps_cur_pic_buf_l0, aps_nbr_pu, &as_mv_b[0], num_nbrs, 0);
632*c83a76b0SSuyog Pawar 
633*c83a76b0SSuyog Pawar             if(PRED_L0 != ps_pu->b2_pred_mode)
634*c83a76b0SSuyog Pawar             {
635*c83a76b0SSuyog Pawar                 GET_MV_NBR_LT(ps_ref_pic_list, ps_slice_hdr, &avail_b_flag[1], ps_cur_pic_buf_l1, aps_nbr_pu, &as_mv_b[1], num_nbrs, 1);
636*c83a76b0SSuyog Pawar             }
637*c83a76b0SSuyog Pawar 
638*c83a76b0SSuyog Pawar             if(avail_b_flag[0])
639*c83a76b0SSuyog Pawar             {
640*c83a76b0SSuyog Pawar                 if(((0 == num_l0_mvp_cand)
641*c83a76b0SSuyog Pawar                                 || (as_mv_a[0].i2_mvx != as_mv_b[0].i2_mvx)
642*c83a76b0SSuyog Pawar                                 || (as_mv_a[0].i2_mvy != as_mv_b[0].i2_mvy)))
643*c83a76b0SSuyog Pawar                 {
644*c83a76b0SSuyog Pawar                     num_l0_mvp_cand++;
645*c83a76b0SSuyog Pawar                     if(max_l0_mvp_cand == num_l0_mvp_cand)
646*c83a76b0SSuyog Pawar                     {
647*c83a76b0SSuyog Pawar                         ps_pred_mv->s_l0_mv = as_mv_b[0];
648*c83a76b0SSuyog Pawar                         l0_done_flag = 1;
649*c83a76b0SSuyog Pawar                     }
650*c83a76b0SSuyog Pawar                 }
651*c83a76b0SSuyog Pawar             }
652*c83a76b0SSuyog Pawar             if(avail_b_flag[1])
653*c83a76b0SSuyog Pawar             {
654*c83a76b0SSuyog Pawar                 if(((0 == num_l1_mvp_cand)
655*c83a76b0SSuyog Pawar                                 || (as_mv_a[1].i2_mvx != as_mv_b[1].i2_mvx)
656*c83a76b0SSuyog Pawar                                 || (as_mv_a[1].i2_mvy != as_mv_b[1].i2_mvy)))
657*c83a76b0SSuyog Pawar                 {
658*c83a76b0SSuyog Pawar                     num_l1_mvp_cand++;
659*c83a76b0SSuyog Pawar                     if(max_l1_mvp_cand == num_l1_mvp_cand)
660*c83a76b0SSuyog Pawar                     {
661*c83a76b0SSuyog Pawar                         ps_pred_mv->s_l1_mv = as_mv_b[1];
662*c83a76b0SSuyog Pawar                         l1_done_flag = 1;
663*c83a76b0SSuyog Pawar                     }
664*c83a76b0SSuyog Pawar                 }
665*c83a76b0SSuyog Pawar             }
666*c83a76b0SSuyog Pawar             if(l0_done_flag && l1_done_flag)
667*c83a76b0SSuyog Pawar                 return;
668*c83a76b0SSuyog Pawar         }
669*c83a76b0SSuyog Pawar         /***********************************************************/
670*c83a76b0SSuyog Pawar         /*          Collocated MV prediction                       */
671*c83a76b0SSuyog Pawar         /***********************************************************/
672*c83a76b0SSuyog Pawar         if((2 != num_l0_mvp_cand) || (2 != num_l1_mvp_cand))
673*c83a76b0SSuyog Pawar         {
674*c83a76b0SSuyog Pawar             mv_t as_mv_col[2], s_mv_col_l0, s_mv_col_l1;
675*c83a76b0SSuyog Pawar             WORD32 avail_col_flag[2] = { 0 };
676*c83a76b0SSuyog Pawar             WORD32 x_col, y_col, avail_col_l0, avail_col_l1;
677*c83a76b0SSuyog Pawar //            ihevcd_collocated_mvp((mv_ctxt_t *)ps_mv_ctxt,ps_pu,part_pos_x,part_pos_y,part_wd,part_ht,as_mv_col,avail_col_flag,1);
678*c83a76b0SSuyog Pawar             x_col = part_pos_x + part_wd;
679*c83a76b0SSuyog Pawar             y_col = part_pos_y + part_ht;
680*c83a76b0SSuyog Pawar             ihevcd_collocated_mvp(ps_mv_ctxt, ps_pu, as_mv_col, avail_col_flag, 1, x_col, y_col);
681*c83a76b0SSuyog Pawar 
682*c83a76b0SSuyog Pawar             avail_col_l0 = avail_col_flag[0];
683*c83a76b0SSuyog Pawar             avail_col_l1 = avail_col_flag[1];
684*c83a76b0SSuyog Pawar             if(avail_col_l0 || avail_col_l1)
685*c83a76b0SSuyog Pawar             {
686*c83a76b0SSuyog Pawar                 s_mv_col_l0 = as_mv_col[0];
687*c83a76b0SSuyog Pawar                 s_mv_col_l1 = as_mv_col[1];
688*c83a76b0SSuyog Pawar             }
689*c83a76b0SSuyog Pawar 
690*c83a76b0SSuyog Pawar             if(avail_col_l0 == 0 || avail_col_l1 == 0)
691*c83a76b0SSuyog Pawar             {
692*c83a76b0SSuyog Pawar                 /* Checking Collocated MV availability at Center of PU */
693*c83a76b0SSuyog Pawar                 x_col = part_pos_x + (part_wd >> 1);
694*c83a76b0SSuyog Pawar                 y_col = part_pos_y + (part_ht >> 1);
695*c83a76b0SSuyog Pawar                 ihevcd_collocated_mvp(ps_mv_ctxt, ps_pu, as_mv_col, avail_col_flag, 1, x_col, y_col);
696*c83a76b0SSuyog Pawar 
697*c83a76b0SSuyog Pawar                 if(avail_col_l0 == 0)
698*c83a76b0SSuyog Pawar                 {
699*c83a76b0SSuyog Pawar                     s_mv_col_l0 = as_mv_col[0];
700*c83a76b0SSuyog Pawar                 }
701*c83a76b0SSuyog Pawar                 if(avail_col_l1 == 0)
702*c83a76b0SSuyog Pawar                 {
703*c83a76b0SSuyog Pawar                     s_mv_col_l1 = as_mv_col[1];
704*c83a76b0SSuyog Pawar                 }
705*c83a76b0SSuyog Pawar 
706*c83a76b0SSuyog Pawar                 avail_col_l0 |= avail_col_flag[0];
707*c83a76b0SSuyog Pawar                 avail_col_l1 |= avail_col_flag[1];
708*c83a76b0SSuyog Pawar             }
709*c83a76b0SSuyog Pawar 
710*c83a76b0SSuyog Pawar             /* Checking if mvp index matches collocated mv */
711*c83a76b0SSuyog Pawar             if(avail_col_l0)
712*c83a76b0SSuyog Pawar             {
713*c83a76b0SSuyog Pawar                 if(2 != num_l0_mvp_cand)
714*c83a76b0SSuyog Pawar                 {
715*c83a76b0SSuyog Pawar                     num_l0_mvp_cand++;
716*c83a76b0SSuyog Pawar                     if(max_l0_mvp_cand == num_l0_mvp_cand)
717*c83a76b0SSuyog Pawar                     {
718*c83a76b0SSuyog Pawar                         ps_pred_mv->s_l0_mv = s_mv_col_l0;
719*c83a76b0SSuyog Pawar                         l0_done_flag = 1;
720*c83a76b0SSuyog Pawar                     }
721*c83a76b0SSuyog Pawar                 }
722*c83a76b0SSuyog Pawar             }
723*c83a76b0SSuyog Pawar             if(avail_col_l1)
724*c83a76b0SSuyog Pawar             {
725*c83a76b0SSuyog Pawar                 if(2 != num_l1_mvp_cand)
726*c83a76b0SSuyog Pawar                 {
727*c83a76b0SSuyog Pawar                     num_l1_mvp_cand++;
728*c83a76b0SSuyog Pawar                     if(max_l1_mvp_cand == num_l1_mvp_cand)
729*c83a76b0SSuyog Pawar                     {
730*c83a76b0SSuyog Pawar                         ps_pred_mv->s_l1_mv = s_mv_col_l1;
731*c83a76b0SSuyog Pawar                         l1_done_flag = 1;
732*c83a76b0SSuyog Pawar                     }
733*c83a76b0SSuyog Pawar                 }
734*c83a76b0SSuyog Pawar             }
735*c83a76b0SSuyog Pawar             if(l0_done_flag && l1_done_flag)
736*c83a76b0SSuyog Pawar                 return;
737*c83a76b0SSuyog Pawar         }
738*c83a76b0SSuyog Pawar 
739*c83a76b0SSuyog Pawar         if(0 == l0_done_flag)
740*c83a76b0SSuyog Pawar         {
741*c83a76b0SSuyog Pawar             ps_pred_mv->s_l0_mv.i2_mvx = 0;
742*c83a76b0SSuyog Pawar             ps_pred_mv->s_l0_mv.i2_mvy = 0;
743*c83a76b0SSuyog Pawar         }
744*c83a76b0SSuyog Pawar         if(0 == l1_done_flag)
745*c83a76b0SSuyog Pawar         {
746*c83a76b0SSuyog Pawar             ps_pred_mv->s_l1_mv.i2_mvx = 0;
747*c83a76b0SSuyog Pawar             ps_pred_mv->s_l1_mv.i2_mvy = 0;
748*c83a76b0SSuyog Pawar         }
749*c83a76b0SSuyog Pawar     }
750*c83a76b0SSuyog Pawar }
751