1*495ae853SAndroid Build Coastguard Worker /******************************************************************************
2*495ae853SAndroid Build Coastguard Worker *
3*495ae853SAndroid Build Coastguard Worker * Copyright (C) 2015 The Android Open Source Project
4*495ae853SAndroid Build Coastguard Worker *
5*495ae853SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
6*495ae853SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
7*495ae853SAndroid Build Coastguard Worker * You may obtain a copy of the License at:
8*495ae853SAndroid Build Coastguard Worker *
9*495ae853SAndroid Build Coastguard Worker * http://www.apache.org/licenses/LICENSE-2.0
10*495ae853SAndroid Build Coastguard Worker *
11*495ae853SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
12*495ae853SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
13*495ae853SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*495ae853SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
15*495ae853SAndroid Build Coastguard Worker * limitations under the License.
16*495ae853SAndroid Build Coastguard Worker *
17*495ae853SAndroid Build Coastguard Worker *****************************************************************************
18*495ae853SAndroid Build Coastguard Worker * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*495ae853SAndroid Build Coastguard Worker */
20*495ae853SAndroid Build Coastguard Worker
21*495ae853SAndroid Build Coastguard Worker /**
22*495ae853SAndroid Build Coastguard Worker *******************************************************************************
23*495ae853SAndroid Build Coastguard Worker * @file
24*495ae853SAndroid Build Coastguard Worker * ih264e_modify_frm_rate.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * Handle source frame rate pulldown
28*495ae853SAndroid Build Coastguard Worker *
29*495ae853SAndroid Build Coastguard Worker * @author
30*495ae853SAndroid Build Coastguard Worker * ittiam
31*495ae853SAndroid Build Coastguard Worker *
32*495ae853SAndroid Build Coastguard Worker * @par List of Functions:
33*495ae853SAndroid Build Coastguard Worker * - ih264e_pd_frm_rate_get_init_free_memtab
34*495ae853SAndroid Build Coastguard Worker * - ih264e_init_pd_frm_rate
35*495ae853SAndroid Build Coastguard Worker * - ih264e_update_pd_frm_rate
36*495ae853SAndroid Build Coastguard Worker * - ih264e_get_pd_avg_frm_rate
37*495ae853SAndroid Build Coastguard Worker *
38*495ae853SAndroid Build Coastguard Worker * @remarks
39*495ae853SAndroid Build Coastguard Worker * none
40*495ae853SAndroid Build Coastguard Worker *
41*495ae853SAndroid Build Coastguard Worker *******************************************************************************
42*495ae853SAndroid Build Coastguard Worker */
43*495ae853SAndroid Build Coastguard Worker
44*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
45*495ae853SAndroid Build Coastguard Worker /* File Includes */
46*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
47*495ae853SAndroid Build Coastguard Worker
48*495ae853SAndroid Build Coastguard Worker /* User Include Files */
49*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
50*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
51*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
52*495ae853SAndroid Build Coastguard Worker
53*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
54*495ae853SAndroid Build Coastguard Worker #include "ih264_mem_fns.h"
55*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
56*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
57*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
58*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
59*495ae853SAndroid Build Coastguard Worker #include "ih264_intra_pred_filters.h"
60*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
61*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
62*495ae853SAndroid Build Coastguard Worker
63*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
64*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
65*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
66*495ae853SAndroid Build Coastguard Worker
67*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
68*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
69*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
70*495ae853SAndroid Build Coastguard Worker
71*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264e_rate_control.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
75*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
76*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
77*495ae853SAndroid Build Coastguard Worker #include "ih264e_time_stamp.h"
78*495ae853SAndroid Build Coastguard Worker #include "ih264e_modify_frm_rate.h"
79*495ae853SAndroid Build Coastguard Worker
80*495ae853SAndroid Build Coastguard Worker
81*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
82*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
83*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
84*495ae853SAndroid Build Coastguard Worker
85*495ae853SAndroid Build Coastguard Worker /**
86*495ae853SAndroid Build Coastguard Worker *******************************************************************************
87*495ae853SAndroid Build Coastguard Worker *
88*495ae853SAndroid Build Coastguard Worker * @brief Function to init pd frame rate memtab
89*495ae853SAndroid Build Coastguard Worker *
90*495ae853SAndroid Build Coastguard Worker * @par Description
91*495ae853SAndroid Build Coastguard Worker * Function to init pull down frame rate memtab
92*495ae853SAndroid Build Coastguard Worker *
93*495ae853SAndroid Build Coastguard Worker * @param[in] pps_pd_frm_rate
94*495ae853SAndroid Build Coastguard Worker * pull down frame rate context
95*495ae853SAndroid Build Coastguard Worker *
96*495ae853SAndroid Build Coastguard Worker * @param[in] ps_memtab
97*495ae853SAndroid Build Coastguard Worker * Handle to memtab
98*495ae853SAndroid Build Coastguard Worker *
99*495ae853SAndroid Build Coastguard Worker * @param[in] e_func_type
100*495ae853SAndroid Build Coastguard Worker * Function type (get memtab/ update memtab)
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @returns Number of memtabs used
103*495ae853SAndroid Build Coastguard Worker *
104*495ae853SAndroid Build Coastguard Worker * @remarks None
105*495ae853SAndroid Build Coastguard Worker *
106*495ae853SAndroid Build Coastguard Worker *******************************************************************************
107*495ae853SAndroid Build Coastguard Worker */
ih264e_pd_frm_rate_get_init_free_memtab(pd_frm_rate_handle * pps_pd_frm_rate,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)108*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_pd_frm_rate_get_init_free_memtab(pd_frm_rate_handle *pps_pd_frm_rate,
109*495ae853SAndroid Build Coastguard Worker itt_memtab_t *ps_memtab,
110*495ae853SAndroid Build Coastguard Worker ITT_FUNC_TYPE_E e_func_type)
111*495ae853SAndroid Build Coastguard Worker {
112*495ae853SAndroid Build Coastguard Worker WORD32 i4_mem_tab_idx = 0;
113*495ae853SAndroid Build Coastguard Worker pd_frm_rate_t s_temp_pd_frm_rate_t;
114*495ae853SAndroid Build Coastguard Worker
115*495ae853SAndroid Build Coastguard Worker /* Hack for al alloc, during which we dont have any state memory.
116*495ae853SAndroid Build Coastguard Worker Dereferencing can cause issues */
117*495ae853SAndroid Build Coastguard Worker if (e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
118*495ae853SAndroid Build Coastguard Worker (*pps_pd_frm_rate) = &s_temp_pd_frm_rate_t;
119*495ae853SAndroid Build Coastguard Worker
120*495ae853SAndroid Build Coastguard Worker /* for src rate control state structure */
121*495ae853SAndroid Build Coastguard Worker if (e_func_type != GET_NUM_MEMTAB)
122*495ae853SAndroid Build Coastguard Worker {
123*495ae853SAndroid Build Coastguard Worker fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(pd_frm_rate_t),
124*495ae853SAndroid Build Coastguard Worker ALIGN_128_BYTE, PERSISTENT, DDR);
125*495ae853SAndroid Build Coastguard Worker use_or_fill_base(&ps_memtab[0], (void**) pps_pd_frm_rate, e_func_type);
126*495ae853SAndroid Build Coastguard Worker }
127*495ae853SAndroid Build Coastguard Worker i4_mem_tab_idx++;
128*495ae853SAndroid Build Coastguard Worker
129*495ae853SAndroid Build Coastguard Worker return (i4_mem_tab_idx);
130*495ae853SAndroid Build Coastguard Worker }
131*495ae853SAndroid Build Coastguard Worker
132*495ae853SAndroid Build Coastguard Worker /**
133*495ae853SAndroid Build Coastguard Worker *******************************************************************************
134*495ae853SAndroid Build Coastguard Worker *
135*495ae853SAndroid Build Coastguard Worker * @brief Initializes the pull down frame rate state structure based on input
136*495ae853SAndroid Build Coastguard Worker * frame rate
137*495ae853SAndroid Build Coastguard Worker *
138*495ae853SAndroid Build Coastguard Worker * @par Description
139*495ae853SAndroid Build Coastguard Worker * Initializes the pull down frame rate state structure based on input frame rate
140*495ae853SAndroid Build Coastguard Worker *
141*495ae853SAndroid Build Coastguard Worker * @param[in] ps_pd_frm_rate
142*495ae853SAndroid Build Coastguard Worker * Pull down frame rate context
143*495ae853SAndroid Build Coastguard Worker *
144*495ae853SAndroid Build Coastguard Worker * @param[in] u4_input_frm_rate
145*495ae853SAndroid Build Coastguard Worker * Input frame rate in frame per 1000sec
146*495ae853SAndroid Build Coastguard Worker *
147*495ae853SAndroid Build Coastguard Worker * @returns none
148*495ae853SAndroid Build Coastguard Worker *
149*495ae853SAndroid Build Coastguard Worker * @remarks
150*495ae853SAndroid Build Coastguard Worker *
151*495ae853SAndroid Build Coastguard Worker *******************************************************************************
152*495ae853SAndroid Build Coastguard Worker */
ih264e_init_pd_frm_rate(pd_frm_rate_t * ps_pd_frm_rate,UWORD32 u4_input_frm_rate)153*495ae853SAndroid Build Coastguard Worker void ih264e_init_pd_frm_rate(pd_frm_rate_t *ps_pd_frm_rate,
154*495ae853SAndroid Build Coastguard Worker UWORD32 u4_input_frm_rate)
155*495ae853SAndroid Build Coastguard Worker {
156*495ae853SAndroid Build Coastguard Worker WORD32 i;
157*495ae853SAndroid Build Coastguard Worker
158*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_input_frm_rate = u4_input_frm_rate;
159*495ae853SAndroid Build Coastguard Worker
160*495ae853SAndroid Build Coastguard Worker for (i = 0; i < (WORD32) (u4_input_frm_rate / 1000); i++)
161*495ae853SAndroid Build Coastguard Worker {
162*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_cur_frm_rate[i] = u4_input_frm_rate;
163*495ae853SAndroid Build Coastguard Worker }
164*495ae853SAndroid Build Coastguard Worker
165*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_frm_num = 0;
166*495ae853SAndroid Build Coastguard Worker
167*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_tot_frm_encoded = 0;
168*495ae853SAndroid Build Coastguard Worker }
169*495ae853SAndroid Build Coastguard Worker
170*495ae853SAndroid Build Coastguard Worker /**
171*495ae853SAndroid Build Coastguard Worker *******************************************************************************
172*495ae853SAndroid Build Coastguard Worker *
173*495ae853SAndroid Build Coastguard Worker * @brief Function to update pull down frame rate
174*495ae853SAndroid Build Coastguard Worker *
175*495ae853SAndroid Build Coastguard Worker * @par Description
176*495ae853SAndroid Build Coastguard Worker * For each frame a run time frame rate value is sent based on whether a frame
177*495ae853SAndroid Build Coastguard Worker * is skipped or not. If it is skipped for pull down then the current frame
178*495ae853SAndroid Build Coastguard Worker * rate for the pull down period is signaled as 4/5th of the original frame
179*495ae853SAndroid Build Coastguard Worker * rate. Thus when this is averaged the frame rate gradually switches from the
180*495ae853SAndroid Build Coastguard Worker * input frame rate to 4/5th of input frame rate as and when more 3:2 pull
181*495ae853SAndroid Build Coastguard Worker * down patterns are detected
182*495ae853SAndroid Build Coastguard Worker *
183*495ae853SAndroid Build Coastguard Worker * @param[in] ps_pd_frm_rate
184*495ae853SAndroid Build Coastguard Worker * Pull down frame rate context
185*495ae853SAndroid Build Coastguard Worker *
186*495ae853SAndroid Build Coastguard Worker * @param[in] u4_input_frm_rate
187*495ae853SAndroid Build Coastguard Worker * Input frame rate in frame per 1000sec
188*495ae853SAndroid Build Coastguard Worker *
189*495ae853SAndroid Build Coastguard Worker * @returns none
190*495ae853SAndroid Build Coastguard Worker *
191*495ae853SAndroid Build Coastguard Worker * @remarks
192*495ae853SAndroid Build Coastguard Worker *
193*495ae853SAndroid Build Coastguard Worker *******************************************************************************
194*495ae853SAndroid Build Coastguard Worker */
ih264e_update_pd_frm_rate(pd_frm_rate_t * ps_pd_frm_rate,UWORD32 u4_cur_frm_rate)195*495ae853SAndroid Build Coastguard Worker void ih264e_update_pd_frm_rate(pd_frm_rate_t *ps_pd_frm_rate,
196*495ae853SAndroid Build Coastguard Worker UWORD32 u4_cur_frm_rate)
197*495ae853SAndroid Build Coastguard Worker {
198*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_cur_frm_rate[ps_pd_frm_rate->u4_frm_num] = u4_cur_frm_rate;
199*495ae853SAndroid Build Coastguard Worker
200*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_frm_num++;
201*495ae853SAndroid Build Coastguard Worker
202*495ae853SAndroid Build Coastguard Worker /* Increment the frame number */
203*495ae853SAndroid Build Coastguard Worker if (ps_pd_frm_rate->u4_tot_frm_encoded < (ps_pd_frm_rate->u4_input_frm_rate / 1000))
204*495ae853SAndroid Build Coastguard Worker {
205*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_tot_frm_encoded++;
206*495ae853SAndroid Build Coastguard Worker }
207*495ae853SAndroid Build Coastguard Worker
208*495ae853SAndroid Build Coastguard Worker /* Reset frm_num to zero */
209*495ae853SAndroid Build Coastguard Worker if (ps_pd_frm_rate->u4_frm_num >= (ps_pd_frm_rate->u4_input_frm_rate / 1000))
210*495ae853SAndroid Build Coastguard Worker {
211*495ae853SAndroid Build Coastguard Worker ps_pd_frm_rate->u4_frm_num = 0;
212*495ae853SAndroid Build Coastguard Worker }
213*495ae853SAndroid Build Coastguard Worker }
214*495ae853SAndroid Build Coastguard Worker
215*495ae853SAndroid Build Coastguard Worker /**
216*495ae853SAndroid Build Coastguard Worker *******************************************************************************
217*495ae853SAndroid Build Coastguard Worker *
218*495ae853SAndroid Build Coastguard Worker * @brief returns average frame rate in 1 sec duration
219*495ae853SAndroid Build Coastguard Worker *
220*495ae853SAndroid Build Coastguard Worker * @par Description
221*495ae853SAndroid Build Coastguard Worker * Averages the last N frame in period(1 sec) and then gives that
222*495ae853SAndroid Build Coastguard Worker * as the current frames frame rate. Thus this averages out the sudden
223*495ae853SAndroid Build Coastguard Worker * variation in frame rate
224*495ae853SAndroid Build Coastguard Worker *
225*495ae853SAndroid Build Coastguard Worker * @param[in] ps_pd_frm_rate
226*495ae853SAndroid Build Coastguard Worker * Handle to pull down frame rate context
227*495ae853SAndroid Build Coastguard Worker *
228*495ae853SAndroid Build Coastguard Worker * @returns average frame rate
229*495ae853SAndroid Build Coastguard Worker *
230*495ae853SAndroid Build Coastguard Worker * @remarks
231*495ae853SAndroid Build Coastguard Worker *
232*495ae853SAndroid Build Coastguard Worker *******************************************************************************
233*495ae853SAndroid Build Coastguard Worker */
ih264e_get_pd_avg_frm_rate(pd_frm_rate_t * ps_pd_frm_rate)234*495ae853SAndroid Build Coastguard Worker UWORD32 ih264e_get_pd_avg_frm_rate(pd_frm_rate_t *ps_pd_frm_rate)
235*495ae853SAndroid Build Coastguard Worker {
236*495ae853SAndroid Build Coastguard Worker WORD32 i;
237*495ae853SAndroid Build Coastguard Worker WORD32 i4_avg_frm_rate = 0;
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker for (i = 0; i < (WORD32) ps_pd_frm_rate->u4_tot_frm_encoded; i++)
240*495ae853SAndroid Build Coastguard Worker {
241*495ae853SAndroid Build Coastguard Worker i4_avg_frm_rate += ps_pd_frm_rate->u4_cur_frm_rate[i];
242*495ae853SAndroid Build Coastguard Worker }
243*495ae853SAndroid Build Coastguard Worker
244*495ae853SAndroid Build Coastguard Worker i4_avg_frm_rate = i4_avg_frm_rate / ps_pd_frm_rate->u4_tot_frm_encoded;
245*495ae853SAndroid Build Coastguard Worker
246*495ae853SAndroid Build Coastguard Worker return i4_avg_frm_rate;
247*495ae853SAndroid Build Coastguard Worker }
248