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_time_stamp.c
25*495ae853SAndroid Build Coastguard Worker *
26*495ae853SAndroid Build Coastguard Worker * @brief
27*495ae853SAndroid Build Coastguard Worker * This file contains functions used for source and target time stamp management
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 * - gcd
34*495ae853SAndroid Build Coastguard Worker * - ih264e_get_range
35*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_init_free_memtab
36*495ae853SAndroid Build Coastguard Worker * - ih264e_init_frame_time
37*495ae853SAndroid Build Coastguard Worker * - ih264e_should_src_be_skipped
38*495ae853SAndroid Build Coastguard Worker * - ih264e_time_stamp_get_init_free_memtab
39*495ae853SAndroid Build Coastguard Worker * - ih264e_init_time_stamp
40*495ae853SAndroid Build Coastguard Worker * - ih264e_update_time_stamp
41*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_src_frame_rate
42*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_tgt_frame_rate
43*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_src_ticks
44*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_tgt_ticks
45*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_src_time
46*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_get_tgt_time
47*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_update_src_frame_rate
48*495ae853SAndroid Build Coastguard Worker * - ih264e_frame_time_update_tgt_frame_rate
49*495ae853SAndroid Build Coastguard Worker * - ih264_time_stamp_update_frame_rate
50*495ae853SAndroid Build Coastguard Worker *
51*495ae853SAndroid Build Coastguard Worker * @remarks
52*495ae853SAndroid Build Coastguard Worker * none
53*495ae853SAndroid Build Coastguard Worker *
54*495ae853SAndroid Build Coastguard Worker *******************************************************************************
55*495ae853SAndroid Build Coastguard Worker */
56*495ae853SAndroid Build Coastguard Worker
57*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
58*495ae853SAndroid Build Coastguard Worker /* File Includes */
59*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
60*495ae853SAndroid Build Coastguard Worker
61*495ae853SAndroid Build Coastguard Worker /* User Include Files */
62*495ae853SAndroid Build Coastguard Worker #include "ih264_typedefs.h"
63*495ae853SAndroid Build Coastguard Worker #include "iv2.h"
64*495ae853SAndroid Build Coastguard Worker #include "ive2.h"
65*495ae853SAndroid Build Coastguard Worker
66*495ae853SAndroid Build Coastguard Worker #include "ih264_defs.h"
67*495ae853SAndroid Build Coastguard Worker #include "ih264_mem_fns.h"
68*495ae853SAndroid Build Coastguard Worker #include "ih264_padding.h"
69*495ae853SAndroid Build Coastguard Worker #include "ih264_structs.h"
70*495ae853SAndroid Build Coastguard Worker #include "ih264_trans_quant_itrans_iquant.h"
71*495ae853SAndroid Build Coastguard Worker #include "ih264_inter_pred_filters.h"
72*495ae853SAndroid Build Coastguard Worker #include "ih264_intra_pred_filters.h"
73*495ae853SAndroid Build Coastguard Worker #include "ih264_deblk_edge_filters.h"
74*495ae853SAndroid Build Coastguard Worker #include "ih264_cabac_tables.h"
75*495ae853SAndroid Build Coastguard Worker
76*495ae853SAndroid Build Coastguard Worker #include "ime_defs.h"
77*495ae853SAndroid Build Coastguard Worker #include "ime_distortion_metrics.h"
78*495ae853SAndroid Build Coastguard Worker #include "ime_structs.h"
79*495ae853SAndroid Build Coastguard Worker
80*495ae853SAndroid Build Coastguard Worker #include "irc_mem_req_and_acq.h"
81*495ae853SAndroid Build Coastguard Worker #include "irc_cntrl_param.h"
82*495ae853SAndroid Build Coastguard Worker #include "irc_frame_info_collector.h"
83*495ae853SAndroid Build Coastguard Worker #include "irc_common.h"
84*495ae853SAndroid Build Coastguard Worker #include "irc_rate_control_api.h"
85*495ae853SAndroid Build Coastguard Worker
86*495ae853SAndroid Build Coastguard Worker #include "ih264e_error.h"
87*495ae853SAndroid Build Coastguard Worker #include "ih264e_defs.h"
88*495ae853SAndroid Build Coastguard Worker #include "ih264e_rate_control.h"
89*495ae853SAndroid Build Coastguard Worker #include "ih264e_bitstream.h"
90*495ae853SAndroid Build Coastguard Worker #include "ih264e_cabac_structs.h"
91*495ae853SAndroid Build Coastguard Worker #include "ih264e_structs.h"
92*495ae853SAndroid Build Coastguard Worker #include "ih264e_time_stamp.h"
93*495ae853SAndroid Build Coastguard Worker
94*495ae853SAndroid Build Coastguard Worker
95*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
96*495ae853SAndroid Build Coastguard Worker /* Function Definitions */
97*495ae853SAndroid Build Coastguard Worker /*****************************************************************************/
98*495ae853SAndroid Build Coastguard Worker
99*495ae853SAndroid Build Coastguard Worker /**
100*495ae853SAndroid Build Coastguard Worker *******************************************************************************
101*495ae853SAndroid Build Coastguard Worker *
102*495ae853SAndroid Build Coastguard Worker * @brief Function to compute gcd of two numbers
103*495ae853SAndroid Build Coastguard Worker *
104*495ae853SAndroid Build Coastguard Worker * @par Description
105*495ae853SAndroid Build Coastguard Worker * Function to compute gcd of two numbers
106*495ae853SAndroid Build Coastguard Worker *
107*495ae853SAndroid Build Coastguard Worker * @param[in] i4_x
108*495ae853SAndroid Build Coastguard Worker * value 1
109*495ae853SAndroid Build Coastguard Worker *
110*495ae853SAndroid Build Coastguard Worker * @param[in] i4_y
111*495ae853SAndroid Build Coastguard Worker * value 2
112*495ae853SAndroid Build Coastguard Worker *
113*495ae853SAndroid Build Coastguard Worker * @returns
114*495ae853SAndroid Build Coastguard Worker * GCD(value 1, value 2)
115*495ae853SAndroid Build Coastguard Worker *
116*495ae853SAndroid Build Coastguard Worker * @remarks none
117*495ae853SAndroid Build Coastguard Worker *
118*495ae853SAndroid Build Coastguard Worker *******************************************************************************
119*495ae853SAndroid Build Coastguard Worker */
gcd(WORD32 i4_x,WORD32 i4_y)120*495ae853SAndroid Build Coastguard Worker static WORD32 gcd(WORD32 i4_x, WORD32 i4_y)
121*495ae853SAndroid Build Coastguard Worker {
122*495ae853SAndroid Build Coastguard Worker if (i4_x > i4_y)
123*495ae853SAndroid Build Coastguard Worker {
124*495ae853SAndroid Build Coastguard Worker i4_x = i4_y + i4_x;
125*495ae853SAndroid Build Coastguard Worker i4_y = i4_x - i4_y;
126*495ae853SAndroid Build Coastguard Worker i4_x = i4_x - i4_y;
127*495ae853SAndroid Build Coastguard Worker }
128*495ae853SAndroid Build Coastguard Worker while (i4_y != 0)
129*495ae853SAndroid Build Coastguard Worker {
130*495ae853SAndroid Build Coastguard Worker WORD32 temp;
131*495ae853SAndroid Build Coastguard Worker i4_x = i4_x % i4_y;
132*495ae853SAndroid Build Coastguard Worker temp = i4_x;
133*495ae853SAndroid Build Coastguard Worker i4_x = i4_y;
134*495ae853SAndroid Build Coastguard Worker i4_y = temp;
135*495ae853SAndroid Build Coastguard Worker }
136*495ae853SAndroid Build Coastguard Worker return (i4_x);
137*495ae853SAndroid Build Coastguard Worker }
138*495ae853SAndroid Build Coastguard Worker
139*495ae853SAndroid Build Coastguard Worker /**
140*495ae853SAndroid Build Coastguard Worker *******************************************************************************
141*495ae853SAndroid Build Coastguard Worker *
142*495ae853SAndroid Build Coastguard Worker * @brief Function to determine number of bits required to represent a given
143*495ae853SAndroid Build Coastguard Worker * value
144*495ae853SAndroid Build Coastguard Worker *
145*495ae853SAndroid Build Coastguard Worker * @par Description
146*495ae853SAndroid Build Coastguard Worker * This function determines the number of bits required to represent the given
147*495ae853SAndroid Build Coastguard Worker * value. It is used to find out number of bits to read when the data size is
148*495ae853SAndroid Build Coastguard Worker * not fixed (e.g. vop_time_increment_resolution).
149*495ae853SAndroid Build Coastguard Worker *
150*495ae853SAndroid Build Coastguard Worker * @param[in] u4_value
151*495ae853SAndroid Build Coastguard Worker * Value for which the number of bits required to represent is to be determined
152*495ae853SAndroid Build Coastguard Worker *
153*495ae853SAndroid Build Coastguard Worker * @param[in] u1_no_of_bits
154*495ae853SAndroid Build Coastguard Worker * Represents the value's word type = 8/16/32
155*495ae853SAndroid Build Coastguard Worker *
156*495ae853SAndroid Build Coastguard Worker * @returns
157*495ae853SAndroid Build Coastguard Worker * The number of bits required to represent the given number
158*495ae853SAndroid Build Coastguard Worker *
159*495ae853SAndroid Build Coastguard Worker * @remarks none
160*495ae853SAndroid Build Coastguard Worker *
161*495ae853SAndroid Build Coastguard Worker *******************************************************************************
162*495ae853SAndroid Build Coastguard Worker */
ih264e_get_range(UWORD32 u4_value,UWORD8 u1_no_of_bits)163*495ae853SAndroid Build Coastguard Worker static UWORD8 ih264e_get_range(UWORD32 u4_value, UWORD8 u1_no_of_bits)
164*495ae853SAndroid Build Coastguard Worker {
165*495ae853SAndroid Build Coastguard Worker UWORD8 count;
166*495ae853SAndroid Build Coastguard Worker UWORD32 temp;
167*495ae853SAndroid Build Coastguard Worker
168*495ae853SAndroid Build Coastguard Worker if (u4_value > (UWORD32) ((1 << (u1_no_of_bits >> 1)) - 1))
169*495ae853SAndroid Build Coastguard Worker {
170*495ae853SAndroid Build Coastguard Worker temp = (1 << (u1_no_of_bits - 1));
171*495ae853SAndroid Build Coastguard Worker for (count = 0; count < (u1_no_of_bits >> 1); count++)
172*495ae853SAndroid Build Coastguard Worker {
173*495ae853SAndroid Build Coastguard Worker if ((temp & u4_value) != 0)
174*495ae853SAndroid Build Coastguard Worker {
175*495ae853SAndroid Build Coastguard Worker return (UWORD8) (u1_no_of_bits - count);
176*495ae853SAndroid Build Coastguard Worker }
177*495ae853SAndroid Build Coastguard Worker else
178*495ae853SAndroid Build Coastguard Worker {
179*495ae853SAndroid Build Coastguard Worker temp >>= 1;
180*495ae853SAndroid Build Coastguard Worker }
181*495ae853SAndroid Build Coastguard Worker }
182*495ae853SAndroid Build Coastguard Worker return 0;
183*495ae853SAndroid Build Coastguard Worker }
184*495ae853SAndroid Build Coastguard Worker else
185*495ae853SAndroid Build Coastguard Worker {
186*495ae853SAndroid Build Coastguard Worker temp = (1 << ((u1_no_of_bits >> 1) - 1));
187*495ae853SAndroid Build Coastguard Worker for (count = 0; count < ((u1_no_of_bits >> 1) - 1); count++)
188*495ae853SAndroid Build Coastguard Worker {
189*495ae853SAndroid Build Coastguard Worker if ((temp & u4_value) != 0)
190*495ae853SAndroid Build Coastguard Worker {
191*495ae853SAndroid Build Coastguard Worker return (UWORD8) ((u1_no_of_bits >> 1) - count);
192*495ae853SAndroid Build Coastguard Worker }
193*495ae853SAndroid Build Coastguard Worker else
194*495ae853SAndroid Build Coastguard Worker {
195*495ae853SAndroid Build Coastguard Worker temp >>= 1;
196*495ae853SAndroid Build Coastguard Worker }
197*495ae853SAndroid Build Coastguard Worker }
198*495ae853SAndroid Build Coastguard Worker return 1;
199*495ae853SAndroid Build Coastguard Worker }
200*495ae853SAndroid Build Coastguard Worker }
201*495ae853SAndroid Build Coastguard Worker
202*495ae853SAndroid Build Coastguard Worker /**
203*495ae853SAndroid Build Coastguard Worker *******************************************************************************
204*495ae853SAndroid Build Coastguard Worker *
205*495ae853SAndroid Build Coastguard Worker * @brief
206*495ae853SAndroid Build Coastguard Worker * Function to init frame time memtabs
207*495ae853SAndroid Build Coastguard Worker *
208*495ae853SAndroid Build Coastguard Worker * @par Description
209*495ae853SAndroid Build Coastguard Worker * Function to init frame time memtabs
210*495ae853SAndroid Build Coastguard Worker *
211*495ae853SAndroid Build Coastguard Worker * @param[in] pps_frame_time
212*495ae853SAndroid Build Coastguard Worker * Pointer to frame time contexts
213*495ae853SAndroid Build Coastguard Worker *
214*495ae853SAndroid Build Coastguard Worker * @param[in] ps_memtab
215*495ae853SAndroid Build Coastguard Worker * Pointer to memtab
216*495ae853SAndroid Build Coastguard Worker *
217*495ae853SAndroid Build Coastguard Worker * @param[in] e_func_type
218*495ae853SAndroid Build Coastguard Worker * Function type (get memtabs/init memtabs)
219*495ae853SAndroid Build Coastguard Worker *
220*495ae853SAndroid Build Coastguard Worker * @returns
221*495ae853SAndroid Build Coastguard Worker * none
222*495ae853SAndroid Build Coastguard Worker *
223*495ae853SAndroid Build Coastguard Worker * @remarks
224*495ae853SAndroid Build Coastguard Worker *
225*495ae853SAndroid Build Coastguard Worker *******************************************************************************
226*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_init_free_memtab(frame_time_handle * pps_frame_time,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)227*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_init_free_memtab(frame_time_handle *pps_frame_time,
228*495ae853SAndroid Build Coastguard Worker itt_memtab_t *ps_memtab,
229*495ae853SAndroid Build Coastguard Worker ITT_FUNC_TYPE_E e_func_type)
230*495ae853SAndroid Build Coastguard Worker {
231*495ae853SAndroid Build Coastguard Worker WORD32 i4_mem_tab_idx = 0;
232*495ae853SAndroid Build Coastguard Worker frame_time_t s_temp_frame_time_t;
233*495ae853SAndroid Build Coastguard Worker
234*495ae853SAndroid Build Coastguard Worker /* Hack for al alloc, during which we dont have any state memory.
235*495ae853SAndroid Build Coastguard Worker Dereferencing can cause issues */
236*495ae853SAndroid Build Coastguard Worker if (e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
237*495ae853SAndroid Build Coastguard Worker (*pps_frame_time) = &s_temp_frame_time_t;
238*495ae853SAndroid Build Coastguard Worker
239*495ae853SAndroid Build Coastguard Worker /* for src rate control state structure */
240*495ae853SAndroid Build Coastguard Worker if (e_func_type != GET_NUM_MEMTAB)
241*495ae853SAndroid Build Coastguard Worker {
242*495ae853SAndroid Build Coastguard Worker fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(frame_time_t),
243*495ae853SAndroid Build Coastguard Worker ALIGN_128_BYTE, PERSISTENT, DDR);
244*495ae853SAndroid Build Coastguard Worker use_or_fill_base(&ps_memtab[0], (void**) pps_frame_time, e_func_type);
245*495ae853SAndroid Build Coastguard Worker }
246*495ae853SAndroid Build Coastguard Worker i4_mem_tab_idx++;
247*495ae853SAndroid Build Coastguard Worker
248*495ae853SAndroid Build Coastguard Worker return (i4_mem_tab_idx);
249*495ae853SAndroid Build Coastguard Worker }
250*495ae853SAndroid Build Coastguard Worker
251*495ae853SAndroid Build Coastguard Worker /**
252*495ae853SAndroid Build Coastguard Worker *******************************************************************************
253*495ae853SAndroid Build Coastguard Worker *
254*495ae853SAndroid Build Coastguard Worker * @brief
255*495ae853SAndroid Build Coastguard Worker * Function to init frame time context
256*495ae853SAndroid Build Coastguard Worker *
257*495ae853SAndroid Build Coastguard Worker * @par Description
258*495ae853SAndroid Build Coastguard Worker * Frame time structure stores the time of the source and the target frames to
259*495ae853SAndroid Build Coastguard Worker * be encoded. Based on the time we decide whether or not to encode the source
260*495ae853SAndroid Build Coastguard Worker * frame
261*495ae853SAndroid Build Coastguard Worker *
262*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
263*495ae853SAndroid Build Coastguard Worker * Pointer Frame time context
264*495ae853SAndroid Build Coastguard Worker *
265*495ae853SAndroid Build Coastguard Worker * @param[in] u4_src_frm_rate
266*495ae853SAndroid Build Coastguard Worker * Source frame rate
267*495ae853SAndroid Build Coastguard Worker *
268*495ae853SAndroid Build Coastguard Worker * @param[in] u4_tgt_frm_rate
269*495ae853SAndroid Build Coastguard Worker * Target frame rate
270*495ae853SAndroid Build Coastguard Worker *
271*495ae853SAndroid Build Coastguard Worker * @returns
272*495ae853SAndroid Build Coastguard Worker * none
273*495ae853SAndroid Build Coastguard Worker *
274*495ae853SAndroid Build Coastguard Worker * @remarks
275*495ae853SAndroid Build Coastguard Worker *
276*495ae853SAndroid Build Coastguard Worker *******************************************************************************
277*495ae853SAndroid Build Coastguard Worker */
ih264e_init_frame_time(frame_time_t * ps_frame_time,UWORD32 u4_src_frm_rate,UWORD32 u4_tgt_frm_rate)278*495ae853SAndroid Build Coastguard Worker void ih264e_init_frame_time(frame_time_t *ps_frame_time,
279*495ae853SAndroid Build Coastguard Worker UWORD32 u4_src_frm_rate,
280*495ae853SAndroid Build Coastguard Worker UWORD32 u4_tgt_frm_rate)
281*495ae853SAndroid Build Coastguard Worker {
282*495ae853SAndroid Build Coastguard Worker /* Initialise the common time base based on which the source and target
283*495ae853SAndroid Build Coastguard Worker * frame times increase */
284*495ae853SAndroid Build Coastguard Worker WORD32 i4_gcd = gcd(u4_src_frm_rate, u4_tgt_frm_rate);
285*495ae853SAndroid Build Coastguard Worker
286*495ae853SAndroid Build Coastguard Worker /* Avoiding overflow by doing calculations in float */
287*495ae853SAndroid Build Coastguard Worker number_t s_src_frm_rate, s_tgt_frm_rate, s_gcd, s_common_time_base, s_numerator;
288*495ae853SAndroid Build Coastguard Worker
289*495ae853SAndroid Build Coastguard Worker SET_VAR_Q(s_src_frm_rate, u4_src_frm_rate, 0);
290*495ae853SAndroid Build Coastguard Worker SET_VAR_Q(s_tgt_frm_rate, u4_tgt_frm_rate, 0);
291*495ae853SAndroid Build Coastguard Worker SET_VAR_Q(s_gcd, i4_gcd, 0);
292*495ae853SAndroid Build Coastguard Worker mult32_var_q(s_src_frm_rate, s_tgt_frm_rate, &s_numerator);
293*495ae853SAndroid Build Coastguard Worker div32_var_q(s_numerator, s_gcd, &s_common_time_base);
294*495ae853SAndroid Build Coastguard Worker number_t_to_word32(s_common_time_base, &(ps_frame_time->common_time_base));
295*495ae853SAndroid Build Coastguard Worker
296*495ae853SAndroid Build Coastguard Worker /* The source and target increment per vop is initialized */
297*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_src_frm_time_incr = ps_frame_time->common_time_base
298*495ae853SAndroid Build Coastguard Worker / u4_src_frm_rate;
299*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_tgt_frm_time_incr = ps_frame_time->common_time_base
300*495ae853SAndroid Build Coastguard Worker / u4_tgt_frm_rate;
301*495ae853SAndroid Build Coastguard Worker
302*495ae853SAndroid Build Coastguard Worker /* Initialise the source and target times to 0 (RESET) */
303*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_src_frm_time = 0;
304*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_tgt_frm_time = 0;
305*495ae853SAndroid Build Coastguard Worker
306*495ae853SAndroid Build Coastguard Worker /* Initialize the number of frms not to be skipped to 0 */
307*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_num_frms_dont_skip = 0;
308*495ae853SAndroid Build Coastguard Worker }
309*495ae853SAndroid Build Coastguard Worker
310*495ae853SAndroid Build Coastguard Worker /**
311*495ae853SAndroid Build Coastguard Worker *******************************************************************************
312*495ae853SAndroid Build Coastguard Worker *
313*495ae853SAndroid Build Coastguard Worker * @brief
314*495ae853SAndroid Build Coastguard Worker * Function to check if frame can be skipped
315*495ae853SAndroid Build Coastguard Worker *
316*495ae853SAndroid Build Coastguard Worker * @par Description
317*495ae853SAndroid Build Coastguard Worker * Based on the source and target frame time and the delta time stamp
318*495ae853SAndroid Build Coastguard Worker * we decide whether to code the source or not.
319*495ae853SAndroid Build Coastguard Worker * This is based on the assumption
320*495ae853SAndroid Build Coastguard Worker * that the source frame rate is greater that target frame rate.
321*495ae853SAndroid Build Coastguard Worker * Updates the time_stamp structure
322*495ae853SAndroid Build Coastguard Worker *
323*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
324*495ae853SAndroid Build Coastguard Worker * Handle to frame time context
325*495ae853SAndroid Build Coastguard Worker *
326*495ae853SAndroid Build Coastguard Worker * @param[in] u4_delta_time_stamp
327*495ae853SAndroid Build Coastguard Worker * Time stamp difference between frames
328*495ae853SAndroid Build Coastguard Worker *
329*495ae853SAndroid Build Coastguard Worker * @param[out] pu4_frm_not_skipped_for_dts
330*495ae853SAndroid Build Coastguard Worker * Flag to indicate if frame is already skipped by application
331*495ae853SAndroid Build Coastguard Worker *
332*495ae853SAndroid Build Coastguard Worker * @returns
333*495ae853SAndroid Build Coastguard Worker * Flag to skip frame
334*495ae853SAndroid Build Coastguard Worker *
335*495ae853SAndroid Build Coastguard Worker * @remarks
336*495ae853SAndroid Build Coastguard Worker *
337*495ae853SAndroid Build Coastguard Worker *******************************************************************************
338*495ae853SAndroid Build Coastguard Worker */
ih264e_should_src_be_skipped(frame_time_t * ps_frame_time,UWORD32 u4_delta_time_stamp,UWORD32 * pu4_frm_not_skipped_for_dts)339*495ae853SAndroid Build Coastguard Worker UWORD8 ih264e_should_src_be_skipped(frame_time_t *ps_frame_time,
340*495ae853SAndroid Build Coastguard Worker UWORD32 u4_delta_time_stamp,
341*495ae853SAndroid Build Coastguard Worker UWORD32 *pu4_frm_not_skipped_for_dts)
342*495ae853SAndroid Build Coastguard Worker {
343*495ae853SAndroid Build Coastguard Worker UWORD8 skip_src = 0;
344*495ae853SAndroid Build Coastguard Worker
345*495ae853SAndroid Build Coastguard Worker if (ps_frame_time->u4_tgt_frm_time > ps_frame_time->u4_src_frm_time &&
346*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_tgt_frm_time >= (ps_frame_time->u4_src_frm_time +
347*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_src_frm_time_incr))
348*495ae853SAndroid Build Coastguard Worker {
349*495ae853SAndroid Build Coastguard Worker skip_src = 1;
350*495ae853SAndroid Build Coastguard Worker }
351*495ae853SAndroid Build Coastguard Worker
352*495ae853SAndroid Build Coastguard Worker /* source time gets updated every frame */
353*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_src_frm_time += ps_frame_time->u4_src_frm_time_incr;
354*495ae853SAndroid Build Coastguard Worker
355*495ae853SAndroid Build Coastguard Worker /* target time gets updated only when the source is coded */
356*495ae853SAndroid Build Coastguard Worker if (!skip_src)
357*495ae853SAndroid Build Coastguard Worker {
358*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_tgt_frm_time += ps_frame_time->u4_tgt_frm_time_incr;
359*495ae853SAndroid Build Coastguard Worker }
360*495ae853SAndroid Build Coastguard Worker
361*495ae853SAndroid Build Coastguard Worker /* If the source and target frame times get incremented properly
362*495ae853SAndroid Build Coastguard Worker both should be equal to the common time base at the same time. If
363*495ae853SAndroid Build Coastguard Worker that happens we reset the time to zero*/
364*495ae853SAndroid Build Coastguard Worker if (( ps_frame_time->common_time_base ==(WORD32)ps_frame_time->u4_src_frm_time)
365*495ae853SAndroid Build Coastguard Worker && (ps_frame_time->common_time_base ==(WORD32) ps_frame_time->u4_tgt_frm_time ))
366*495ae853SAndroid Build Coastguard Worker {
367*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_src_frm_time = 0;
368*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_tgt_frm_time = 0;
369*495ae853SAndroid Build Coastguard Worker }
370*495ae853SAndroid Build Coastguard Worker
371*495ae853SAndroid Build Coastguard Worker /* This keeps a count of how many frames need not be skipped in order
372*495ae853SAndroid Build Coastguard Worker to take care of the delta time stamp */
373*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_num_frms_dont_skip += (u4_delta_time_stamp - 1);
374*495ae853SAndroid Build Coastguard Worker
375*495ae853SAndroid Build Coastguard Worker /** If this frame is to be skipped in order to maintain the tgt_frm_rate
376*495ae853SAndroid Build Coastguard Worker check if already a frame has been skipped by the application.
377*495ae853SAndroid Build Coastguard Worker In that case, do not skip this frame **/
378*495ae853SAndroid Build Coastguard Worker if (ps_frame_time->u4_num_frms_dont_skip && skip_src)
379*495ae853SAndroid Build Coastguard Worker {
380*495ae853SAndroid Build Coastguard Worker skip_src = 0;
381*495ae853SAndroid Build Coastguard Worker *pu4_frm_not_skipped_for_dts = 1;
382*495ae853SAndroid Build Coastguard Worker ps_frame_time->u4_num_frms_dont_skip -= 1;
383*495ae853SAndroid Build Coastguard Worker }
384*495ae853SAndroid Build Coastguard Worker else
385*495ae853SAndroid Build Coastguard Worker {
386*495ae853SAndroid Build Coastguard Worker pu4_frm_not_skipped_for_dts[0] = 0;
387*495ae853SAndroid Build Coastguard Worker }
388*495ae853SAndroid Build Coastguard Worker
389*495ae853SAndroid Build Coastguard Worker return (skip_src);
390*495ae853SAndroid Build Coastguard Worker }
391*495ae853SAndroid Build Coastguard Worker
392*495ae853SAndroid Build Coastguard Worker /**
393*495ae853SAndroid Build Coastguard Worker *******************************************************************************
394*495ae853SAndroid Build Coastguard Worker *
395*495ae853SAndroid Build Coastguard Worker * @brief
396*495ae853SAndroid Build Coastguard Worker * Function to inititialize time stamp memtabs
397*495ae853SAndroid Build Coastguard Worker *
398*495ae853SAndroid Build Coastguard Worker * @par Description
399*495ae853SAndroid Build Coastguard Worker * Function to initialize time stamp memtabs
400*495ae853SAndroid Build Coastguard Worker *
401*495ae853SAndroid Build Coastguard Worker * @param[in] pps_time_stamp
402*495ae853SAndroid Build Coastguard Worker * Pointer to time stamp context
403*495ae853SAndroid Build Coastguard Worker *
404*495ae853SAndroid Build Coastguard Worker * @param[in] ps_memtab
405*495ae853SAndroid Build Coastguard Worker * Pointer to memtab
406*495ae853SAndroid Build Coastguard Worker *
407*495ae853SAndroid Build Coastguard Worker * @param[in] e_func_type
408*495ae853SAndroid Build Coastguard Worker * Funcion type (Get memtab/ init memtab)
409*495ae853SAndroid Build Coastguard Worker *
410*495ae853SAndroid Build Coastguard Worker * @returns
411*495ae853SAndroid Build Coastguard Worker * number of memtabs used
412*495ae853SAndroid Build Coastguard Worker *
413*495ae853SAndroid Build Coastguard Worker * @remarks
414*495ae853SAndroid Build Coastguard Worker *
415*495ae853SAndroid Build Coastguard Worker *******************************************************************************
416*495ae853SAndroid Build Coastguard Worker */
ih264e_time_stamp_get_init_free_memtab(time_stamp_handle * pps_time_stamp,itt_memtab_t * ps_memtab,ITT_FUNC_TYPE_E e_func_type)417*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_time_stamp_get_init_free_memtab(time_stamp_handle *pps_time_stamp,
418*495ae853SAndroid Build Coastguard Worker itt_memtab_t *ps_memtab,
419*495ae853SAndroid Build Coastguard Worker ITT_FUNC_TYPE_E e_func_type)
420*495ae853SAndroid Build Coastguard Worker {
421*495ae853SAndroid Build Coastguard Worker WORD32 i4_mem_tab_idx = 0;
422*495ae853SAndroid Build Coastguard Worker time_stamp_t s_temp_time_stamp_t;
423*495ae853SAndroid Build Coastguard Worker
424*495ae853SAndroid Build Coastguard Worker /* Hack for al alloc, during which we dont have any state memory.
425*495ae853SAndroid Build Coastguard Worker Dereferencing can cause issues */
426*495ae853SAndroid Build Coastguard Worker if (e_func_type == GET_NUM_MEMTAB || e_func_type == FILL_MEMTAB)
427*495ae853SAndroid Build Coastguard Worker (*pps_time_stamp) = &s_temp_time_stamp_t;
428*495ae853SAndroid Build Coastguard Worker
429*495ae853SAndroid Build Coastguard Worker /* for src rate control state structure */
430*495ae853SAndroid Build Coastguard Worker if (e_func_type != GET_NUM_MEMTAB)
431*495ae853SAndroid Build Coastguard Worker {
432*495ae853SAndroid Build Coastguard Worker fill_memtab(&ps_memtab[i4_mem_tab_idx], sizeof(time_stamp_t),
433*495ae853SAndroid Build Coastguard Worker ALIGN_128_BYTE, PERSISTENT, DDR);
434*495ae853SAndroid Build Coastguard Worker use_or_fill_base(&ps_memtab[0], (void**) pps_time_stamp, e_func_type);
435*495ae853SAndroid Build Coastguard Worker }
436*495ae853SAndroid Build Coastguard Worker i4_mem_tab_idx++;
437*495ae853SAndroid Build Coastguard Worker
438*495ae853SAndroid Build Coastguard Worker return (i4_mem_tab_idx);
439*495ae853SAndroid Build Coastguard Worker }
440*495ae853SAndroid Build Coastguard Worker
441*495ae853SAndroid Build Coastguard Worker /**
442*495ae853SAndroid Build Coastguard Worker *******************************************************************************
443*495ae853SAndroid Build Coastguard Worker *
444*495ae853SAndroid Build Coastguard Worker * @brief
445*495ae853SAndroid Build Coastguard Worker * Function to initialize time stamp context
446*495ae853SAndroid Build Coastguard Worker *
447*495ae853SAndroid Build Coastguard Worker * @par Description
448*495ae853SAndroid Build Coastguard Worker * Time stamp structure stores the time stamp data that
449*495ae853SAndroid Build Coastguard Worker * needs to be sent in to the header of MPEG4. Based on the
450*495ae853SAndroid Build Coastguard Worker * max target frame rate the vop_time increment resolution is set
451*495ae853SAndroid Build Coastguard Worker * so as to support all the frame rates below max frame rate.
452*495ae853SAndroid Build Coastguard Worker * A support till the third decimal point is assumed.
453*495ae853SAndroid Build Coastguard Worker *
454*495ae853SAndroid Build Coastguard Worker * @param[in] ps_time_stamp
455*495ae853SAndroid Build Coastguard Worker * Pointer to time stamp structure
456*495ae853SAndroid Build Coastguard Worker *
457*495ae853SAndroid Build Coastguard Worker * @param[in] u4_max_frm_rate
458*495ae853SAndroid Build Coastguard Worker * Maximum frame rate
459*495ae853SAndroid Build Coastguard Worker *
460*495ae853SAndroid Build Coastguard Worker * @param[in] u4_src_frm_rate
461*495ae853SAndroid Build Coastguard Worker * Source frame rate
462*495ae853SAndroid Build Coastguard Worker *
463*495ae853SAndroid Build Coastguard Worker * @returns
464*495ae853SAndroid Build Coastguard Worker * none
465*495ae853SAndroid Build Coastguard Worker *
466*495ae853SAndroid Build Coastguard Worker * @remarks
467*495ae853SAndroid Build Coastguard Worker *
468*495ae853SAndroid Build Coastguard Worker *******************************************************************************
469*495ae853SAndroid Build Coastguard Worker */
ih264e_init_time_stamp(time_stamp_t * ps_time_stamp,UWORD32 u4_max_frm_rate,UWORD32 u4_src_frm_rate)470*495ae853SAndroid Build Coastguard Worker void ih264e_init_time_stamp(time_stamp_t *ps_time_stamp,
471*495ae853SAndroid Build Coastguard Worker UWORD32 u4_max_frm_rate,
472*495ae853SAndroid Build Coastguard Worker UWORD32 u4_src_frm_rate)
473*495ae853SAndroid Build Coastguard Worker {
474*495ae853SAndroid Build Coastguard Worker /* We expect the max frame rate to be less than 60000,
475*495ae853SAndroid Build Coastguard Worker * if not we divide it by zero and work with it */
476*495ae853SAndroid Build Coastguard Worker if (u4_max_frm_rate > 60000)
477*495ae853SAndroid Build Coastguard Worker {
478*495ae853SAndroid Build Coastguard Worker u4_max_frm_rate >>= 1;
479*495ae853SAndroid Build Coastguard Worker ps_time_stamp->is_max_frame_rate_scaled = 1;
480*495ae853SAndroid Build Coastguard Worker }
481*495ae853SAndroid Build Coastguard Worker else
482*495ae853SAndroid Build Coastguard Worker {
483*495ae853SAndroid Build Coastguard Worker ps_time_stamp->is_max_frame_rate_scaled = 0;
484*495ae853SAndroid Build Coastguard Worker }
485*495ae853SAndroid Build Coastguard Worker
486*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time_incr_res = u4_max_frm_rate;
487*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time_incr_range = ih264e_get_range(u4_max_frm_rate, 32);
488*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time_incr = (ps_time_stamp->u4_vop_time_incr_res * 1000) / u4_src_frm_rate;/* Since frm rate is in millisec */
489*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time = 0;
490*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_cur_tgt_vop_time = 0;
491*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_prev_tgt_vop_time = 0;
492*495ae853SAndroid Build Coastguard Worker }
493*495ae853SAndroid Build Coastguard Worker
494*495ae853SAndroid Build Coastguard Worker /**
495*495ae853SAndroid Build Coastguard Worker *******************************************************************************
496*495ae853SAndroid Build Coastguard Worker *
497*495ae853SAndroid Build Coastguard Worker * @brief Function to update time stamp context
498*495ae853SAndroid Build Coastguard Worker *
499*495ae853SAndroid Build Coastguard Worker * @par Description
500*495ae853SAndroid Build Coastguard Worker * Vop time is incremented by increment value. When vop time goes
501*495ae853SAndroid Build Coastguard Worker * more than the vop time resolution set the modulo time base to
502*495ae853SAndroid Build Coastguard Worker * 1 and reduce the vop time by vop time resolution so that the
503*495ae853SAndroid Build Coastguard Worker * excess value is present in vop time and get accumulated over time
504*495ae853SAndroid Build Coastguard Worker * so that the corresponding frame rate is achieved at a average of
505*495ae853SAndroid Build Coastguard Worker * 1000 seconds
506*495ae853SAndroid Build Coastguard Worker *
507*495ae853SAndroid Build Coastguard Worker * @param[in] ps_time_stamp
508*495ae853SAndroid Build Coastguard Worker * Pointer to time stamp structure
509*495ae853SAndroid Build Coastguard Worker *
510*495ae853SAndroid Build Coastguard Worker * @returns
511*495ae853SAndroid Build Coastguard Worker * none
512*495ae853SAndroid Build Coastguard Worker *
513*495ae853SAndroid Build Coastguard Worker * @remarks
514*495ae853SAndroid Build Coastguard Worker *
515*495ae853SAndroid Build Coastguard Worker *******************************************************************************
516*495ae853SAndroid Build Coastguard Worker */
ih264e_update_time_stamp(time_stamp_t * ps_time_stamp)517*495ae853SAndroid Build Coastguard Worker void ih264e_update_time_stamp(time_stamp_t *ps_time_stamp)
518*495ae853SAndroid Build Coastguard Worker {
519*495ae853SAndroid Build Coastguard Worker /* Since get time stamp is called after the update
520*495ae853SAndroid Build Coastguard Worker A copy of the vop time and the modulo time is stored */
521*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_cur_tgt_vop_time = ps_time_stamp->u4_vop_time;
522*495ae853SAndroid Build Coastguard Worker
523*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time += ps_time_stamp->u4_vop_time_incr;
524*495ae853SAndroid Build Coastguard Worker if (ps_time_stamp->u4_vop_time >= ps_time_stamp->u4_vop_time_incr_res)
525*495ae853SAndroid Build Coastguard Worker {
526*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time -= ps_time_stamp->u4_vop_time_incr_res;
527*495ae853SAndroid Build Coastguard Worker }
528*495ae853SAndroid Build Coastguard Worker }
529*495ae853SAndroid Build Coastguard Worker
530*495ae853SAndroid Build Coastguard Worker /****************************************************************************
531*495ae853SAndroid Build Coastguard Worker Run-Time Modifying functions
532*495ae853SAndroid Build Coastguard Worker ****************************************************************************/
533*495ae853SAndroid Build Coastguard Worker
534*495ae853SAndroid Build Coastguard Worker /**
535*495ae853SAndroid Build Coastguard Worker *******************************************************************************
536*495ae853SAndroid Build Coastguard Worker *
537*495ae853SAndroid Build Coastguard Worker * @brief Function to get source frame rate
538*495ae853SAndroid Build Coastguard Worker *
539*495ae853SAndroid Build Coastguard Worker * @par Description
540*495ae853SAndroid Build Coastguard Worker * Function to get source frame rate
541*495ae853SAndroid Build Coastguard Worker *
542*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
543*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
544*495ae853SAndroid Build Coastguard Worker *
545*495ae853SAndroid Build Coastguard Worker * @returns
546*495ae853SAndroid Build Coastguard Worker * source frame rate
547*495ae853SAndroid Build Coastguard Worker *
548*495ae853SAndroid Build Coastguard Worker * @remarks
549*495ae853SAndroid Build Coastguard Worker *
550*495ae853SAndroid Build Coastguard Worker *******************************************************************************
551*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_src_frame_rate(frame_time_t * ps_frame_time)552*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_src_frame_rate(frame_time_t *ps_frame_time)
553*495ae853SAndroid Build Coastguard Worker {
554*495ae853SAndroid Build Coastguard Worker return (ps_frame_time->common_time_base / ps_frame_time->u4_src_frm_time_incr);
555*495ae853SAndroid Build Coastguard Worker }
556*495ae853SAndroid Build Coastguard Worker
557*495ae853SAndroid Build Coastguard Worker /**
558*495ae853SAndroid Build Coastguard Worker *******************************************************************************
559*495ae853SAndroid Build Coastguard Worker *
560*495ae853SAndroid Build Coastguard Worker * @brief Function to get target frame rate
561*495ae853SAndroid Build Coastguard Worker *
562*495ae853SAndroid Build Coastguard Worker * @par Description
563*495ae853SAndroid Build Coastguard Worker * Function to get target frame rate
564*495ae853SAndroid Build Coastguard Worker *
565*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
566*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
567*495ae853SAndroid Build Coastguard Worker *
568*495ae853SAndroid Build Coastguard Worker * @returns
569*495ae853SAndroid Build Coastguard Worker * target frame rate
570*495ae853SAndroid Build Coastguard Worker *
571*495ae853SAndroid Build Coastguard Worker * @remarks
572*495ae853SAndroid Build Coastguard Worker *
573*495ae853SAndroid Build Coastguard Worker *******************************************************************************
574*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_tgt_frame_rate(frame_time_t * ps_frame_time)575*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_tgt_frame_rate(frame_time_t *ps_frame_time)
576*495ae853SAndroid Build Coastguard Worker {
577*495ae853SAndroid Build Coastguard Worker return (ps_frame_time->common_time_base / ps_frame_time->u4_tgt_frm_time_incr);
578*495ae853SAndroid Build Coastguard Worker }
579*495ae853SAndroid Build Coastguard Worker
580*495ae853SAndroid Build Coastguard Worker /**
581*495ae853SAndroid Build Coastguard Worker *******************************************************************************
582*495ae853SAndroid Build Coastguard Worker *
583*495ae853SAndroid Build Coastguard Worker * @brief Function to get source time increment
584*495ae853SAndroid Build Coastguard Worker *
585*495ae853SAndroid Build Coastguard Worker * @par Description
586*495ae853SAndroid Build Coastguard Worker * Function to get source time increment
587*495ae853SAndroid Build Coastguard Worker *
588*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
589*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
590*495ae853SAndroid Build Coastguard Worker *
591*495ae853SAndroid Build Coastguard Worker * @returns
592*495ae853SAndroid Build Coastguard Worker * source time increment
593*495ae853SAndroid Build Coastguard Worker *
594*495ae853SAndroid Build Coastguard Worker * @remarks
595*495ae853SAndroid Build Coastguard Worker *
596*495ae853SAndroid Build Coastguard Worker *******************************************************************************
597*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_src_ticks(frame_time_t * ps_frame_time)598*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_src_ticks(frame_time_t *ps_frame_time)
599*495ae853SAndroid Build Coastguard Worker {
600*495ae853SAndroid Build Coastguard Worker return (ps_frame_time->u4_src_frm_time_incr);
601*495ae853SAndroid Build Coastguard Worker }
602*495ae853SAndroid Build Coastguard Worker
603*495ae853SAndroid Build Coastguard Worker /**
604*495ae853SAndroid Build Coastguard Worker *******************************************************************************
605*495ae853SAndroid Build Coastguard Worker *
606*495ae853SAndroid Build Coastguard Worker * @brief Function to get target time increment
607*495ae853SAndroid Build Coastguard Worker *
608*495ae853SAndroid Build Coastguard Worker * @par Description
609*495ae853SAndroid Build Coastguard Worker * Function to get target time increment
610*495ae853SAndroid Build Coastguard Worker *
611*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
612*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
613*495ae853SAndroid Build Coastguard Worker *
614*495ae853SAndroid Build Coastguard Worker * @returns
615*495ae853SAndroid Build Coastguard Worker * target time increment
616*495ae853SAndroid Build Coastguard Worker *
617*495ae853SAndroid Build Coastguard Worker * @remarks
618*495ae853SAndroid Build Coastguard Worker *
619*495ae853SAndroid Build Coastguard Worker *******************************************************************************
620*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_tgt_ticks(frame_time_t * ps_frame_time)621*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_tgt_ticks(frame_time_t *ps_frame_time)
622*495ae853SAndroid Build Coastguard Worker {
623*495ae853SAndroid Build Coastguard Worker return (ps_frame_time->u4_tgt_frm_time_incr);
624*495ae853SAndroid Build Coastguard Worker }
625*495ae853SAndroid Build Coastguard Worker
626*495ae853SAndroid Build Coastguard Worker /**
627*495ae853SAndroid Build Coastguard Worker *******************************************************************************
628*495ae853SAndroid Build Coastguard Worker *
629*495ae853SAndroid Build Coastguard Worker * @brief Function to get src frame time
630*495ae853SAndroid Build Coastguard Worker *
631*495ae853SAndroid Build Coastguard Worker * @par Description
632*495ae853SAndroid Build Coastguard Worker * Function to get src frame time
633*495ae853SAndroid Build Coastguard Worker *
634*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
635*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
636*495ae853SAndroid Build Coastguard Worker *
637*495ae853SAndroid Build Coastguard Worker * @returns
638*495ae853SAndroid Build Coastguard Worker * src frame time
639*495ae853SAndroid Build Coastguard Worker *
640*495ae853SAndroid Build Coastguard Worker * @remarks
641*495ae853SAndroid Build Coastguard Worker *
642*495ae853SAndroid Build Coastguard Worker *******************************************************************************
643*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_src_time(frame_time_t * frame_time)644*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_src_time(frame_time_t *frame_time)
645*495ae853SAndroid Build Coastguard Worker {
646*495ae853SAndroid Build Coastguard Worker return (frame_time->u4_src_frm_time);
647*495ae853SAndroid Build Coastguard Worker }
648*495ae853SAndroid Build Coastguard Worker
649*495ae853SAndroid Build Coastguard Worker /**
650*495ae853SAndroid Build Coastguard Worker *******************************************************************************
651*495ae853SAndroid Build Coastguard Worker *
652*495ae853SAndroid Build Coastguard Worker * @brief Function to get tgt frame time
653*495ae853SAndroid Build Coastguard Worker *
654*495ae853SAndroid Build Coastguard Worker * @par Description
655*495ae853SAndroid Build Coastguard Worker * Function to get tgt frame time
656*495ae853SAndroid Build Coastguard Worker *
657*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
658*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
659*495ae853SAndroid Build Coastguard Worker *
660*495ae853SAndroid Build Coastguard Worker * @returns
661*495ae853SAndroid Build Coastguard Worker * tgt frame time
662*495ae853SAndroid Build Coastguard Worker *
663*495ae853SAndroid Build Coastguard Worker * @remarks
664*495ae853SAndroid Build Coastguard Worker *
665*495ae853SAndroid Build Coastguard Worker *******************************************************************************
666*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_get_tgt_time(frame_time_t * frame_time)667*495ae853SAndroid Build Coastguard Worker WORD32 ih264e_frame_time_get_tgt_time(frame_time_t *frame_time)
668*495ae853SAndroid Build Coastguard Worker {
669*495ae853SAndroid Build Coastguard Worker return (frame_time->u4_tgt_frm_time);
670*495ae853SAndroid Build Coastguard Worker }
671*495ae853SAndroid Build Coastguard Worker
672*495ae853SAndroid Build Coastguard Worker /**
673*495ae853SAndroid Build Coastguard Worker *******************************************************************************
674*495ae853SAndroid Build Coastguard Worker *
675*495ae853SAndroid Build Coastguard Worker * @brief Function to update source frame time with a new source frame rate
676*495ae853SAndroid Build Coastguard Worker *
677*495ae853SAndroid Build Coastguard Worker * @par Description
678*495ae853SAndroid Build Coastguard Worker * Function to update source frame time with a new source frame rate
679*495ae853SAndroid Build Coastguard Worker *
680*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
681*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
682*495ae853SAndroid Build Coastguard Worker *
683*495ae853SAndroid Build Coastguard Worker * @param[in] src_frm_rate
684*495ae853SAndroid Build Coastguard Worker * source frame rate
685*495ae853SAndroid Build Coastguard Worker *
686*495ae853SAndroid Build Coastguard Worker * @returns
687*495ae853SAndroid Build Coastguard Worker * none
688*495ae853SAndroid Build Coastguard Worker *
689*495ae853SAndroid Build Coastguard Worker * @remarks
690*495ae853SAndroid Build Coastguard Worker *
691*495ae853SAndroid Build Coastguard Worker *******************************************************************************
692*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_update_src_frame_rate(frame_time_t * ps_frame_time,WORD32 src_frm_rate)693*495ae853SAndroid Build Coastguard Worker void ih264e_frame_time_update_src_frame_rate(frame_time_t *ps_frame_time,
694*495ae853SAndroid Build Coastguard Worker WORD32 src_frm_rate)
695*495ae853SAndroid Build Coastguard Worker {
696*495ae853SAndroid Build Coastguard Worker /* Since tgt frame rate does not change deriving the tgt_frm rate from
697*495ae853SAndroid Build Coastguard Worker * common_time_base */
698*495ae853SAndroid Build Coastguard Worker WORD32 tgt_frm_rate = ps_frame_time->common_time_base / ps_frame_time->u4_tgt_frm_time_incr;
699*495ae853SAndroid Build Coastguard Worker
700*495ae853SAndroid Build Coastguard Worker /* Re-initialise frame_time based on the new src_frame_rate and
701*495ae853SAndroid Build Coastguard Worker * old tgt_frame_rate */
702*495ae853SAndroid Build Coastguard Worker ih264e_init_frame_time(ps_frame_time, src_frm_rate, tgt_frm_rate);
703*495ae853SAndroid Build Coastguard Worker }
704*495ae853SAndroid Build Coastguard Worker
705*495ae853SAndroid Build Coastguard Worker /**
706*495ae853SAndroid Build Coastguard Worker *******************************************************************************
707*495ae853SAndroid Build Coastguard Worker *
708*495ae853SAndroid Build Coastguard Worker * @brief Function to update target frame time with a new source frame rate
709*495ae853SAndroid Build Coastguard Worker *
710*495ae853SAndroid Build Coastguard Worker * @par Description
711*495ae853SAndroid Build Coastguard Worker * Function to update target frame time with a new source frame rate
712*495ae853SAndroid Build Coastguard Worker *
713*495ae853SAndroid Build Coastguard Worker * @param[in] ps_frame_time
714*495ae853SAndroid Build Coastguard Worker * Pointer to frame time context
715*495ae853SAndroid Build Coastguard Worker *
716*495ae853SAndroid Build Coastguard Worker * @param[in] tgt_frm_rate
717*495ae853SAndroid Build Coastguard Worker * target frame rate
718*495ae853SAndroid Build Coastguard Worker *
719*495ae853SAndroid Build Coastguard Worker * @returns
720*495ae853SAndroid Build Coastguard Worker * none
721*495ae853SAndroid Build Coastguard Worker *
722*495ae853SAndroid Build Coastguard Worker * @remarks
723*495ae853SAndroid Build Coastguard Worker *
724*495ae853SAndroid Build Coastguard Worker *******************************************************************************
725*495ae853SAndroid Build Coastguard Worker */
ih264e_frame_time_update_tgt_frame_rate(frame_time_t * ps_frame_time,WORD32 tgt_frm_rate)726*495ae853SAndroid Build Coastguard Worker void ih264e_frame_time_update_tgt_frame_rate(frame_time_t *ps_frame_time,
727*495ae853SAndroid Build Coastguard Worker WORD32 tgt_frm_rate)
728*495ae853SAndroid Build Coastguard Worker {
729*495ae853SAndroid Build Coastguard Worker /* Since src frame rate does not change deriving the src_frm rate from
730*495ae853SAndroid Build Coastguard Worker * common_time_base */
731*495ae853SAndroid Build Coastguard Worker WORD32 src_frm_rate = ps_frame_time->common_time_base / ps_frame_time->u4_src_frm_time_incr;
732*495ae853SAndroid Build Coastguard Worker
733*495ae853SAndroid Build Coastguard Worker /* Re-initialise frame_time based on the new tgt_frame_rate and
734*495ae853SAndroid Build Coastguard Worker * old src_frame_rate */
735*495ae853SAndroid Build Coastguard Worker ih264e_init_frame_time(ps_frame_time, src_frm_rate, tgt_frm_rate);
736*495ae853SAndroid Build Coastguard Worker }
737*495ae853SAndroid Build Coastguard Worker
738*495ae853SAndroid Build Coastguard Worker /**
739*495ae853SAndroid Build Coastguard Worker *******************************************************************************
740*495ae853SAndroid Build Coastguard Worker *
741*495ae853SAndroid Build Coastguard Worker * @brief Function to update target frame time with a new source frame rate
742*495ae853SAndroid Build Coastguard Worker *
743*495ae853SAndroid Build Coastguard Worker * @par Description
744*495ae853SAndroid Build Coastguard Worker * When the frame rate changes the time increment is modified by appropriate ticks
745*495ae853SAndroid Build Coastguard Worker *
746*495ae853SAndroid Build Coastguard Worker * @param[in] ps_time_stamp
747*495ae853SAndroid Build Coastguard Worker * Pointer to time stamp structure
748*495ae853SAndroid Build Coastguard Worker *
749*495ae853SAndroid Build Coastguard Worker * @param[in] src_frm_rate
750*495ae853SAndroid Build Coastguard Worker * source frame rate
751*495ae853SAndroid Build Coastguard Worker *
752*495ae853SAndroid Build Coastguard Worker * @returns
753*495ae853SAndroid Build Coastguard Worker * none
754*495ae853SAndroid Build Coastguard Worker *
755*495ae853SAndroid Build Coastguard Worker * @remarks
756*495ae853SAndroid Build Coastguard Worker *
757*495ae853SAndroid Build Coastguard Worker *******************************************************************************
758*495ae853SAndroid Build Coastguard Worker */
ih264_time_stamp_update_frame_rate(time_stamp_t * ps_time_stamp,UWORD32 src_frm_rate)759*495ae853SAndroid Build Coastguard Worker void ih264_time_stamp_update_frame_rate(time_stamp_t *ps_time_stamp,
760*495ae853SAndroid Build Coastguard Worker UWORD32 src_frm_rate)
761*495ae853SAndroid Build Coastguard Worker {
762*495ae853SAndroid Build Coastguard Worker ps_time_stamp->u4_vop_time_incr = (ps_time_stamp->u4_vop_time_incr_res * 1000) / src_frm_rate;/* Since frm rate is in millisec */
763*495ae853SAndroid Build Coastguard Worker }
764