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_utils.c
22*c83a76b0SSuyog Pawar *
23*c83a76b0SSuyog Pawar * @brief
24*c83a76b0SSuyog Pawar * Contains miscellaneous utility functions such as init() etc
25*c83a76b0SSuyog Pawar *
26*c83a76b0SSuyog Pawar * @author
27*c83a76b0SSuyog Pawar * Harish
28*c83a76b0SSuyog Pawar *
29*c83a76b0SSuyog Pawar * @par List of Functions:
30*c83a76b0SSuyog Pawar *
31*c83a76b0SSuyog Pawar * @remarks
32*c83a76b0SSuyog Pawar * None
33*c83a76b0SSuyog Pawar *
34*c83a76b0SSuyog Pawar *******************************************************************************
35*c83a76b0SSuyog Pawar */
36*c83a76b0SSuyog Pawar /*****************************************************************************/
37*c83a76b0SSuyog Pawar /* File Includes */
38*c83a76b0SSuyog Pawar /*****************************************************************************/
39*c83a76b0SSuyog Pawar #include <stdio.h>
40*c83a76b0SSuyog Pawar #include <stddef.h>
41*c83a76b0SSuyog Pawar #include <stdlib.h>
42*c83a76b0SSuyog Pawar #include <string.h>
43*c83a76b0SSuyog Pawar #include <assert.h>
44*c83a76b0SSuyog Pawar
45*c83a76b0SSuyog Pawar #include "ihevc_typedefs.h"
46*c83a76b0SSuyog Pawar #include "iv.h"
47*c83a76b0SSuyog Pawar #include "ivd.h"
48*c83a76b0SSuyog Pawar #include "ihevcd_cxa.h"
49*c83a76b0SSuyog Pawar #include "ithread.h"
50*c83a76b0SSuyog Pawar
51*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
52*c83a76b0SSuyog Pawar #include "ihevc_debug.h"
53*c83a76b0SSuyog Pawar #include "ihevc_defs.h"
54*c83a76b0SSuyog Pawar #include "ihevc_error.h"
55*c83a76b0SSuyog Pawar #include "ihevc_structs.h"
56*c83a76b0SSuyog Pawar #include "ihevc_buf_mgr.h"
57*c83a76b0SSuyog Pawar #include "ihevc_dpb_mgr.h"
58*c83a76b0SSuyog Pawar #include "ihevc_macros.h"
59*c83a76b0SSuyog Pawar #include "ihevc_platform_macros.h"
60*c83a76b0SSuyog Pawar
61*c83a76b0SSuyog Pawar #include "ihevc_common_tables.h"
62*c83a76b0SSuyog Pawar #include "ihevc_buf_mgr.h"
63*c83a76b0SSuyog Pawar #include "ihevc_disp_mgr.h"
64*c83a76b0SSuyog Pawar #include "ihevc_cabac_tables.h"
65*c83a76b0SSuyog Pawar
66*c83a76b0SSuyog Pawar #include "ihevcd_defs.h"
67*c83a76b0SSuyog Pawar
68*c83a76b0SSuyog Pawar #include "ihevcd_function_selector.h"
69*c83a76b0SSuyog Pawar #include "ihevcd_structs.h"
70*c83a76b0SSuyog Pawar #include "ihevcd_error.h"
71*c83a76b0SSuyog Pawar #include "ihevcd_nal.h"
72*c83a76b0SSuyog Pawar #include "ihevcd_bitstream.h"
73*c83a76b0SSuyog Pawar #include "ihevcd_utils.h"
74*c83a76b0SSuyog Pawar #include "ihevcd_trace.h"
75*c83a76b0SSuyog Pawar #include "ihevcd_process_slice.h"
76*c83a76b0SSuyog Pawar #include "ihevcd_job_queue.h"
77*c83a76b0SSuyog Pawar #define MAX_DPB_PIC_BUF 6
78*c83a76b0SSuyog Pawar
79*c83a76b0SSuyog Pawar /* Function declarations */
80*c83a76b0SSuyog Pawar mv_buf_t* ihevcd_mv_mgr_get_poc(buf_mgr_t *ps_mv_buf_mgr, UWORD32 abs_poc);
81*c83a76b0SSuyog Pawar
82*c83a76b0SSuyog Pawar /**
83*c83a76b0SSuyog Pawar *******************************************************************************
84*c83a76b0SSuyog Pawar *
85*c83a76b0SSuyog Pawar * @brief
86*c83a76b0SSuyog Pawar * Used to get level index for a given level
87*c83a76b0SSuyog Pawar *
88*c83a76b0SSuyog Pawar * @par Description:
89*c83a76b0SSuyog Pawar * Converts from level_idc (which is multiplied by 30) to an index that can be
90*c83a76b0SSuyog Pawar * used as a lookup. Also used to ignore invalid levels like 2.2 , 3.2 etc
91*c83a76b0SSuyog Pawar *
92*c83a76b0SSuyog Pawar * @param[in] level
93*c83a76b0SSuyog Pawar * Level of the stream
94*c83a76b0SSuyog Pawar *
95*c83a76b0SSuyog Pawar * @returns Level index for a given level
96*c83a76b0SSuyog Pawar *
97*c83a76b0SSuyog Pawar * @remarks
98*c83a76b0SSuyog Pawar *
99*c83a76b0SSuyog Pawar *
100*c83a76b0SSuyog Pawar *******************************************************************************
101*c83a76b0SSuyog Pawar */
ihevcd_get_lvl_idx(WORD32 level)102*c83a76b0SSuyog Pawar WORD32 ihevcd_get_lvl_idx(WORD32 level)
103*c83a76b0SSuyog Pawar {
104*c83a76b0SSuyog Pawar WORD32 lvl_idx = 0;
105*c83a76b0SSuyog Pawar
106*c83a76b0SSuyog Pawar if(level < IHEVC_LEVEL_20)
107*c83a76b0SSuyog Pawar {
108*c83a76b0SSuyog Pawar lvl_idx = 0;
109*c83a76b0SSuyog Pawar }
110*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_20 && level < IHEVC_LEVEL_21)
111*c83a76b0SSuyog Pawar {
112*c83a76b0SSuyog Pawar lvl_idx = 1;
113*c83a76b0SSuyog Pawar }
114*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_21 && level < IHEVC_LEVEL_30)
115*c83a76b0SSuyog Pawar {
116*c83a76b0SSuyog Pawar lvl_idx = 2;
117*c83a76b0SSuyog Pawar }
118*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_30 && level < IHEVC_LEVEL_31)
119*c83a76b0SSuyog Pawar {
120*c83a76b0SSuyog Pawar lvl_idx = 3;
121*c83a76b0SSuyog Pawar }
122*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_31 && level < IHEVC_LEVEL_40)
123*c83a76b0SSuyog Pawar {
124*c83a76b0SSuyog Pawar lvl_idx = 4;
125*c83a76b0SSuyog Pawar }
126*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_40 && level < IHEVC_LEVEL_41)
127*c83a76b0SSuyog Pawar {
128*c83a76b0SSuyog Pawar lvl_idx = 5;
129*c83a76b0SSuyog Pawar }
130*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_41 && level < IHEVC_LEVEL_50)
131*c83a76b0SSuyog Pawar {
132*c83a76b0SSuyog Pawar lvl_idx = 6;
133*c83a76b0SSuyog Pawar }
134*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_50 && level < IHEVC_LEVEL_51)
135*c83a76b0SSuyog Pawar {
136*c83a76b0SSuyog Pawar lvl_idx = 7;
137*c83a76b0SSuyog Pawar }
138*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_51 && level < IHEVC_LEVEL_52)
139*c83a76b0SSuyog Pawar {
140*c83a76b0SSuyog Pawar lvl_idx = 8;
141*c83a76b0SSuyog Pawar }
142*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_52 && level < IHEVC_LEVEL_60)
143*c83a76b0SSuyog Pawar {
144*c83a76b0SSuyog Pawar lvl_idx = 9;
145*c83a76b0SSuyog Pawar }
146*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_60 && level < IHEVC_LEVEL_61)
147*c83a76b0SSuyog Pawar {
148*c83a76b0SSuyog Pawar lvl_idx = 10;
149*c83a76b0SSuyog Pawar }
150*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_61 && level < IHEVC_LEVEL_62)
151*c83a76b0SSuyog Pawar {
152*c83a76b0SSuyog Pawar lvl_idx = 11;
153*c83a76b0SSuyog Pawar }
154*c83a76b0SSuyog Pawar else if(level >= IHEVC_LEVEL_62)
155*c83a76b0SSuyog Pawar {
156*c83a76b0SSuyog Pawar lvl_idx = 12;
157*c83a76b0SSuyog Pawar }
158*c83a76b0SSuyog Pawar
159*c83a76b0SSuyog Pawar return (lvl_idx);
160*c83a76b0SSuyog Pawar }
161*c83a76b0SSuyog Pawar
162*c83a76b0SSuyog Pawar /**
163*c83a76b0SSuyog Pawar *******************************************************************************
164*c83a76b0SSuyog Pawar *
165*c83a76b0SSuyog Pawar * @brief
166*c83a76b0SSuyog Pawar * Used to get reference picture buffer size for a given level and
167*c83a76b0SSuyog Pawar * and padding used
168*c83a76b0SSuyog Pawar *
169*c83a76b0SSuyog Pawar * @par Description:
170*c83a76b0SSuyog Pawar * Used to get reference picture buffer size for a given level and padding used
171*c83a76b0SSuyog Pawar * Each picture is padded on all four sides
172*c83a76b0SSuyog Pawar *
173*c83a76b0SSuyog Pawar * @param[in] pic_size
174*c83a76b0SSuyog Pawar * Mumber of luma samples (Width * Height)
175*c83a76b0SSuyog Pawar *
176*c83a76b0SSuyog Pawar * @param[in] level
177*c83a76b0SSuyog Pawar * Level
178*c83a76b0SSuyog Pawar *
179*c83a76b0SSuyog Pawar * @param[in] horz_pad
180*c83a76b0SSuyog Pawar * Total padding used in horizontal direction
181*c83a76b0SSuyog Pawar *
182*c83a76b0SSuyog Pawar * @param[in] vert_pad
183*c83a76b0SSuyog Pawar * Total padding used in vertical direction
184*c83a76b0SSuyog Pawar *
185*c83a76b0SSuyog Pawar * @returns Total picture buffer size
186*c83a76b0SSuyog Pawar *
187*c83a76b0SSuyog Pawar * @remarks
188*c83a76b0SSuyog Pawar *
189*c83a76b0SSuyog Pawar *
190*c83a76b0SSuyog Pawar *******************************************************************************
191*c83a76b0SSuyog Pawar */
ihevcd_get_total_pic_buf_size(codec_t * ps_codec,WORD32 wd,WORD32 ht)192*c83a76b0SSuyog Pawar WORD32 ihevcd_get_total_pic_buf_size(codec_t *ps_codec,
193*c83a76b0SSuyog Pawar WORD32 wd,
194*c83a76b0SSuyog Pawar WORD32 ht)
195*c83a76b0SSuyog Pawar {
196*c83a76b0SSuyog Pawar WORD32 size;
197*c83a76b0SSuyog Pawar WORD32 num_luma_samples;
198*c83a76b0SSuyog Pawar WORD32 max_dpb_size;
199*c83a76b0SSuyog Pawar WORD32 num_samples;
200*c83a76b0SSuyog Pawar
201*c83a76b0SSuyog Pawar
202*c83a76b0SSuyog Pawar sps_t *ps_sps = (ps_codec->s_parse.ps_sps_base + ps_codec->i4_sps_id);
203*c83a76b0SSuyog Pawar
204*c83a76b0SSuyog Pawar /* Get maximum number of buffers for the current picture size */
205*c83a76b0SSuyog Pawar max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
206*c83a76b0SSuyog Pawar
207*c83a76b0SSuyog Pawar if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
208*c83a76b0SSuyog Pawar max_dpb_size += ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
209*c83a76b0SSuyog Pawar
210*c83a76b0SSuyog Pawar max_dpb_size++;
211*c83a76b0SSuyog Pawar /* Allocation is required for
212*c83a76b0SSuyog Pawar * (Wd + horz_pad) * (Ht + vert_pad) * (2 * max_dpb_size + 1)
213*c83a76b0SSuyog Pawar */
214*c83a76b0SSuyog Pawar
215*c83a76b0SSuyog Pawar /* Account for padding area */
216*c83a76b0SSuyog Pawar num_luma_samples = (wd + PAD_WD) * (ht + PAD_HT);
217*c83a76b0SSuyog Pawar
218*c83a76b0SSuyog Pawar /* Account for chroma */
219*c83a76b0SSuyog Pawar num_samples = num_luma_samples * 3 / 2;
220*c83a76b0SSuyog Pawar
221*c83a76b0SSuyog Pawar /* Number of bytes in reference pictures */
222*c83a76b0SSuyog Pawar size = num_samples * max_dpb_size;
223*c83a76b0SSuyog Pawar
224*c83a76b0SSuyog Pawar
225*c83a76b0SSuyog Pawar return size;
226*c83a76b0SSuyog Pawar }
227*c83a76b0SSuyog Pawar /**
228*c83a76b0SSuyog Pawar *******************************************************************************
229*c83a76b0SSuyog Pawar *
230*c83a76b0SSuyog Pawar * @brief
231*c83a76b0SSuyog Pawar * Used to get MV bank size for a given number of luma samples
232*c83a76b0SSuyog Pawar *
233*c83a76b0SSuyog Pawar * @par Description:
234*c83a76b0SSuyog Pawar * For given number of luma samples one MV bank size is computed
235*c83a76b0SSuyog Pawar * Each MV bank includes pu_map and pu_t for all the min PUs(4x4) in a picture
236*c83a76b0SSuyog Pawar *
237*c83a76b0SSuyog Pawar * @param[in] num_luma_samples
238*c83a76b0SSuyog Pawar * Max number of luma pixels in the frame
239*c83a76b0SSuyog Pawar *
240*c83a76b0SSuyog Pawar * @returns Total MV Bank size
241*c83a76b0SSuyog Pawar *
242*c83a76b0SSuyog Pawar * @remarks
243*c83a76b0SSuyog Pawar *
244*c83a76b0SSuyog Pawar *
245*c83a76b0SSuyog Pawar *******************************************************************************
246*c83a76b0SSuyog Pawar */
ihevcd_get_pic_mv_bank_size(WORD32 num_luma_samples)247*c83a76b0SSuyog Pawar WORD32 ihevcd_get_pic_mv_bank_size(WORD32 num_luma_samples)
248*c83a76b0SSuyog Pawar {
249*c83a76b0SSuyog Pawar WORD32 size;
250*c83a76b0SSuyog Pawar
251*c83a76b0SSuyog Pawar WORD32 pic_size;
252*c83a76b0SSuyog Pawar
253*c83a76b0SSuyog Pawar WORD32 mv_bank_size;
254*c83a76b0SSuyog Pawar WORD32 num_pu;
255*c83a76b0SSuyog Pawar WORD32 num_ctb;
256*c83a76b0SSuyog Pawar pic_size = num_luma_samples;
257*c83a76b0SSuyog Pawar
258*c83a76b0SSuyog Pawar
259*c83a76b0SSuyog Pawar num_pu = pic_size / (MIN_PU_SIZE * MIN_PU_SIZE);
260*c83a76b0SSuyog Pawar num_ctb = pic_size / (MIN_CTB_SIZE * MIN_CTB_SIZE);
261*c83a76b0SSuyog Pawar
262*c83a76b0SSuyog Pawar mv_bank_size = 0;
263*c83a76b0SSuyog Pawar
264*c83a76b0SSuyog Pawar /* Size for storing pu_t start index each CTB */
265*c83a76b0SSuyog Pawar /* One extra entry is needed to compute number of PUs in the last CTB */
266*c83a76b0SSuyog Pawar mv_bank_size += (num_ctb + 1) * sizeof(WORD32);
267*c83a76b0SSuyog Pawar
268*c83a76b0SSuyog Pawar /* Size for pu_map */
269*c83a76b0SSuyog Pawar mv_bank_size += num_pu;
270*c83a76b0SSuyog Pawar
271*c83a76b0SSuyog Pawar /* Size for storing pu_t for each PU */
272*c83a76b0SSuyog Pawar mv_bank_size += num_pu * sizeof(pu_t);
273*c83a76b0SSuyog Pawar
274*c83a76b0SSuyog Pawar /* Size for storing slice_idx for each CTB */
275*c83a76b0SSuyog Pawar mv_bank_size += ALIGN4(num_ctb * sizeof(UWORD16));
276*c83a76b0SSuyog Pawar
277*c83a76b0SSuyog Pawar size = mv_bank_size;
278*c83a76b0SSuyog Pawar return size;
279*c83a76b0SSuyog Pawar }
280*c83a76b0SSuyog Pawar /**
281*c83a76b0SSuyog Pawar *******************************************************************************
282*c83a76b0SSuyog Pawar *
283*c83a76b0SSuyog Pawar * @brief
284*c83a76b0SSuyog Pawar * Used to get TU data size for a given number luma samples
285*c83a76b0SSuyog Pawar *
286*c83a76b0SSuyog Pawar * @par Description:
287*c83a76b0SSuyog Pawar * For a given number of luma samples TU data size is computed
288*c83a76b0SSuyog Pawar * Each TU data includes tu_map and tu_t and coeff data for all
289*c83a76b0SSuyog Pawar * the min TUs(4x4) in given CTB
290*c83a76b0SSuyog Pawar *
291*c83a76b0SSuyog Pawar * @param[in] num_luma_samples
292*c83a76b0SSuyog Pawar * Number of 64 x 64 CTBs for which TU data has to be allocated.
293*c83a76b0SSuyog Pawar *
294*c83a76b0SSuyog Pawar * @returns Total TU data size
295*c83a76b0SSuyog Pawar *
296*c83a76b0SSuyog Pawar * @remarks Assumption is num_luma_samples will be at least
297*c83a76b0SSuyog Pawar * 64 x 64 to handle CTB of size 64 x 64. Can be frame size as well
298*c83a76b0SSuyog Pawar *
299*c83a76b0SSuyog Pawar *******************************************************************************
300*c83a76b0SSuyog Pawar */
ihevcd_get_tu_data_size(WORD32 num_luma_samples)301*c83a76b0SSuyog Pawar WORD32 ihevcd_get_tu_data_size(WORD32 num_luma_samples)
302*c83a76b0SSuyog Pawar {
303*c83a76b0SSuyog Pawar
304*c83a76b0SSuyog Pawar
305*c83a76b0SSuyog Pawar WORD32 tu_data_size;
306*c83a76b0SSuyog Pawar WORD32 num_ctb;
307*c83a76b0SSuyog Pawar WORD32 num_luma_tu, num_chroma_tu, num_tu;
308*c83a76b0SSuyog Pawar num_ctb = num_luma_samples / (MIN_CTB_SIZE * MIN_CTB_SIZE);
309*c83a76b0SSuyog Pawar
310*c83a76b0SSuyog Pawar num_luma_tu = num_luma_samples / (MIN_TU_SIZE * MIN_TU_SIZE);
311*c83a76b0SSuyog Pawar num_chroma_tu = num_luma_tu >> 1;
312*c83a76b0SSuyog Pawar
313*c83a76b0SSuyog Pawar num_tu = num_luma_tu + num_chroma_tu;
314*c83a76b0SSuyog Pawar tu_data_size = 0;
315*c83a76b0SSuyog Pawar
316*c83a76b0SSuyog Pawar /* Size for storing tu_t start index each CTB */
317*c83a76b0SSuyog Pawar /* One extra entry is needed to compute number of TUs in the last CTB */
318*c83a76b0SSuyog Pawar tu_data_size += (num_ctb + 1) * sizeof(WORD32);
319*c83a76b0SSuyog Pawar
320*c83a76b0SSuyog Pawar /* Size for storing tu map */
321*c83a76b0SSuyog Pawar tu_data_size += num_luma_tu * sizeof(UWORD8);
322*c83a76b0SSuyog Pawar
323*c83a76b0SSuyog Pawar /* Size for storing tu_t for each TU */
324*c83a76b0SSuyog Pawar tu_data_size += num_tu * sizeof(tu_t);
325*c83a76b0SSuyog Pawar
326*c83a76b0SSuyog Pawar /* Size for storing number of coded subblocks and scan_idx for each TU */
327*c83a76b0SSuyog Pawar tu_data_size += num_tu * (sizeof(WORD8) + sizeof(WORD8));
328*c83a76b0SSuyog Pawar
329*c83a76b0SSuyog Pawar /* Size for storing coeff data for each TU */
330*c83a76b0SSuyog Pawar tu_data_size += num_tu * sizeof(tu_sblk_coeff_data_t);
331*c83a76b0SSuyog Pawar
332*c83a76b0SSuyog Pawar
333*c83a76b0SSuyog Pawar return tu_data_size;
334*c83a76b0SSuyog Pawar }
335*c83a76b0SSuyog Pawar
336*c83a76b0SSuyog Pawar
ihevcd_nctb_cnt(codec_t * ps_codec,sps_t * ps_sps)337*c83a76b0SSuyog Pawar WORD32 ihevcd_nctb_cnt(codec_t *ps_codec, sps_t *ps_sps)
338*c83a76b0SSuyog Pawar {
339*c83a76b0SSuyog Pawar WORD32 nctb = 1;
340*c83a76b0SSuyog Pawar UNUSED(ps_codec);
341*c83a76b0SSuyog Pawar //TODO: Currently set to 1
342*c83a76b0SSuyog Pawar /* If CTB size is less than 32 x 32 then set nCTB as 4 */
343*c83a76b0SSuyog Pawar if(ps_sps->i1_log2_ctb_size < 5)
344*c83a76b0SSuyog Pawar nctb = 1;
345*c83a76b0SSuyog Pawar
346*c83a76b0SSuyog Pawar return nctb;
347*c83a76b0SSuyog Pawar }
348*c83a76b0SSuyog Pawar
ihevcd_get_tile_pos(pps_t * ps_pps,sps_t * ps_sps,WORD32 ctb_x,WORD32 ctb_y,WORD32 * pi4_ctb_tile_x,WORD32 * pi4_ctb_tile_y,WORD32 * pi4_tile_idx)349*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_get_tile_pos(pps_t *ps_pps,
350*c83a76b0SSuyog Pawar sps_t *ps_sps,
351*c83a76b0SSuyog Pawar WORD32 ctb_x,
352*c83a76b0SSuyog Pawar WORD32 ctb_y,
353*c83a76b0SSuyog Pawar WORD32 *pi4_ctb_tile_x,
354*c83a76b0SSuyog Pawar WORD32 *pi4_ctb_tile_y,
355*c83a76b0SSuyog Pawar WORD32 *pi4_tile_idx)
356*c83a76b0SSuyog Pawar {
357*c83a76b0SSuyog Pawar
358*c83a76b0SSuyog Pawar tile_t *ps_tile_tmp;
359*c83a76b0SSuyog Pawar WORD32 i;
360*c83a76b0SSuyog Pawar WORD32 tile_row, tile_col;
361*c83a76b0SSuyog Pawar
362*c83a76b0SSuyog Pawar if(ctb_x < 0 || ctb_y < 0)
363*c83a76b0SSuyog Pawar {
364*c83a76b0SSuyog Pawar *pi4_ctb_tile_x = 0;
365*c83a76b0SSuyog Pawar *pi4_ctb_tile_y = 0;
366*c83a76b0SSuyog Pawar *pi4_tile_idx = 0;
367*c83a76b0SSuyog Pawar
368*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
369*c83a76b0SSuyog Pawar }
370*c83a76b0SSuyog Pawar
371*c83a76b0SSuyog Pawar tile_row = 0;
372*c83a76b0SSuyog Pawar tile_col = 0;
373*c83a76b0SSuyog Pawar ps_tile_tmp = ps_pps->ps_tile;
374*c83a76b0SSuyog Pawar if(0 == ps_pps->i1_tiles_enabled_flag)
375*c83a76b0SSuyog Pawar {
376*c83a76b0SSuyog Pawar *pi4_ctb_tile_x = ctb_x;
377*c83a76b0SSuyog Pawar *pi4_ctb_tile_y = ctb_y;
378*c83a76b0SSuyog Pawar *pi4_tile_idx = 0;
379*c83a76b0SSuyog Pawar }
380*c83a76b0SSuyog Pawar else
381*c83a76b0SSuyog Pawar {
382*c83a76b0SSuyog Pawar for(i = 0; i < ps_pps->i1_num_tile_columns; i++)
383*c83a76b0SSuyog Pawar {
384*c83a76b0SSuyog Pawar WORD16 next_tile_ctb_x;
385*c83a76b0SSuyog Pawar ps_tile_tmp = ps_pps->ps_tile + i; //* ps_pps->i1_num_tile_rows;
386*c83a76b0SSuyog Pawar if((ps_pps->i1_num_tile_columns - 1) == i)
387*c83a76b0SSuyog Pawar {
388*c83a76b0SSuyog Pawar next_tile_ctb_x = ps_sps->i2_pic_wd_in_ctb;
389*c83a76b0SSuyog Pawar }
390*c83a76b0SSuyog Pawar else
391*c83a76b0SSuyog Pawar {
392*c83a76b0SSuyog Pawar tile_t *ps_tile_next_tmp;
393*c83a76b0SSuyog Pawar ps_tile_next_tmp = ps_pps->ps_tile + i + 1;
394*c83a76b0SSuyog Pawar next_tile_ctb_x = ps_tile_next_tmp->u1_pos_x;
395*c83a76b0SSuyog Pawar }
396*c83a76b0SSuyog Pawar if((ctb_x >= ps_tile_tmp->u1_pos_x) && (ctb_x < next_tile_ctb_x))
397*c83a76b0SSuyog Pawar {
398*c83a76b0SSuyog Pawar tile_col = i;
399*c83a76b0SSuyog Pawar break;
400*c83a76b0SSuyog Pawar }
401*c83a76b0SSuyog Pawar }
402*c83a76b0SSuyog Pawar *pi4_ctb_tile_x = ctb_x - ps_tile_tmp->u1_pos_x;
403*c83a76b0SSuyog Pawar
404*c83a76b0SSuyog Pawar for(i = 0; i < ps_pps->i1_num_tile_rows; i++)
405*c83a76b0SSuyog Pawar {
406*c83a76b0SSuyog Pawar WORD16 next_tile_ctb_y;
407*c83a76b0SSuyog Pawar ps_tile_tmp = ps_pps->ps_tile + i * ps_pps->i1_num_tile_columns;
408*c83a76b0SSuyog Pawar if((ps_pps->i1_num_tile_rows - 1) == i)
409*c83a76b0SSuyog Pawar {
410*c83a76b0SSuyog Pawar next_tile_ctb_y = ps_sps->i2_pic_ht_in_ctb;
411*c83a76b0SSuyog Pawar }
412*c83a76b0SSuyog Pawar else
413*c83a76b0SSuyog Pawar {
414*c83a76b0SSuyog Pawar tile_t *ps_tile_next_tmp;
415*c83a76b0SSuyog Pawar ps_tile_next_tmp = ps_pps->ps_tile + ((i + 1) * ps_pps->i1_num_tile_columns);
416*c83a76b0SSuyog Pawar next_tile_ctb_y = ps_tile_next_tmp->u1_pos_y;
417*c83a76b0SSuyog Pawar }
418*c83a76b0SSuyog Pawar if((ctb_y >= ps_tile_tmp->u1_pos_y) && (ctb_y < next_tile_ctb_y))
419*c83a76b0SSuyog Pawar {
420*c83a76b0SSuyog Pawar tile_row = i;
421*c83a76b0SSuyog Pawar break;
422*c83a76b0SSuyog Pawar }
423*c83a76b0SSuyog Pawar
424*c83a76b0SSuyog Pawar }
425*c83a76b0SSuyog Pawar *pi4_ctb_tile_y = ctb_y - ps_tile_tmp->u1_pos_y;
426*c83a76b0SSuyog Pawar *pi4_tile_idx = tile_row * ps_pps->i1_num_tile_columns
427*c83a76b0SSuyog Pawar + tile_col;
428*c83a76b0SSuyog Pawar }
429*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
430*c83a76b0SSuyog Pawar }
431*c83a76b0SSuyog Pawar /**
432*c83a76b0SSuyog Pawar *******************************************************************************
433*c83a76b0SSuyog Pawar *
434*c83a76b0SSuyog Pawar * @brief
435*c83a76b0SSuyog Pawar * Function to initialize ps_pic_buf structs add pic buffers to
436*c83a76b0SSuyog Pawar * buffer manager in case of non-shared mode
437*c83a76b0SSuyog Pawar *
438*c83a76b0SSuyog Pawar * @par Description:
439*c83a76b0SSuyog Pawar * Function to initialize ps_pic_buf structs add pic buffers to
440*c83a76b0SSuyog Pawar * buffer manager in case of non-shared mode
441*c83a76b0SSuyog Pawar * To be called once per stream or for every reset
442*c83a76b0SSuyog Pawar *
443*c83a76b0SSuyog Pawar * @param[in] ps_codec
444*c83a76b0SSuyog Pawar * Pointer to codec context
445*c83a76b0SSuyog Pawar *
446*c83a76b0SSuyog Pawar * @returns Error from IHEVCD_ERROR_T
447*c83a76b0SSuyog Pawar *
448*c83a76b0SSuyog Pawar * @remarks
449*c83a76b0SSuyog Pawar *
450*c83a76b0SSuyog Pawar *
451*c83a76b0SSuyog Pawar *******************************************************************************
452*c83a76b0SSuyog Pawar */
ihevcd_pic_buf_mgr_add_bufs(codec_t * ps_codec)453*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_pic_buf_mgr_add_bufs(codec_t *ps_codec)
454*c83a76b0SSuyog Pawar {
455*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
456*c83a76b0SSuyog Pawar WORD32 i;
457*c83a76b0SSuyog Pawar WORD32 max_dpb_size;
458*c83a76b0SSuyog Pawar sps_t *ps_sps;
459*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
460*c83a76b0SSuyog Pawar pic_buf_t *ps_pic_buf;
461*c83a76b0SSuyog Pawar WORD32 pic_buf_size_allocated;
462*c83a76b0SSuyog Pawar
463*c83a76b0SSuyog Pawar
464*c83a76b0SSuyog Pawar
465*c83a76b0SSuyog Pawar
466*c83a76b0SSuyog Pawar /* Initialize Pic buffer manager */
467*c83a76b0SSuyog Pawar ps_sps = ps_codec->s_parse.ps_sps;
468*c83a76b0SSuyog Pawar
469*c83a76b0SSuyog Pawar /* Compute the number of Pic buffers needed */
470*c83a76b0SSuyog Pawar max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
471*c83a76b0SSuyog Pawar
472*c83a76b0SSuyog Pawar if(ps_codec->e_frm_out_mode != IVD_DECODE_FRAME_OUT)
473*c83a76b0SSuyog Pawar max_dpb_size += ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1];
474*c83a76b0SSuyog Pawar
475*c83a76b0SSuyog Pawar /* Allocate one extra picture to handle current frame
476*c83a76b0SSuyog Pawar * In case of asynchronous parsing and processing, number of buffers should increase here
477*c83a76b0SSuyog Pawar * based on when parsing and processing threads are synchronized
478*c83a76b0SSuyog Pawar */
479*c83a76b0SSuyog Pawar max_dpb_size++;
480*c83a76b0SSuyog Pawar
481*c83a76b0SSuyog Pawar
482*c83a76b0SSuyog Pawar pu1_buf = (UWORD8 *)ps_codec->pu1_ref_pic_buf_base;
483*c83a76b0SSuyog Pawar
484*c83a76b0SSuyog Pawar ps_pic_buf = (pic_buf_t *)ps_codec->ps_pic_buf;
485*c83a76b0SSuyog Pawar
486*c83a76b0SSuyog Pawar /* In case of non-shared mode, add picture buffers to buffer manager
487*c83a76b0SSuyog Pawar * In case of shared mode buffers are added in the run-time
488*c83a76b0SSuyog Pawar */
489*c83a76b0SSuyog Pawar if(0 == ps_codec->i4_share_disp_buf)
490*c83a76b0SSuyog Pawar {
491*c83a76b0SSuyog Pawar WORD32 buf_ret;
492*c83a76b0SSuyog Pawar WORD32 luma_samples;
493*c83a76b0SSuyog Pawar WORD32 chroma_samples;
494*c83a76b0SSuyog Pawar pic_buf_size_allocated = ps_codec->i4_total_pic_buf_size;
495*c83a76b0SSuyog Pawar
496*c83a76b0SSuyog Pawar luma_samples = (ps_codec->i4_strd) *
497*c83a76b0SSuyog Pawar (ps_sps->i2_pic_height_in_luma_samples + PAD_HT);
498*c83a76b0SSuyog Pawar
499*c83a76b0SSuyog Pawar chroma_samples = luma_samples / 2;
500*c83a76b0SSuyog Pawar
501*c83a76b0SSuyog Pawar /* Try to add as many buffers as possible since memory is already allocated */
502*c83a76b0SSuyog Pawar /* If the number of buffers that can be added is less than max_num_bufs
503*c83a76b0SSuyog Pawar * return with an error.
504*c83a76b0SSuyog Pawar */
505*c83a76b0SSuyog Pawar for(i = 0; i < max_dpb_size; i++)
506*c83a76b0SSuyog Pawar {
507*c83a76b0SSuyog Pawar pic_buf_size_allocated -= (luma_samples + chroma_samples);
508*c83a76b0SSuyog Pawar
509*c83a76b0SSuyog Pawar if(pic_buf_size_allocated < 0)
510*c83a76b0SSuyog Pawar {
511*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_INSUFFICIENT_MEM_PICBUF;
512*c83a76b0SSuyog Pawar return IHEVCD_INSUFFICIENT_MEM_PICBUF;
513*c83a76b0SSuyog Pawar }
514*c83a76b0SSuyog Pawar
515*c83a76b0SSuyog Pawar ps_pic_buf->pu1_luma = pu1_buf + ps_codec->i4_strd * PAD_TOP + PAD_LEFT;
516*c83a76b0SSuyog Pawar pu1_buf += luma_samples;
517*c83a76b0SSuyog Pawar
518*c83a76b0SSuyog Pawar ps_pic_buf->pu1_chroma = pu1_buf + ps_codec->i4_strd * (PAD_TOP / 2) + PAD_LEFT;
519*c83a76b0SSuyog Pawar pu1_buf += chroma_samples;
520*c83a76b0SSuyog Pawar
521*c83a76b0SSuyog Pawar /* Pad boundary pixels (one pixel on all sides) */
522*c83a76b0SSuyog Pawar /* This ensures SAO does not read uninitialized pixels */
523*c83a76b0SSuyog Pawar /* Note these are not used in actual processing */
524*c83a76b0SSuyog Pawar {
525*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
526*c83a76b0SSuyog Pawar WORD32 strd, wd, ht;
527*c83a76b0SSuyog Pawar WORD32 i;
528*c83a76b0SSuyog Pawar strd = ps_codec->i4_strd;
529*c83a76b0SSuyog Pawar wd = ps_codec->i4_wd;
530*c83a76b0SSuyog Pawar ht = ps_codec->i4_ht;
531*c83a76b0SSuyog Pawar
532*c83a76b0SSuyog Pawar pu1_buf = ps_pic_buf->pu1_luma;
533*c83a76b0SSuyog Pawar for(i = 0; i < ht; i++)
534*c83a76b0SSuyog Pawar {
535*c83a76b0SSuyog Pawar pu1_buf[-1] = 0;
536*c83a76b0SSuyog Pawar pu1_buf[wd] = 0;
537*c83a76b0SSuyog Pawar pu1_buf += strd;
538*c83a76b0SSuyog Pawar }
539*c83a76b0SSuyog Pawar pu1_buf = ps_pic_buf->pu1_luma;
540*c83a76b0SSuyog Pawar memset(pu1_buf - strd - 1, 0, wd + 2);
541*c83a76b0SSuyog Pawar
542*c83a76b0SSuyog Pawar pu1_buf += strd * ht;
543*c83a76b0SSuyog Pawar memset(pu1_buf - 1, 0, wd + 2);
544*c83a76b0SSuyog Pawar
545*c83a76b0SSuyog Pawar pu1_buf = ps_pic_buf->pu1_chroma;
546*c83a76b0SSuyog Pawar ht >>= 1;
547*c83a76b0SSuyog Pawar for(i = 0; i < ht; i++)
548*c83a76b0SSuyog Pawar {
549*c83a76b0SSuyog Pawar pu1_buf[-1] = 0;
550*c83a76b0SSuyog Pawar pu1_buf[-2] = 0;
551*c83a76b0SSuyog Pawar pu1_buf[wd] = 0;
552*c83a76b0SSuyog Pawar pu1_buf[wd + 1] = 0;
553*c83a76b0SSuyog Pawar pu1_buf += strd;
554*c83a76b0SSuyog Pawar }
555*c83a76b0SSuyog Pawar pu1_buf = ps_pic_buf->pu1_chroma;
556*c83a76b0SSuyog Pawar memset(pu1_buf - strd - 2, 0, wd + 4);
557*c83a76b0SSuyog Pawar
558*c83a76b0SSuyog Pawar pu1_buf += strd * ht;
559*c83a76b0SSuyog Pawar memset(pu1_buf - 2, 0, wd + 4);
560*c83a76b0SSuyog Pawar }
561*c83a76b0SSuyog Pawar
562*c83a76b0SSuyog Pawar buf_ret = ihevc_buf_mgr_add((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, ps_pic_buf, i);
563*c83a76b0SSuyog Pawar
564*c83a76b0SSuyog Pawar
565*c83a76b0SSuyog Pawar if(0 != buf_ret)
566*c83a76b0SSuyog Pawar {
567*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_BUF_MGR_ERROR;
568*c83a76b0SSuyog Pawar return IHEVCD_BUF_MGR_ERROR;
569*c83a76b0SSuyog Pawar }
570*c83a76b0SSuyog Pawar ps_pic_buf++;
571*c83a76b0SSuyog Pawar }
572*c83a76b0SSuyog Pawar }
573*c83a76b0SSuyog Pawar else
574*c83a76b0SSuyog Pawar {
575*c83a76b0SSuyog Pawar /* In case of shared mode, buffers are added without adjusting for padding.
576*c83a76b0SSuyog Pawar Update luma and chroma pointers here to account for padding as per stride.
577*c83a76b0SSuyog Pawar In some cases stride might not be available when set_display_frame is called.
578*c83a76b0SSuyog Pawar Hence updated luma and chroma pointers here */
579*c83a76b0SSuyog Pawar
580*c83a76b0SSuyog Pawar for(i = 0; i < BUF_MGR_MAX_CNT; i++)
581*c83a76b0SSuyog Pawar {
582*c83a76b0SSuyog Pawar ps_pic_buf = ihevc_buf_mgr_get_buf((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, i);
583*c83a76b0SSuyog Pawar if((NULL == ps_pic_buf) ||
584*c83a76b0SSuyog Pawar (NULL == ps_pic_buf->pu1_luma) ||
585*c83a76b0SSuyog Pawar (NULL == ps_pic_buf->pu1_chroma))
586*c83a76b0SSuyog Pawar {
587*c83a76b0SSuyog Pawar break;
588*c83a76b0SSuyog Pawar }
589*c83a76b0SSuyog Pawar ps_pic_buf->pu1_luma += ps_codec->i4_strd * PAD_TOP + PAD_LEFT;
590*c83a76b0SSuyog Pawar ps_pic_buf->pu1_chroma += ps_codec->i4_strd * (PAD_TOP / 2) + PAD_LEFT;
591*c83a76b0SSuyog Pawar }
592*c83a76b0SSuyog Pawar }
593*c83a76b0SSuyog Pawar
594*c83a76b0SSuyog Pawar return ret;
595*c83a76b0SSuyog Pawar }
596*c83a76b0SSuyog Pawar /**
597*c83a76b0SSuyog Pawar *******************************************************************************
598*c83a76b0SSuyog Pawar *
599*c83a76b0SSuyog Pawar * @brief
600*c83a76b0SSuyog Pawar * Function to add buffers to MV Bank buffer manager
601*c83a76b0SSuyog Pawar *
602*c83a76b0SSuyog Pawar * @par Description:
603*c83a76b0SSuyog Pawar * Function to add buffers to MV Bank buffer manager
604*c83a76b0SSuyog Pawar * To be called once per stream or for every reset
605*c83a76b0SSuyog Pawar *
606*c83a76b0SSuyog Pawar * @param[in] ps_codec
607*c83a76b0SSuyog Pawar * Pointer to codec context
608*c83a76b0SSuyog Pawar *
609*c83a76b0SSuyog Pawar * @returns Error from IHEVCD_ERROR_T
610*c83a76b0SSuyog Pawar *
611*c83a76b0SSuyog Pawar * @remarks
612*c83a76b0SSuyog Pawar *
613*c83a76b0SSuyog Pawar *
614*c83a76b0SSuyog Pawar *******************************************************************************
615*c83a76b0SSuyog Pawar */
ihevcd_mv_buf_mgr_add_bufs(codec_t * ps_codec)616*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_mv_buf_mgr_add_bufs(codec_t *ps_codec)
617*c83a76b0SSuyog Pawar {
618*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
619*c83a76b0SSuyog Pawar WORD32 i;
620*c83a76b0SSuyog Pawar WORD32 max_dpb_size;
621*c83a76b0SSuyog Pawar WORD32 mv_bank_size_allocated;
622*c83a76b0SSuyog Pawar WORD32 pic_mv_bank_size;
623*c83a76b0SSuyog Pawar
624*c83a76b0SSuyog Pawar sps_t *ps_sps;
625*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
626*c83a76b0SSuyog Pawar mv_buf_t *ps_mv_buf;
627*c83a76b0SSuyog Pawar
628*c83a76b0SSuyog Pawar
629*c83a76b0SSuyog Pawar /* Initialize MV Bank buffer manager */
630*c83a76b0SSuyog Pawar ps_sps = ps_codec->s_parse.ps_sps;
631*c83a76b0SSuyog Pawar
632*c83a76b0SSuyog Pawar
633*c83a76b0SSuyog Pawar /* Compute the number of MV Bank buffers needed */
634*c83a76b0SSuyog Pawar max_dpb_size = ps_sps->ai1_sps_max_dec_pic_buffering[ps_sps->i1_sps_max_sub_layers - 1];
635*c83a76b0SSuyog Pawar
636*c83a76b0SSuyog Pawar /* Allocate one extra MV Bank to handle current frame
637*c83a76b0SSuyog Pawar * In case of asynchronous parsing and processing, number of buffers should increase here
638*c83a76b0SSuyog Pawar * based on when parsing and processing threads are synchronized
639*c83a76b0SSuyog Pawar */
640*c83a76b0SSuyog Pawar max_dpb_size++;
641*c83a76b0SSuyog Pawar
642*c83a76b0SSuyog Pawar ps_codec->i4_max_dpb_size = max_dpb_size;
643*c83a76b0SSuyog Pawar
644*c83a76b0SSuyog Pawar pu1_buf = (UWORD8 *)ps_codec->pv_mv_bank_buf_base;
645*c83a76b0SSuyog Pawar
646*c83a76b0SSuyog Pawar ps_mv_buf = (mv_buf_t *)pu1_buf;
647*c83a76b0SSuyog Pawar pu1_buf += max_dpb_size * sizeof(mv_buf_t);
648*c83a76b0SSuyog Pawar ps_codec->ps_mv_buf = ps_mv_buf;
649*c83a76b0SSuyog Pawar mv_bank_size_allocated = ps_codec->i4_total_mv_bank_size - max_dpb_size * sizeof(mv_buf_t);
650*c83a76b0SSuyog Pawar
651*c83a76b0SSuyog Pawar /* Compute MV bank size per picture */
652*c83a76b0SSuyog Pawar pic_mv_bank_size = ihevcd_get_pic_mv_bank_size(ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
653*c83a76b0SSuyog Pawar ALIGN64(ps_sps->i2_pic_height_in_luma_samples));
654*c83a76b0SSuyog Pawar
655*c83a76b0SSuyog Pawar for(i = 0; i < max_dpb_size; i++)
656*c83a76b0SSuyog Pawar {
657*c83a76b0SSuyog Pawar WORD32 buf_ret;
658*c83a76b0SSuyog Pawar WORD32 num_pu;
659*c83a76b0SSuyog Pawar WORD32 num_ctb;
660*c83a76b0SSuyog Pawar WORD32 pic_size;
661*c83a76b0SSuyog Pawar pic_size = ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
662*c83a76b0SSuyog Pawar ALIGN64(ps_sps->i2_pic_height_in_luma_samples);
663*c83a76b0SSuyog Pawar
664*c83a76b0SSuyog Pawar
665*c83a76b0SSuyog Pawar num_pu = pic_size / (MIN_PU_SIZE * MIN_PU_SIZE);
666*c83a76b0SSuyog Pawar num_ctb = pic_size / (MIN_CTB_SIZE * MIN_CTB_SIZE);
667*c83a76b0SSuyog Pawar
668*c83a76b0SSuyog Pawar
669*c83a76b0SSuyog Pawar mv_bank_size_allocated -= pic_mv_bank_size;
670*c83a76b0SSuyog Pawar
671*c83a76b0SSuyog Pawar if(mv_bank_size_allocated < 0)
672*c83a76b0SSuyog Pawar {
673*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_INSUFFICIENT_MEM_MVBANK;
674*c83a76b0SSuyog Pawar return IHEVCD_INSUFFICIENT_MEM_MVBANK;
675*c83a76b0SSuyog Pawar }
676*c83a76b0SSuyog Pawar
677*c83a76b0SSuyog Pawar ps_mv_buf->pu4_pic_pu_idx = (UWORD32 *)pu1_buf;
678*c83a76b0SSuyog Pawar pu1_buf += (num_ctb + 1) * sizeof(WORD32);
679*c83a76b0SSuyog Pawar
680*c83a76b0SSuyog Pawar ps_mv_buf->pu1_pic_pu_map = pu1_buf;
681*c83a76b0SSuyog Pawar pu1_buf += num_pu;
682*c83a76b0SSuyog Pawar
683*c83a76b0SSuyog Pawar ps_mv_buf->pu1_pic_slice_map = (UWORD16 *)pu1_buf;
684*c83a76b0SSuyog Pawar pu1_buf += ALIGN4(num_ctb * sizeof(UWORD16));
685*c83a76b0SSuyog Pawar
686*c83a76b0SSuyog Pawar ps_mv_buf->ps_pic_pu = (pu_t *)pu1_buf;
687*c83a76b0SSuyog Pawar pu1_buf += num_pu * sizeof(pu_t);
688*c83a76b0SSuyog Pawar
689*c83a76b0SSuyog Pawar buf_ret = ihevc_buf_mgr_add((buf_mgr_t *)ps_codec->pv_mv_buf_mgr, ps_mv_buf, i);
690*c83a76b0SSuyog Pawar
691*c83a76b0SSuyog Pawar if(0 != buf_ret)
692*c83a76b0SSuyog Pawar {
693*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_BUF_MGR_ERROR;
694*c83a76b0SSuyog Pawar return IHEVCD_BUF_MGR_ERROR;
695*c83a76b0SSuyog Pawar }
696*c83a76b0SSuyog Pawar
697*c83a76b0SSuyog Pawar ps_mv_buf++;
698*c83a76b0SSuyog Pawar
699*c83a76b0SSuyog Pawar }
700*c83a76b0SSuyog Pawar return ret;
701*c83a76b0SSuyog Pawar }
702*c83a76b0SSuyog Pawar /**
703*c83a76b0SSuyog Pawar *******************************************************************************
704*c83a76b0SSuyog Pawar *
705*c83a76b0SSuyog Pawar * @brief
706*c83a76b0SSuyog Pawar * Output buffer check
707*c83a76b0SSuyog Pawar *
708*c83a76b0SSuyog Pawar * @par Description:
709*c83a76b0SSuyog Pawar * Check for the number of buffers and buffer sizes of output buffer
710*c83a76b0SSuyog Pawar *
711*c83a76b0SSuyog Pawar * @param[in] ps_codec
712*c83a76b0SSuyog Pawar * Pointer to codec context
713*c83a76b0SSuyog Pawar *
714*c83a76b0SSuyog Pawar * @returns Error from IHEVCD_ERROR_T
715*c83a76b0SSuyog Pawar *
716*c83a76b0SSuyog Pawar * @remarks
717*c83a76b0SSuyog Pawar *
718*c83a76b0SSuyog Pawar *
719*c83a76b0SSuyog Pawar *******************************************************************************
720*c83a76b0SSuyog Pawar */
ihevcd_check_out_buf_size(codec_t * ps_codec)721*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_check_out_buf_size(codec_t *ps_codec)
722*c83a76b0SSuyog Pawar {
723*c83a76b0SSuyog Pawar ivd_out_bufdesc_t *ps_out_buffer = ps_codec->ps_out_buffer;
724*c83a76b0SSuyog Pawar UWORD32 au4_min_out_buf_size[IVD_VIDDEC_MAX_IO_BUFFERS];
725*c83a76b0SSuyog Pawar UWORD32 u4_min_num_out_bufs = 0, i;
726*c83a76b0SSuyog Pawar UWORD32 wd, ht;
727*c83a76b0SSuyog Pawar
728*c83a76b0SSuyog Pawar if(0 == ps_codec->i4_share_disp_buf)
729*c83a76b0SSuyog Pawar {
730*c83a76b0SSuyog Pawar wd = ps_codec->i4_disp_wd;
731*c83a76b0SSuyog Pawar ht = ps_codec->i4_disp_ht;
732*c83a76b0SSuyog Pawar }
733*c83a76b0SSuyog Pawar else
734*c83a76b0SSuyog Pawar {
735*c83a76b0SSuyog Pawar /* In case of shared mode, do not check validity of ps_codec->ps_out_buffer */
736*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
737*c83a76b0SSuyog Pawar }
738*c83a76b0SSuyog Pawar
739*c83a76b0SSuyog Pawar if(ps_codec->i4_disp_strd > (WORD32)wd)
740*c83a76b0SSuyog Pawar wd = ps_codec->i4_disp_strd;
741*c83a76b0SSuyog Pawar
742*c83a76b0SSuyog Pawar if(ps_codec->e_chroma_fmt == IV_YUV_420P)
743*c83a76b0SSuyog Pawar u4_min_num_out_bufs = MIN_OUT_BUFS_420;
744*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_YUV_422ILE)
745*c83a76b0SSuyog Pawar u4_min_num_out_bufs = MIN_OUT_BUFS_422ILE;
746*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_RGB_565)
747*c83a76b0SSuyog Pawar u4_min_num_out_bufs = MIN_OUT_BUFS_RGB565;
748*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_RGBA_8888)
749*c83a76b0SSuyog Pawar u4_min_num_out_bufs = MIN_OUT_BUFS_RGBA8888;
750*c83a76b0SSuyog Pawar else if((ps_codec->e_chroma_fmt == IV_YUV_420SP_UV)
751*c83a76b0SSuyog Pawar || (ps_codec->e_chroma_fmt == IV_YUV_420SP_VU))
752*c83a76b0SSuyog Pawar u4_min_num_out_bufs = MIN_OUT_BUFS_420SP;
753*c83a76b0SSuyog Pawar
754*c83a76b0SSuyog Pawar if(ps_codec->e_chroma_fmt == IV_YUV_420P)
755*c83a76b0SSuyog Pawar {
756*c83a76b0SSuyog Pawar au4_min_out_buf_size[0] = (wd * ht);
757*c83a76b0SSuyog Pawar au4_min_out_buf_size[1] = (wd * ht) >> 2;
758*c83a76b0SSuyog Pawar au4_min_out_buf_size[2] = (wd * ht) >> 2;
759*c83a76b0SSuyog Pawar }
760*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_YUV_422ILE)
761*c83a76b0SSuyog Pawar {
762*c83a76b0SSuyog Pawar au4_min_out_buf_size[0] = (wd * ht) * 2;
763*c83a76b0SSuyog Pawar au4_min_out_buf_size[1] =
764*c83a76b0SSuyog Pawar au4_min_out_buf_size[2] = 0;
765*c83a76b0SSuyog Pawar }
766*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_RGB_565)
767*c83a76b0SSuyog Pawar {
768*c83a76b0SSuyog Pawar au4_min_out_buf_size[0] = (wd * ht) * 2;
769*c83a76b0SSuyog Pawar au4_min_out_buf_size[1] =
770*c83a76b0SSuyog Pawar au4_min_out_buf_size[2] = 0;
771*c83a76b0SSuyog Pawar }
772*c83a76b0SSuyog Pawar else if(ps_codec->e_chroma_fmt == IV_RGBA_8888)
773*c83a76b0SSuyog Pawar {
774*c83a76b0SSuyog Pawar au4_min_out_buf_size[0] = (wd * ht) * 4;
775*c83a76b0SSuyog Pawar au4_min_out_buf_size[1] =
776*c83a76b0SSuyog Pawar au4_min_out_buf_size[2] = 0;
777*c83a76b0SSuyog Pawar }
778*c83a76b0SSuyog Pawar else if((ps_codec->e_chroma_fmt == IV_YUV_420SP_UV)
779*c83a76b0SSuyog Pawar || (ps_codec->e_chroma_fmt == IV_YUV_420SP_VU))
780*c83a76b0SSuyog Pawar {
781*c83a76b0SSuyog Pawar au4_min_out_buf_size[0] = (wd * ht);
782*c83a76b0SSuyog Pawar au4_min_out_buf_size[1] = (wd * ht) >> 1;
783*c83a76b0SSuyog Pawar au4_min_out_buf_size[2] = 0;
784*c83a76b0SSuyog Pawar }
785*c83a76b0SSuyog Pawar
786*c83a76b0SSuyog Pawar if(ps_out_buffer->u4_num_bufs < u4_min_num_out_bufs)
787*c83a76b0SSuyog Pawar {
788*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IV_FAIL;
789*c83a76b0SSuyog Pawar }
790*c83a76b0SSuyog Pawar
791*c83a76b0SSuyog Pawar for (i = 0 ; i < u4_min_num_out_bufs; i++)
792*c83a76b0SSuyog Pawar {
793*c83a76b0SSuyog Pawar if(ps_out_buffer->u4_min_out_buf_size[i] < au4_min_out_buf_size[i])
794*c83a76b0SSuyog Pawar {
795*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IV_FAIL;
796*c83a76b0SSuyog Pawar }
797*c83a76b0SSuyog Pawar }
798*c83a76b0SSuyog Pawar
799*c83a76b0SSuyog Pawar return (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
800*c83a76b0SSuyog Pawar }
801*c83a76b0SSuyog Pawar
802*c83a76b0SSuyog Pawar /**
803*c83a76b0SSuyog Pawar *******************************************************************************
804*c83a76b0SSuyog Pawar *
805*c83a76b0SSuyog Pawar * @brief
806*c83a76b0SSuyog Pawar * Picture level initializations required during parsing
807*c83a76b0SSuyog Pawar *
808*c83a76b0SSuyog Pawar * @par Description:
809*c83a76b0SSuyog Pawar * Initialize picture level context variables during parsing Initialize mv
810*c83a76b0SSuyog Pawar * bank buffer manager in the first init call
811*c83a76b0SSuyog Pawar *
812*c83a76b0SSuyog Pawar * @param[in] ps_codec
813*c83a76b0SSuyog Pawar * Pointer to codec context
814*c83a76b0SSuyog Pawar *
815*c83a76b0SSuyog Pawar * @returns Error from IHEVCD_ERROR_T
816*c83a76b0SSuyog Pawar *
817*c83a76b0SSuyog Pawar * @remarks
818*c83a76b0SSuyog Pawar *
819*c83a76b0SSuyog Pawar *
820*c83a76b0SSuyog Pawar *******************************************************************************
821*c83a76b0SSuyog Pawar */
ihevcd_parse_pic_init(codec_t * ps_codec)822*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ihevcd_parse_pic_init(codec_t *ps_codec)
823*c83a76b0SSuyog Pawar {
824*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ret = (IHEVCD_ERROR_T)IHEVCD_SUCCESS;
825*c83a76b0SSuyog Pawar mv_buf_t *ps_mv_buf;
826*c83a76b0SSuyog Pawar sps_t *ps_sps;
827*c83a76b0SSuyog Pawar WORD32 num_min_cu;
828*c83a76b0SSuyog Pawar WORD32 cur_pic_buf_id;
829*c83a76b0SSuyog Pawar WORD32 cur_mv_bank_buf_id;
830*c83a76b0SSuyog Pawar pic_buf_t *ps_cur_pic;
831*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr;
832*c83a76b0SSuyog Pawar UWORD8 *pu1_cur_pic_luma, *pu1_cur_pic_chroma;
833*c83a76b0SSuyog Pawar WORD32 i;
834*c83a76b0SSuyog Pawar
835*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_SUCCESS;
836*c83a76b0SSuyog Pawar ps_sps = ps_codec->s_parse.ps_sps;
837*c83a76b0SSuyog Pawar ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
838*c83a76b0SSuyog Pawar
839*c83a76b0SSuyog Pawar /* Memset picture level intra map and transquant bypass map to zero */
840*c83a76b0SSuyog Pawar num_min_cu = ((ps_sps->i2_pic_height_in_luma_samples + 7) / 8) * ((ps_sps->i2_pic_width_in_luma_samples + 63) / 64);
841*c83a76b0SSuyog Pawar memset(ps_codec->s_parse.pu1_pic_intra_flag, 0, num_min_cu);
842*c83a76b0SSuyog Pawar memset(ps_codec->s_parse.pu1_pic_no_loop_filter_flag, 0, num_min_cu);
843*c83a76b0SSuyog Pawar
844*c83a76b0SSuyog Pawar
845*c83a76b0SSuyog Pawar
846*c83a76b0SSuyog Pawar if(0 == ps_codec->s_parse.i4_first_pic_init)
847*c83a76b0SSuyog Pawar {
848*c83a76b0SSuyog Pawar ret = ihevcd_mv_buf_mgr_add_bufs(ps_codec);
849*c83a76b0SSuyog Pawar RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
850*c83a76b0SSuyog Pawar
851*c83a76b0SSuyog Pawar ret = ihevcd_pic_buf_mgr_add_bufs(ps_codec);
852*c83a76b0SSuyog Pawar RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
853*c83a76b0SSuyog Pawar
854*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_first_pic_init = 1;
855*c83a76b0SSuyog Pawar }
856*c83a76b0SSuyog Pawar
857*c83a76b0SSuyog Pawar /* Output buffer check */
858*c83a76b0SSuyog Pawar ret = ihevcd_check_out_buf_size(ps_codec);
859*c83a76b0SSuyog Pawar RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
860*c83a76b0SSuyog Pawar
861*c83a76b0SSuyog Pawar /* Initialize all the slice headers' slice addresses to zero */
862*c83a76b0SSuyog Pawar {
863*c83a76b0SSuyog Pawar WORD32 slice_idx;
864*c83a76b0SSuyog Pawar WORD32 slice_start_idx;
865*c83a76b0SSuyog Pawar
866*c83a76b0SSuyog Pawar slice_start_idx = ps_codec->i4_slice_error ? 2 : 1;
867*c83a76b0SSuyog Pawar
868*c83a76b0SSuyog Pawar for(slice_idx = slice_start_idx; slice_idx < MAX_SLICE_HDR_CNT; slice_idx++)
869*c83a76b0SSuyog Pawar {
870*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr_tmp = ps_codec->ps_slice_hdr_base + slice_idx;
871*c83a76b0SSuyog Pawar ps_slice_hdr_tmp->i2_ctb_x = -1;
872*c83a76b0SSuyog Pawar ps_slice_hdr_tmp->i2_ctb_y = -1;
873*c83a76b0SSuyog Pawar
874*c83a76b0SSuyog Pawar }
875*c83a76b0SSuyog Pawar }
876*c83a76b0SSuyog Pawar
877*c83a76b0SSuyog Pawar /* Get free MV Bank to hold current picture's motion vector data */
878*c83a76b0SSuyog Pawar {
879*c83a76b0SSuyog Pawar ps_mv_buf = (mv_buf_t *)ihevc_buf_mgr_get_next_free((buf_mgr_t *)ps_codec->pv_mv_buf_mgr, &cur_mv_bank_buf_id);
880*c83a76b0SSuyog Pawar
881*c83a76b0SSuyog Pawar /* If there are no free buffers then return with an error code.
882*c83a76b0SSuyog Pawar * If the buffer is to be freed by another thread , change the
883*c83a76b0SSuyog Pawar * following to call thread yield and wait for buffer to be freed
884*c83a76b0SSuyog Pawar */
885*c83a76b0SSuyog Pawar if(NULL == ps_mv_buf)
886*c83a76b0SSuyog Pawar {
887*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_NO_FREE_MVBANK;
888*c83a76b0SSuyog Pawar ps_codec->i4_error_code = IHEVCD_NO_FREE_MVBANK;
889*c83a76b0SSuyog Pawar return IHEVCD_NO_FREE_MVBANK;
890*c83a76b0SSuyog Pawar }
891*c83a76b0SSuyog Pawar
892*c83a76b0SSuyog Pawar ps_codec->s_parse.ps_cur_mv_buf = ps_mv_buf;
893*c83a76b0SSuyog Pawar /* Set current ABS poc to ps_mv_buf, so that while freeing a reference buffer
894*c83a76b0SSuyog Pawar * corresponding mv buffer can be found by looping through ps_codec->ps_mv_buf array
895*c83a76b0SSuyog Pawar * and getting a buffer id to free
896*c83a76b0SSuyog Pawar */
897*c83a76b0SSuyog Pawar ps_mv_buf->i4_abs_poc = ps_slice_hdr->i4_abs_pic_order_cnt;
898*c83a76b0SSuyog Pawar }
899*c83a76b0SSuyog Pawar
900*c83a76b0SSuyog Pawar /* Get free picture buffer to hold current picture recon data */
901*c83a76b0SSuyog Pawar /* TODO: For asynchronous api the following initializations related to picture
902*c83a76b0SSuyog Pawar * buffer should be moved to processing side
903*c83a76b0SSuyog Pawar */
904*c83a76b0SSuyog Pawar {
905*c83a76b0SSuyog Pawar
906*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
907*c83a76b0SSuyog Pawar ps_cur_pic = (pic_buf_t *)ihevc_buf_mgr_get_next_free((buf_mgr_t *)ps_codec->pv_pic_buf_mgr, &cur_pic_buf_id);
908*c83a76b0SSuyog Pawar
909*c83a76b0SSuyog Pawar /* If there are no free buffers then return with an error code.
910*c83a76b0SSuyog Pawar * TODO: If the buffer is to be freed by another thread , change the
911*c83a76b0SSuyog Pawar * following to call thread yield and wait for buffer to be freed
912*c83a76b0SSuyog Pawar */
913*c83a76b0SSuyog Pawar if(NULL == ps_cur_pic)
914*c83a76b0SSuyog Pawar {
915*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_error_code = IHEVCD_NO_FREE_PICBUF;
916*c83a76b0SSuyog Pawar ps_codec->i4_error_code = IHEVCD_NO_FREE_PICBUF;
917*c83a76b0SSuyog Pawar return IHEVCD_NO_FREE_PICBUF;
918*c83a76b0SSuyog Pawar }
919*c83a76b0SSuyog Pawar
920*c83a76b0SSuyog Pawar /* Store input timestamp sent with input buffer */
921*c83a76b0SSuyog Pawar ps_cur_pic->u4_ts = ps_codec->u4_ts;
922*c83a76b0SSuyog Pawar ps_cur_pic->i4_abs_poc = ps_slice_hdr->i4_abs_pic_order_cnt;
923*c83a76b0SSuyog Pawar ps_cur_pic->i4_poc_lsb = ps_slice_hdr->i4_pic_order_cnt_lsb;
924*c83a76b0SSuyog Pawar pu1_buf = ps_cur_pic->pu1_luma;
925*c83a76b0SSuyog Pawar pu1_cur_pic_luma = pu1_buf;
926*c83a76b0SSuyog Pawar
927*c83a76b0SSuyog Pawar pu1_buf = ps_cur_pic->pu1_chroma;
928*c83a76b0SSuyog Pawar
929*c83a76b0SSuyog Pawar pu1_cur_pic_chroma = pu1_buf;
930*c83a76b0SSuyog Pawar
931*c83a76b0SSuyog Pawar #ifndef DISABLE_SEI
932*c83a76b0SSuyog Pawar ps_cur_pic->s_sei_params.i1_sei_parameters_present_flag = 0;
933*c83a76b0SSuyog Pawar if(ps_codec->s_parse.s_sei_params.i1_sei_parameters_present_flag)
934*c83a76b0SSuyog Pawar {
935*c83a76b0SSuyog Pawar sei_params_t *ps_sei = &ps_codec->s_parse.s_sei_params;
936*c83a76b0SSuyog Pawar ps_cur_pic->s_sei_params = ps_codec->s_parse.s_sei_params;
937*c83a76b0SSuyog Pawar
938*c83a76b0SSuyog Pawar /* Once sei_params is copied to pic_buf,
939*c83a76b0SSuyog Pawar * mark sei_params in s_parse as not present,
940*c83a76b0SSuyog Pawar * this ensures that future frames do not use this data again.
941*c83a76b0SSuyog Pawar */
942*c83a76b0SSuyog Pawar ps_sei->i1_sei_parameters_present_flag = 0;
943*c83a76b0SSuyog Pawar ps_sei->i1_user_data_registered_present_flag = 0;
944*c83a76b0SSuyog Pawar ps_sei->i1_aud_present_flag = 0;
945*c83a76b0SSuyog Pawar ps_sei->i1_time_code_present_flag = 0;
946*c83a76b0SSuyog Pawar ps_sei->i1_buf_period_params_present_flag = 0;
947*c83a76b0SSuyog Pawar ps_sei->i1_pic_timing_params_present_flag = 0;
948*c83a76b0SSuyog Pawar ps_sei->i1_recovery_point_params_present_flag = 0;
949*c83a76b0SSuyog Pawar ps_sei->i1_active_parameter_set = 0;
950*c83a76b0SSuyog Pawar ps_sei->i4_sei_mastering_disp_colour_vol_params_present_flags = 0;
951*c83a76b0SSuyog Pawar }
952*c83a76b0SSuyog Pawar #endif
953*c83a76b0SSuyog Pawar }
954*c83a76b0SSuyog Pawar
955*c83a76b0SSuyog Pawar if(0 == ps_codec->u4_pic_cnt)
956*c83a76b0SSuyog Pawar {
957*c83a76b0SSuyog Pawar memset(ps_cur_pic->pu1_luma, 128, (ps_sps->i2_pic_width_in_luma_samples + PAD_WD) * ps_sps->i2_pic_height_in_luma_samples);
958*c83a76b0SSuyog Pawar memset(ps_cur_pic->pu1_chroma, 128, (ps_sps->i2_pic_width_in_luma_samples + PAD_WD) * ps_sps->i2_pic_height_in_luma_samples / 2);
959*c83a76b0SSuyog Pawar }
960*c83a76b0SSuyog Pawar
961*c83a76b0SSuyog Pawar /* Fill the remaining entries of the reference lists with the nearest POC
962*c83a76b0SSuyog Pawar * This is done to handle cases where there is a corruption in the reference index */
963*c83a76b0SSuyog Pawar {
964*c83a76b0SSuyog Pawar pic_buf_t *ps_pic_buf_ref;
965*c83a76b0SSuyog Pawar mv_buf_t *ps_mv_buf_ref;
966*c83a76b0SSuyog Pawar WORD32 r_idx;
967*c83a76b0SSuyog Pawar dpb_mgr_t *ps_dpb_mgr = (dpb_mgr_t *)ps_codec->pv_dpb_mgr;
968*c83a76b0SSuyog Pawar buf_mgr_t *ps_mv_buf_mgr = (buf_mgr_t *)ps_codec->pv_mv_buf_mgr;
969*c83a76b0SSuyog Pawar
970*c83a76b0SSuyog Pawar ps_pic_buf_ref = ihevc_dpb_mgr_get_ref_by_nearest_poc(ps_dpb_mgr, ps_slice_hdr->i4_abs_pic_order_cnt);
971*c83a76b0SSuyog Pawar if(NULL == ps_pic_buf_ref)
972*c83a76b0SSuyog Pawar {
973*c83a76b0SSuyog Pawar WORD32 size;
974*c83a76b0SSuyog Pawar
975*c83a76b0SSuyog Pawar WORD32 num_pu;
976*c83a76b0SSuyog Pawar WORD32 num_ctb;
977*c83a76b0SSuyog Pawar WORD32 pic_size;
978*c83a76b0SSuyog Pawar /* In case current mv buffer itself is being used as reference mv buffer for colocated
979*c83a76b0SSuyog Pawar * calculations, then memset all the buffers to zero.
980*c83a76b0SSuyog Pawar */
981*c83a76b0SSuyog Pawar pic_size = ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
982*c83a76b0SSuyog Pawar ALIGN64(ps_sps->i2_pic_height_in_luma_samples);
983*c83a76b0SSuyog Pawar
984*c83a76b0SSuyog Pawar num_pu = pic_size / (MIN_PU_SIZE * MIN_PU_SIZE);
985*c83a76b0SSuyog Pawar num_ctb = pic_size / (MIN_CTB_SIZE * MIN_CTB_SIZE);
986*c83a76b0SSuyog Pawar
987*c83a76b0SSuyog Pawar memset(ps_mv_buf->ai4_l0_collocated_poc, 0, sizeof(ps_mv_buf->ai4_l0_collocated_poc));
988*c83a76b0SSuyog Pawar memset(ps_mv_buf->ai1_l0_collocated_poc_lt, 0, sizeof(ps_mv_buf->ai1_l0_collocated_poc_lt));
989*c83a76b0SSuyog Pawar memset(ps_mv_buf->ai4_l1_collocated_poc, 0, sizeof(ps_mv_buf->ai4_l1_collocated_poc));
990*c83a76b0SSuyog Pawar memset(ps_mv_buf->ai1_l1_collocated_poc_lt, 0, sizeof(ps_mv_buf->ai1_l1_collocated_poc_lt));
991*c83a76b0SSuyog Pawar
992*c83a76b0SSuyog Pawar size = (num_ctb + 1) * sizeof(WORD32);
993*c83a76b0SSuyog Pawar memset(ps_mv_buf->pu4_pic_pu_idx, 0, size);
994*c83a76b0SSuyog Pawar
995*c83a76b0SSuyog Pawar size = num_pu;
996*c83a76b0SSuyog Pawar memset(ps_mv_buf->pu1_pic_pu_map, 0, size);
997*c83a76b0SSuyog Pawar size = ALIGN4(num_ctb * sizeof(UWORD16));
998*c83a76b0SSuyog Pawar memset(ps_mv_buf->pu1_pic_slice_map, 0, size);
999*c83a76b0SSuyog Pawar size = num_pu * sizeof(pu_t);
1000*c83a76b0SSuyog Pawar memset(ps_mv_buf->ps_pic_pu, 0, size);
1001*c83a76b0SSuyog Pawar
1002*c83a76b0SSuyog Pawar ps_pic_buf_ref = ps_cur_pic;
1003*c83a76b0SSuyog Pawar ps_mv_buf_ref = ps_mv_buf;
1004*c83a76b0SSuyog Pawar }
1005*c83a76b0SSuyog Pawar else
1006*c83a76b0SSuyog Pawar {
1007*c83a76b0SSuyog Pawar ps_mv_buf_ref = ihevcd_mv_mgr_get_poc(ps_mv_buf_mgr, ps_pic_buf_ref->i4_abs_poc);
1008*c83a76b0SSuyog Pawar }
1009*c83a76b0SSuyog Pawar
1010*c83a76b0SSuyog Pawar for(r_idx = 0; r_idx < ps_slice_hdr->i1_num_ref_idx_l0_active; r_idx++)
1011*c83a76b0SSuyog Pawar {
1012*c83a76b0SSuyog Pawar if(NULL == ps_slice_hdr->as_ref_pic_list0[r_idx].pv_pic_buf)
1013*c83a76b0SSuyog Pawar {
1014*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list0[r_idx].pv_pic_buf = (void *)ps_pic_buf_ref;
1015*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list0[r_idx].pv_mv_buf = (void *)ps_mv_buf_ref;
1016*c83a76b0SSuyog Pawar }
1017*c83a76b0SSuyog Pawar }
1018*c83a76b0SSuyog Pawar
1019*c83a76b0SSuyog Pawar for(r_idx = ps_slice_hdr->i1_num_ref_idx_l0_active; r_idx < MAX_DPB_SIZE; r_idx++)
1020*c83a76b0SSuyog Pawar {
1021*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list0[r_idx].pv_pic_buf = (void *)ps_pic_buf_ref;
1022*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list0[r_idx].pv_mv_buf = (void *)ps_mv_buf_ref;
1023*c83a76b0SSuyog Pawar }
1024*c83a76b0SSuyog Pawar
1025*c83a76b0SSuyog Pawar for(r_idx = 0; r_idx < ps_slice_hdr->i1_num_ref_idx_l1_active; r_idx++)
1026*c83a76b0SSuyog Pawar {
1027*c83a76b0SSuyog Pawar if(NULL == ps_slice_hdr->as_ref_pic_list1[r_idx].pv_pic_buf)
1028*c83a76b0SSuyog Pawar {
1029*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list1[r_idx].pv_pic_buf = (void *)ps_pic_buf_ref;
1030*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list1[r_idx].pv_mv_buf = (void *)ps_mv_buf_ref;
1031*c83a76b0SSuyog Pawar }
1032*c83a76b0SSuyog Pawar }
1033*c83a76b0SSuyog Pawar
1034*c83a76b0SSuyog Pawar for(r_idx = ps_slice_hdr->i1_num_ref_idx_l1_active; r_idx < MAX_DPB_SIZE; r_idx++)
1035*c83a76b0SSuyog Pawar {
1036*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list1[r_idx].pv_pic_buf = (void *)ps_pic_buf_ref;
1037*c83a76b0SSuyog Pawar ps_slice_hdr->as_ref_pic_list1[r_idx].pv_mv_buf = (void *)ps_mv_buf_ref;
1038*c83a76b0SSuyog Pawar }
1039*c83a76b0SSuyog Pawar }
1040*c83a76b0SSuyog Pawar
1041*c83a76b0SSuyog Pawar
1042*c83a76b0SSuyog Pawar /* Reset the jobq to start of the jobq buffer */
1043*c83a76b0SSuyog Pawar ihevcd_jobq_reset((jobq_t *)ps_codec->pv_proc_jobq);
1044*c83a76b0SSuyog Pawar
1045*c83a76b0SSuyog Pawar if(ps_codec->i4_threads_active)
1046*c83a76b0SSuyog Pawar {
1047*c83a76b0SSuyog Pawar ps_codec->i4_break_threads = 0;
1048*c83a76b0SSuyog Pawar }
1049*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_pic_pu_idx = 0;
1050*c83a76b0SSuyog Pawar ps_codec->s_parse.i4_pic_tu_idx = 0;
1051*c83a76b0SSuyog Pawar
1052*c83a76b0SSuyog Pawar ps_codec->s_parse.pu1_pic_pu_map = ps_mv_buf->pu1_pic_pu_map;
1053*c83a76b0SSuyog Pawar ps_codec->s_parse.ps_pic_pu = ps_mv_buf->ps_pic_pu;
1054*c83a76b0SSuyog Pawar ps_codec->s_parse.pu4_pic_pu_idx = ps_mv_buf->pu4_pic_pu_idx;
1055*c83a76b0SSuyog Pawar ps_codec->s_parse.pu1_slice_idx = (UWORD16 *)ps_mv_buf->pu1_pic_slice_map;
1056*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PROCESS_THREADS; i++)
1057*c83a76b0SSuyog Pawar {
1058*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_slice_idx = (UWORD16 *)ps_mv_buf->pu1_pic_slice_map;
1059*c83a76b0SSuyog Pawar }
1060*c83a76b0SSuyog Pawar ps_codec->s_parse.pu1_pu_map = ps_codec->s_parse.pu1_pic_pu_map;
1061*c83a76b0SSuyog Pawar ps_codec->s_parse.ps_pu = ps_codec->s_parse.ps_pic_pu;
1062*c83a76b0SSuyog Pawar
1063*c83a76b0SSuyog Pawar {
1064*c83a76b0SSuyog Pawar UWORD8 *pu1_buf;
1065*c83a76b0SSuyog Pawar WORD32 ctb_luma_min_tu_cnt, ctb_chroma_min_tu_cnt, ctb_min_tu_cnt;
1066*c83a76b0SSuyog Pawar WORD32 pic_size;
1067*c83a76b0SSuyog Pawar WORD32 num_ctb;
1068*c83a76b0SSuyog Pawar
1069*c83a76b0SSuyog Pawar pic_size = ALIGN64(ps_sps->i2_pic_width_in_luma_samples) *
1070*c83a76b0SSuyog Pawar ALIGN64(ps_sps->i2_pic_height_in_luma_samples);
1071*c83a76b0SSuyog Pawar
1072*c83a76b0SSuyog Pawar ctb_luma_min_tu_cnt = pic_size / (MIN_TU_SIZE * MIN_TU_SIZE);
1073*c83a76b0SSuyog Pawar
1074*c83a76b0SSuyog Pawar ctb_chroma_min_tu_cnt = ctb_luma_min_tu_cnt >> 1;
1075*c83a76b0SSuyog Pawar
1076*c83a76b0SSuyog Pawar ctb_min_tu_cnt = ctb_luma_min_tu_cnt + ctb_chroma_min_tu_cnt;
1077*c83a76b0SSuyog Pawar
1078*c83a76b0SSuyog Pawar num_ctb = pic_size / (MIN_CTB_SIZE * MIN_CTB_SIZE);
1079*c83a76b0SSuyog Pawar pu1_buf = (UWORD8 *)ps_codec->pv_tu_data;
1080*c83a76b0SSuyog Pawar ps_codec->s_parse.pu4_pic_tu_idx = (UWORD32 *)pu1_buf;
1081*c83a76b0SSuyog Pawar pu1_buf += (num_ctb + 1) * sizeof(WORD32);
1082*c83a76b0SSuyog Pawar
1083*c83a76b0SSuyog Pawar ps_codec->s_parse.pu1_pic_tu_map = pu1_buf;
1084*c83a76b0SSuyog Pawar pu1_buf += ctb_min_tu_cnt;
1085*c83a76b0SSuyog Pawar
1086*c83a76b0SSuyog Pawar ps_codec->s_parse.ps_pic_tu = (tu_t *)pu1_buf;
1087*c83a76b0SSuyog Pawar pu1_buf += ctb_min_tu_cnt * sizeof(tu_t);
1088*c83a76b0SSuyog Pawar
1089*c83a76b0SSuyog Pawar ps_codec->s_parse.pv_pic_tu_coeff_data = pu1_buf;
1090*c83a76b0SSuyog Pawar
1091*c83a76b0SSuyog Pawar ps_codec->s_parse.pu1_tu_map = ps_codec->s_parse.pu1_pic_tu_map;
1092*c83a76b0SSuyog Pawar ps_codec->s_parse.ps_tu = ps_codec->s_parse.ps_pic_tu;
1093*c83a76b0SSuyog Pawar ps_codec->s_parse.pv_tu_coeff_data = ps_codec->s_parse.pv_pic_tu_coeff_data;
1094*c83a76b0SSuyog Pawar }
1095*c83a76b0SSuyog Pawar
1096*c83a76b0SSuyog Pawar ps_codec->s_parse.s_bs_ctxt.ps_pic_pu = ps_codec->s_parse.ps_pic_pu;
1097*c83a76b0SSuyog Pawar ps_codec->s_parse.s_bs_ctxt.pu4_pic_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx;
1098*c83a76b0SSuyog Pawar ps_codec->s_parse.s_bs_ctxt.pu4_pic_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx;
1099*c83a76b0SSuyog Pawar
1100*c83a76b0SSuyog Pawar
1101*c83a76b0SSuyog Pawar /* Set number of CTBs to be processed simultaneously */
1102*c83a76b0SSuyog Pawar ps_codec->i4_proc_nctb = ihevcd_nctb_cnt(ps_codec, ps_sps);
1103*c83a76b0SSuyog Pawar
1104*c83a76b0SSuyog Pawar /* Memset Parse Map and process map at the start of frame */
1105*c83a76b0SSuyog Pawar //TODO: In case of asynchronous API proc_map can not be set to zero here
1106*c83a76b0SSuyog Pawar {
1107*c83a76b0SSuyog Pawar WORD32 num_ctb;
1108*c83a76b0SSuyog Pawar
1109*c83a76b0SSuyog Pawar num_ctb = ps_sps->i4_pic_size_in_ctb;
1110*c83a76b0SSuyog Pawar
1111*c83a76b0SSuyog Pawar memset(ps_codec->pu1_parse_map, 0, num_ctb);
1112*c83a76b0SSuyog Pawar
1113*c83a76b0SSuyog Pawar memset(ps_codec->pu1_proc_map, 0, num_ctb);
1114*c83a76b0SSuyog Pawar }
1115*c83a76b0SSuyog Pawar
1116*c83a76b0SSuyog Pawar
1117*c83a76b0SSuyog Pawar
1118*c83a76b0SSuyog Pawar /* Initialize disp buf id to -1, this will be updated at the end of frame if there is
1119*c83a76b0SSuyog Pawar * buffer to be displayed
1120*c83a76b0SSuyog Pawar */
1121*c83a76b0SSuyog Pawar ps_codec->i4_disp_buf_id = -1;
1122*c83a76b0SSuyog Pawar ps_codec->ps_disp_buf = NULL;
1123*c83a76b0SSuyog Pawar
1124*c83a76b0SSuyog Pawar ps_codec->i4_disable_deblk_pic = 0;
1125*c83a76b0SSuyog Pawar ps_codec->i4_disable_sao_pic = 0;
1126*c83a76b0SSuyog Pawar ps_codec->i4_fullpel_inter_pred = 0;
1127*c83a76b0SSuyog Pawar ps_codec->i4_mv_frac_mask = 0x7FFFFFFF;
1128*c83a76b0SSuyog Pawar
1129*c83a76b0SSuyog Pawar /* If degrade is enabled, set the degrade flags appropriately */
1130*c83a76b0SSuyog Pawar if(ps_codec->i4_degrade_type && ps_codec->i4_degrade_pics)
1131*c83a76b0SSuyog Pawar {
1132*c83a76b0SSuyog Pawar WORD32 degrade_pic;
1133*c83a76b0SSuyog Pawar ps_codec->i4_degrade_pic_cnt++;
1134*c83a76b0SSuyog Pawar degrade_pic = 0;
1135*c83a76b0SSuyog Pawar
1136*c83a76b0SSuyog Pawar /* If degrade is to be done in all frames, then do not check further */
1137*c83a76b0SSuyog Pawar switch(ps_codec->i4_degrade_pics)
1138*c83a76b0SSuyog Pawar {
1139*c83a76b0SSuyog Pawar case 4:
1140*c83a76b0SSuyog Pawar {
1141*c83a76b0SSuyog Pawar degrade_pic = 1;
1142*c83a76b0SSuyog Pawar break;
1143*c83a76b0SSuyog Pawar }
1144*c83a76b0SSuyog Pawar case 3:
1145*c83a76b0SSuyog Pawar {
1146*c83a76b0SSuyog Pawar if(ps_slice_hdr->i1_slice_type != ISLICE)
1147*c83a76b0SSuyog Pawar degrade_pic = 1;
1148*c83a76b0SSuyog Pawar
1149*c83a76b0SSuyog Pawar break;
1150*c83a76b0SSuyog Pawar }
1151*c83a76b0SSuyog Pawar case 2:
1152*c83a76b0SSuyog Pawar {
1153*c83a76b0SSuyog Pawar
1154*c83a76b0SSuyog Pawar /* If pic count hits non-degrade interval or it is an islice, then do not degrade */
1155*c83a76b0SSuyog Pawar if((ps_slice_hdr->i1_slice_type != ISLICE) &&
1156*c83a76b0SSuyog Pawar (ps_codec->i4_degrade_pic_cnt != ps_codec->i4_nondegrade_interval))
1157*c83a76b0SSuyog Pawar degrade_pic = 1;
1158*c83a76b0SSuyog Pawar
1159*c83a76b0SSuyog Pawar break;
1160*c83a76b0SSuyog Pawar }
1161*c83a76b0SSuyog Pawar case 1:
1162*c83a76b0SSuyog Pawar {
1163*c83a76b0SSuyog Pawar /* Check if the current picture is non-ref */
1164*c83a76b0SSuyog Pawar if((ps_slice_hdr->i1_nal_unit_type < NAL_BLA_W_LP) &&
1165*c83a76b0SSuyog Pawar (ps_slice_hdr->i1_nal_unit_type % 2 == 0))
1166*c83a76b0SSuyog Pawar {
1167*c83a76b0SSuyog Pawar degrade_pic = 1;
1168*c83a76b0SSuyog Pawar }
1169*c83a76b0SSuyog Pawar break;
1170*c83a76b0SSuyog Pawar }
1171*c83a76b0SSuyog Pawar
1172*c83a76b0SSuyog Pawar
1173*c83a76b0SSuyog Pawar }
1174*c83a76b0SSuyog Pawar if(degrade_pic)
1175*c83a76b0SSuyog Pawar {
1176*c83a76b0SSuyog Pawar if(ps_codec->i4_degrade_type & 0x1)
1177*c83a76b0SSuyog Pawar ps_codec->i4_disable_sao_pic = 1;
1178*c83a76b0SSuyog Pawar
1179*c83a76b0SSuyog Pawar if(ps_codec->i4_degrade_type & 0x2)
1180*c83a76b0SSuyog Pawar ps_codec->i4_disable_deblk_pic = 1;
1181*c83a76b0SSuyog Pawar
1182*c83a76b0SSuyog Pawar /* MC degrading is done only for non-ref pictures */
1183*c83a76b0SSuyog Pawar if((ps_slice_hdr->i1_nal_unit_type < NAL_BLA_W_LP) &&
1184*c83a76b0SSuyog Pawar (ps_slice_hdr->i1_nal_unit_type % 2 == 0))
1185*c83a76b0SSuyog Pawar {
1186*c83a76b0SSuyog Pawar if(ps_codec->i4_degrade_type & 0x4)
1187*c83a76b0SSuyog Pawar ps_codec->i4_mv_frac_mask = 0;
1188*c83a76b0SSuyog Pawar
1189*c83a76b0SSuyog Pawar if(ps_codec->i4_degrade_type & 0x8)
1190*c83a76b0SSuyog Pawar ps_codec->i4_mv_frac_mask = 0;
1191*c83a76b0SSuyog Pawar }
1192*c83a76b0SSuyog Pawar }
1193*c83a76b0SSuyog Pawar else
1194*c83a76b0SSuyog Pawar ps_codec->i4_degrade_pic_cnt = 0;
1195*c83a76b0SSuyog Pawar }
1196*c83a76b0SSuyog Pawar
1197*c83a76b0SSuyog Pawar
1198*c83a76b0SSuyog Pawar {
1199*c83a76b0SSuyog Pawar WORD32 i;
1200*c83a76b0SSuyog Pawar for(i = 0; i < MAX_PROCESS_THREADS; i++)
1201*c83a76b0SSuyog Pawar {
1202*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu4_pic_pu_idx = ps_codec->s_parse.pu4_pic_pu_idx;
1203*c83a76b0SSuyog Pawar ps_codec->as_process[i].ps_pic_pu = ps_codec->s_parse.ps_pic_pu;
1204*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_pic_pu_map = ps_codec->s_parse.pu1_pic_pu_map;
1205*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu4_pic_tu_idx = ps_codec->s_parse.pu4_pic_tu_idx;
1206*c83a76b0SSuyog Pawar ps_codec->as_process[i].ps_pic_tu = ps_codec->s_parse.ps_pic_tu;
1207*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_pic_tu_map = ps_codec->s_parse.pu1_pic_tu_map;
1208*c83a76b0SSuyog Pawar ps_codec->as_process[i].pv_pic_tu_coeff_data = ps_codec->s_parse.pv_pic_tu_coeff_data;
1209*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_cur_mv_bank_buf_id = cur_mv_bank_buf_id;
1210*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_sao_ctxt.pu1_slice_idx = ps_codec->as_process[i].pu1_slice_idx;
1211*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_sao_ctxt.pu1_tile_idx = ps_codec->as_process[i].pu1_tile_idx;
1212*c83a76b0SSuyog Pawar
1213*c83a76b0SSuyog Pawar /* TODO: For asynchronous api the following initializations related to picture
1214*c83a76b0SSuyog Pawar * buffer should be moved to processing side
1215*c83a76b0SSuyog Pawar */
1216*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_cur_pic_luma = pu1_cur_pic_luma;
1217*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_cur_pic_chroma = pu1_cur_pic_chroma;
1218*c83a76b0SSuyog Pawar ps_codec->as_process[i].ps_cur_pic = ps_cur_pic;
1219*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_cur_pic_buf_id = cur_pic_buf_id;
1220*c83a76b0SSuyog Pawar
1221*c83a76b0SSuyog Pawar ps_codec->as_process[i].ps_out_buffer = ps_codec->ps_out_buffer;
1222*c83a76b0SSuyog Pawar if(1 < ps_codec->i4_num_cores)
1223*c83a76b0SSuyog Pawar {
1224*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_check_parse_status = 1;
1225*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_check_proc_status = 1;
1226*c83a76b0SSuyog Pawar }
1227*c83a76b0SSuyog Pawar else
1228*c83a76b0SSuyog Pawar {
1229*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_check_parse_status = 0;
1230*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_check_proc_status = 0;
1231*c83a76b0SSuyog Pawar }
1232*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_pic_intra_flag = ps_codec->s_parse.pu1_pic_intra_flag;
1233*c83a76b0SSuyog Pawar ps_codec->as_process[i].pu1_pic_no_loop_filter_flag = ps_codec->s_parse.pu1_pic_no_loop_filter_flag;
1234*c83a76b0SSuyog Pawar ps_codec->as_process[i].i4_init_done = 0;
1235*c83a76b0SSuyog Pawar
1236*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_bs_ctxt.pu4_pic_tu_idx = ps_codec->as_process[i].pu4_pic_tu_idx;
1237*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_bs_ctxt.pu4_pic_pu_idx = ps_codec->as_process[i].pu4_pic_pu_idx;
1238*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_bs_ctxt.ps_pic_pu = ps_codec->as_process[i].ps_pic_pu;
1239*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_deblk_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->s_parse.pu1_pic_no_loop_filter_flag;
1240*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_deblk_ctxt.pu1_cur_pic_luma = pu1_cur_pic_luma;
1241*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_deblk_ctxt.pu1_cur_pic_chroma = pu1_cur_pic_chroma;
1242*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_sao_ctxt.pu1_pic_no_loop_filter_flag = ps_codec->s_parse.pu1_pic_no_loop_filter_flag;
1243*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_sao_ctxt.pu1_cur_pic_luma = pu1_cur_pic_luma;
1244*c83a76b0SSuyog Pawar ps_codec->as_process[i].s_sao_ctxt.pu1_cur_pic_chroma = pu1_cur_pic_chroma;
1245*c83a76b0SSuyog Pawar if(i < (ps_codec->i4_num_cores - 1))
1246*c83a76b0SSuyog Pawar {
1247*c83a76b0SSuyog Pawar if (!ps_codec->ai4_process_thread_created[i])
1248*c83a76b0SSuyog Pawar {
1249*c83a76b0SSuyog Pawar ithread_create(ps_codec->apv_process_thread_handle[i], NULL,
1250*c83a76b0SSuyog Pawar (void *)ihevcd_process_thread,
1251*c83a76b0SSuyog Pawar (void *)&ps_codec->as_process[i]);
1252*c83a76b0SSuyog Pawar ps_codec->ai4_process_thread_created[i] = 1;
1253*c83a76b0SSuyog Pawar }
1254*c83a76b0SSuyog Pawar if(ps_codec->i4_threads_active)
1255*c83a76b0SSuyog Pawar {
1256*c83a76b0SSuyog Pawar ret = ithread_mutex_lock(ps_codec->apv_proc_start_mutex[i]);
1257*c83a76b0SSuyog Pawar RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
1258*c83a76b0SSuyog Pawar
1259*c83a76b0SSuyog Pawar ps_codec->ai4_process_start[i] = 1;
1260*c83a76b0SSuyog Pawar ithread_cond_signal(ps_codec->apv_proc_start_condition[i]);
1261*c83a76b0SSuyog Pawar
1262*c83a76b0SSuyog Pawar ret = ithread_mutex_unlock(ps_codec->apv_proc_start_mutex[i]);
1263*c83a76b0SSuyog Pawar RETURN_IF((ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS), ret);
1264*c83a76b0SSuyog Pawar }
1265*c83a76b0SSuyog Pawar }
1266*c83a76b0SSuyog Pawar else
1267*c83a76b0SSuyog Pawar {
1268*c83a76b0SSuyog Pawar ps_codec->ai4_process_thread_created[i] = 0;
1269*c83a76b0SSuyog Pawar }
1270*c83a76b0SSuyog Pawar
1271*c83a76b0SSuyog Pawar }
1272*c83a76b0SSuyog Pawar if(ps_codec->u1_enable_cu_info)
1273*c83a76b0SSuyog Pawar {
1274*c83a76b0SSuyog Pawar ps_codec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map =
1275*c83a76b0SSuyog Pawar ps_codec->pu1_qp_map_base + (cur_pic_buf_id * ps_codec->u4_num_8x8_blks);
1276*c83a76b0SSuyog Pawar ps_codec->as_buf_id_info_map[cur_pic_buf_id].pu1_cu_type_map =
1277*c83a76b0SSuyog Pawar ps_codec->pu1_cu_type_map_base + (cur_pic_buf_id * ps_codec->u4_num_8x8_blks);
1278*c83a76b0SSuyog Pawar memset(ps_codec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map,
1279*c83a76b0SSuyog Pawar 0, ps_codec->u4_num_8x8_blks);
1280*c83a76b0SSuyog Pawar memset(ps_codec->as_buf_id_info_map[cur_pic_buf_id].pu1_qp_map,
1281*c83a76b0SSuyog Pawar 0, ps_codec->u4_num_8x8_blks);
1282*c83a76b0SSuyog Pawar }
1283*c83a76b0SSuyog Pawar
1284*c83a76b0SSuyog Pawar ps_codec->s_parse.s_deblk_ctxt.pu1_cur_pic_luma = pu1_cur_pic_luma;
1285*c83a76b0SSuyog Pawar ps_codec->s_parse.s_deblk_ctxt.pu1_cur_pic_chroma = pu1_cur_pic_chroma;
1286*c83a76b0SSuyog Pawar
1287*c83a76b0SSuyog Pawar ps_codec->s_parse.s_sao_ctxt.pu1_cur_pic_luma = pu1_cur_pic_luma;
1288*c83a76b0SSuyog Pawar ps_codec->s_parse.s_sao_ctxt.pu1_cur_pic_chroma = pu1_cur_pic_chroma;
1289*c83a76b0SSuyog Pawar }
1290*c83a76b0SSuyog Pawar /* Since any input bitstream buffer that contains slice data will be sent to output(even in
1291*c83a76b0SSuyog Pawar * case of error, this buffer is added to display queue and next buffer in the display queue
1292*c83a76b0SSuyog Pawar * will be returned as the display buffer.
1293*c83a76b0SSuyog Pawar * Note: If format conversion (or frame copy) is used and is scheduled
1294*c83a76b0SSuyog Pawar * in a different thread then it has to check if the processing for the current row is complete before
1295*c83a76b0SSuyog Pawar * it copies/converts a given row. In case of low delay or in case of B pictures, current frame being decoded has to be
1296*c83a76b0SSuyog Pawar * returned, which requires a status check to ensure that the current row is reconstructed before copying.
1297*c83a76b0SSuyog Pawar */
1298*c83a76b0SSuyog Pawar /* Add current picture to display manager */
1299*c83a76b0SSuyog Pawar {
1300*c83a76b0SSuyog Pawar WORD32 abs_poc;
1301*c83a76b0SSuyog Pawar slice_header_t *ps_slice_hdr;
1302*c83a76b0SSuyog Pawar ps_slice_hdr = ps_codec->s_parse.ps_slice_hdr;
1303*c83a76b0SSuyog Pawar abs_poc = ps_slice_hdr->i4_abs_pic_order_cnt;
1304*c83a76b0SSuyog Pawar ihevc_disp_mgr_add((disp_mgr_t *)ps_codec->pv_disp_buf_mgr,
1305*c83a76b0SSuyog Pawar ps_codec->as_process[0].i4_cur_pic_buf_id,
1306*c83a76b0SSuyog Pawar abs_poc,
1307*c83a76b0SSuyog Pawar ps_codec->as_process[0].ps_cur_pic);
1308*c83a76b0SSuyog Pawar }
1309*c83a76b0SSuyog Pawar ps_codec->ps_disp_buf = NULL;
1310*c83a76b0SSuyog Pawar /* Get picture to be displayed if number of pictures decoded is more than max allowed reorder */
1311*c83a76b0SSuyog Pawar /* Since the current will be decoded, check is fore >= instead of > */
1312*c83a76b0SSuyog Pawar if(((WORD32)(ps_codec->u4_pic_cnt - ps_codec->u4_disp_cnt) >= ps_sps->ai1_sps_max_num_reorder_pics[ps_sps->i1_sps_max_sub_layers - 1]) ||
1313*c83a76b0SSuyog Pawar (ps_codec->e_frm_out_mode == IVD_DECODE_FRAME_OUT))
1314*c83a76b0SSuyog Pawar
1315*c83a76b0SSuyog Pawar {
1316*c83a76b0SSuyog Pawar ps_codec->ps_disp_buf = (pic_buf_t *)ihevc_disp_mgr_get((disp_mgr_t *)ps_codec->pv_disp_buf_mgr, &ps_codec->i4_disp_buf_id);
1317*c83a76b0SSuyog Pawar ps_codec->u4_disp_cnt++;
1318*c83a76b0SSuyog Pawar }
1319*c83a76b0SSuyog Pawar
1320*c83a76b0SSuyog Pawar ps_codec->s_fmt_conv.i4_cur_row = 0;
1321*c83a76b0SSuyog Pawar /* Set number of rows to be processed at a time */
1322*c83a76b0SSuyog Pawar ps_codec->s_fmt_conv.i4_num_rows = 4;
1323*c83a76b0SSuyog Pawar
1324*c83a76b0SSuyog Pawar if(ps_codec->u4_enable_fmt_conv_ahead && (ps_codec->i4_num_cores > 1))
1325*c83a76b0SSuyog Pawar {
1326*c83a76b0SSuyog Pawar process_ctxt_t *ps_proc;
1327*c83a76b0SSuyog Pawar
1328*c83a76b0SSuyog Pawar /* i4_num_cores - 1 contexts are currently being used by other threads */
1329*c83a76b0SSuyog Pawar ps_proc = &ps_codec->as_process[ps_codec->i4_num_cores - 1];
1330*c83a76b0SSuyog Pawar
1331*c83a76b0SSuyog Pawar /* If the frame being decoded and displayed are different, schedule format conversion jobs
1332*c83a76b0SSuyog Pawar * this will keep the proc threads busy and lets parse thread decode few CTBs ahead
1333*c83a76b0SSuyog Pawar * If the frame being decoded and displayed are same, then format conversion is scheduled later.
1334*c83a76b0SSuyog Pawar */
1335*c83a76b0SSuyog Pawar if((ps_codec->ps_disp_buf) && (ps_codec->i4_disp_buf_id != ps_proc->i4_cur_pic_buf_id) &&
1336*c83a76b0SSuyog Pawar ((0 == ps_codec->i4_share_disp_buf) || (IV_YUV_420P == ps_codec->e_chroma_fmt)))
1337*c83a76b0SSuyog Pawar {
1338*c83a76b0SSuyog Pawar
1339*c83a76b0SSuyog Pawar for(i = 0; i < ps_sps->i2_pic_ht_in_ctb; i++)
1340*c83a76b0SSuyog Pawar {
1341*c83a76b0SSuyog Pawar proc_job_t s_job;
1342*c83a76b0SSuyog Pawar IHEVCD_ERROR_T ret;
1343*c83a76b0SSuyog Pawar s_job.i4_cmd = CMD_FMTCONV;
1344*c83a76b0SSuyog Pawar s_job.i2_ctb_cnt = 0;
1345*c83a76b0SSuyog Pawar s_job.i2_ctb_x = 0;
1346*c83a76b0SSuyog Pawar s_job.i2_ctb_y = i;
1347*c83a76b0SSuyog Pawar s_job.i2_slice_idx = 0;
1348*c83a76b0SSuyog Pawar s_job.i4_tu_coeff_data_ofst = 0;
1349*c83a76b0SSuyog Pawar ret = ihevcd_jobq_queue((jobq_t *)ps_codec->s_parse.pv_proc_jobq,
1350*c83a76b0SSuyog Pawar &s_job, sizeof(proc_job_t), 1);
1351*c83a76b0SSuyog Pawar if(ret != (IHEVCD_ERROR_T)IHEVCD_SUCCESS)
1352*c83a76b0SSuyog Pawar return ret;
1353*c83a76b0SSuyog Pawar }
1354*c83a76b0SSuyog Pawar }
1355*c83a76b0SSuyog Pawar }
1356*c83a76b0SSuyog Pawar
1357*c83a76b0SSuyog Pawar /* If parse_pic_init is called, then slice data is present in the input bitstrea stream */
1358*c83a76b0SSuyog Pawar ps_codec->i4_pic_present = 1;
1359*c83a76b0SSuyog Pawar
1360*c83a76b0SSuyog Pawar return ret;
1361*c83a76b0SSuyog Pawar }
1362*c83a76b0SSuyog Pawar
1363*c83a76b0SSuyog Pawar
1364