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