ih264e_time_stamp.h revision 8d3d303c7942ced6a987a52db8977d768dc3605f
1/******************************************************************************
2 *
3 * Copyright (C) 2015 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at:
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 *
17 *****************************************************************************
18 * Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
19*/
20
21/**
22*******************************************************************************
23* @file
24*  ih264e_time_stamp.h
25*
26* @brief
27*  This file contains function declarations used for managing input and output
28*  frame time stamps
29*
30* @author
31*  ittiam
32*
33* @remarks
34*  None
35*
36*******************************************************************************
37*/
38
39#ifndef IH264E_TIME_STAMP_H_
40#define IH264E_TIME_STAMP_H_
41
42/*****************************************************************************/
43/* Structures                                                                */
44/*****************************************************************************/
45
46/**
47 * Parameters for Src/Tgt frames that are encoded
48 */
49typedef struct frame_time_t
50{
51    /* common time base(=LCM) between source and target frame rate (in ticks)*/
52    WORD32 common_time_base;
53
54    /* number of ticks between two source frames */
55    UWORD32 u4_src_frm_time_incr;
56
57    /* number of ticks between two target frames */
58    UWORD32 u4_tgt_frm_time_incr;
59
60    /* Source frame time - measured as modulo of common time base
61     and incremented by src_frm_time_incr */
62    UWORD32 u4_src_frm_time;
63
64    /* Target frame time - measured as modulo of common time base
65     and incremented by tgt_frm_time_incr */
66    UWORD32 u4_tgt_frm_time;
67
68    /* Number of frames not to be skipped while maintaining
69     tgt_frm_rate due to delta_time_stamp  */
70    UWORD32 u4_num_frms_dont_skip;
71}frame_time_t;
72
73typedef struct frame_time_t *frame_time_handle;
74
75/**
76 *  Parameters that go in the bitstream based on tgt_frm_rate
77 *   1) Initialize the vop_time_incr_res with the max_frame_rate (in frames per 1000 bits)
78 *      - To represent all kinds of frame rates
79 *   2) Decide the vop_time_incr based on the source frame rate
80 *      - The decoder would like to know which source frame is encoded i.e. the source time
81 *    id of the target frame encoded and there by adjusting its time of delay
82 *   3) vop_time increments every source frame and whenever a frame is encoded (target frame),
83 *      the encoder queries the vop time of the source frame and sends it in the bit stream.
84 *   4) Since the Source frame skip logic is taken care by the frame_time module, whenever the
85 *      encoder queries the time stamp module (which gets updated outside the encoder) the
86 *      time stamp module would have the source time
87 */
88typedef struct time_stamp_t
89{
90    /*vop_time_incr_res is a integer that indicates
91     the number of evenly spaced subintervals, called ticks,
92     within one modulo time. */
93    UWORD32 u4_vop_time_incr_res;
94
95    /* number of bits to represent vop_time_incr_res */
96    UWORD32 u4_vop_time_incr_range;
97
98    /* The number of ticks elapsed between two source vops */
99    UWORD32 u4_vop_time_incr;
100
101    /* incremented by vop_time_incr for every source frame.
102     Represents the time offset after a modulo_time_base = 1 is sent
103     in bit stream*/
104    UWORD32 u4_vop_time;
105
106    /* A temporary buffer to copy of vop time and modulo time base
107     is stored since update is called before query (get time stamp) and
108     so these extra variables cur_tgt_vop_time,  */
109    UWORD32 u4_cur_tgt_vop_time;
110
111    UWORD32 u4_prev_tgt_vop_time;
112
113    /* This variable is set to 1 if we scale max frame rate by a factor of 2.
114     For mpeg4 standard, we just have 16bits and we can't accommodate more than 60000 as frame rate.
115     So we scale it and work with it */
116    WORD32 is_max_frame_rate_scaled;
117} time_stamp_t;
118
119typedef struct time_stamp_t *time_stamp_handle;
120
121/*****************************************************************************/
122/* Extern function declarations                                              */
123/*****************************************************************************/
124
125/**
126*******************************************************************************
127*
128* @brief
129*  Function to init frame time context
130*
131* @par Description
132*  Frame time structure stores the time of the source and the target frames to
133*  be encoded. Based on the time we decide whether or not to encode the source
134*  frame
135*
136* @param[in] ps_frame_time
137*  Pointer Frame time context
138*
139* @param[in] u4_src_frm_rate
140*  Source frame rate
141*
142* @param[in] u4_tgt_frm_rate
143*  Target frame rate
144*
145* @returns
146*  none
147*
148* @remarks
149*
150*******************************************************************************
151*/
152void ih264e_init_frame_time(frame_time_t *ps_frame_time,
153                            UWORD32 u4_src_frm_rate,
154                            UWORD32 u4_tgt_frm_rate);
155
156/**
157*******************************************************************************
158*
159* @brief
160*  Function to check if frame can be skipped
161*
162* @par Description
163*  Based on the source and target frame time and the delta time stamp
164*  we decide whether to code the source or not.
165*  This is based on the assumption
166*  that the source frame rate is greater that target frame rate.
167*  Updates the time_stamp structure
168*
169* @param[in] ps_frame_time
170*  Handle to frame time context
171*
172* @param[in] u4_delta_time_stamp
173*  Time stamp difference between frames
174*
175* @param[out] pu4_frm_not_skipped_for_dts
176*  Flag to indicate if frame is already skipped by application
177*
178* @returns
179*  Flag to skip frame
180*
181* @remarks
182*
183*******************************************************************************
184*/
185UWORD8 ih264e_should_src_be_skipped(frame_time_t *ps_frame_time,
186                                    UWORD32 u4_delta_time_stamp,
187                                    UWORD32 *pu4_frm_not_skipped_for_dts);
188
189/**
190*******************************************************************************
191*
192* @brief
193*  Function to initialize time stamp context
194*
195* @par Description
196*  Time stamp structure stores the time stamp data that
197*  needs to be sent in to the header of MPEG4. Based on the
198*  max target frame rate the vop_time increment resolution is set
199*  so as to support all the frame rates below max frame rate.
200*  A support till the third decimal point is assumed.
201*
202* @param[in] ps_time_stamp
203*  Pointer to time stamp structure
204*
205* @param[in] u4_max_frm_rate
206*  Maximum frame rate
207*
208* @param[in] u4_src_frm_rate
209*  Source frame rate
210*
211* @returns
212*  none
213*
214* @remarks
215*
216*******************************************************************************
217*/
218void ih264e_init_time_stamp(time_stamp_handle time_stamp,
219                            UWORD32 max_frm_rate,
220                            UWORD32 src_frm_rate);
221
222/**
223*******************************************************************************
224*
225* @brief Function to update time stamp context
226*
227* @par Description
228*  Vop time is incremented by increment value. When vop time goes
229*  more than the vop time resolution set the modulo time base to
230*  1 and reduce the vop time by vop time resolution so that the
231*  excess value is present in vop time and get accumulated over time
232*  so that the corresponding frame rate is achieved at a average of
233*  1000 seconds
234*
235* @param[in] ps_time_stamp
236*  Pointer to time stamp structure
237*
238* @returns
239*  none
240*
241* @remarks
242*
243*******************************************************************************
244*/
245void ih264e_update_time_stamp(time_stamp_handle time_stamp);
246
247/**
248*******************************************************************************
249*
250* @brief
251*  Function to init frame time memtabs
252*
253* @par Description
254*  Function to init frame time memtabs
255*
256* @param[in] pps_frame_time
257*  Pointer to frame time contexts
258*
259* @param[in] ps_memtab
260*  Pointer to memtab
261*
262* @param[in] e_func_type
263*  Function type (get memtabs/init memtabs)
264*
265* @returns
266*  none
267*
268* @remarks
269*
270*******************************************************************************
271*/
272WORD32 ih264e_frame_time_get_init_free_memtab(frame_time_handle *pps_frame_time,
273                                              itt_memtab_t *ps_memtab,
274                                              ITT_FUNC_TYPE_E e_func_type);
275
276/**
277*******************************************************************************
278*
279* @brief
280*  Function to initialize time stamp memtabs
281*
282* @par Description
283*  Function to initialize time stamp memtabs
284*
285* @param[in] pps_time_stamp
286*  Pointer to time stamp context
287*
288* @param[in] ps_memtab
289*  Pointer to memtab
290*
291* @param[in] e_func_type
292*  Funcion type (Get memtab/ init memtab)
293*
294* @returns
295*   number of memtabs used
296*
297* @remarks
298*
299*******************************************************************************
300*/
301WORD32 ih264e_time_stamp_get_init_free_memtab(time_stamp_handle *pps_time_stamp,
302                                              itt_memtab_t *ps_memtab,
303                                              ITT_FUNC_TYPE_E e_func_type);
304
305/****************************************************************************
306                       Run-Time Modifying functions
307****************************************************************************/
308/**
309*******************************************************************************
310*
311* @brief Function to get source frame rate
312*
313* @par Description
314*  Function to get source frame rate
315*
316* @param[in] ps_frame_time
317*  Pointer to frame time context
318*
319* @returns
320*  source frame rate
321*
322* @remarks
323*
324*******************************************************************************
325*/
326WORD32 ih264e_frame_time_get_src_frame_rate(frame_time_t *ps_frame_time);
327
328/**
329*******************************************************************************
330*
331* @brief Function to get target frame rate
332*
333* @par Description
334*  Function to get target frame rate
335*
336* @param[in] ps_frame_time
337*  Pointer to frame time context
338*
339* @returns
340*   target frame rate
341*
342* @remarks
343*
344*******************************************************************************
345*/
346WORD32 ih264e_frame_time_get_tgt_frame_rate(frame_time_t *ps_frame_time);
347
348/**
349*******************************************************************************
350*
351* @brief Function to get source time increment
352*
353* @par Description
354*  Function to get source time increment
355*
356* @param[in] ps_frame_time
357*  Pointer to frame time context
358*
359* @returns
360*  source time increment
361*
362* @remarks
363*
364*******************************************************************************
365*/
366WORD32 ih264e_frame_time_get_src_ticks(frame_time_t *ps_frame_time);
367
368/**
369*******************************************************************************
370*
371* @brief Function to get target time increment
372*
373* @par Description
374*  Function to get target time increment
375*
376* @param[in] ps_frame_time
377*  Pointer to frame time context
378*
379* @returns
380*  target time increment
381*
382* @remarks
383*
384*******************************************************************************
385*/
386WORD32 ih264e_frame_time_get_tgt_ticks(frame_time_t *ps_frame_time);
387
388/**
389*******************************************************************************
390*
391* @brief Function to get src frame time
392*
393* @par Description
394*  Function to get src frame time
395*
396* @param[in] ps_frame_time
397*  Pointer to frame time context
398*
399* @returns
400*  src frame time
401*
402* @remarks
403*
404*******************************************************************************
405*/
406WORD32 ih264e_frame_time_get_src_time(frame_time_t *frame_time);
407
408/**
409*******************************************************************************
410*
411* @brief Function to get tgt frame time
412*
413* @par Description
414*  Function to get tgt frame time
415*
416* @param[in] ps_frame_time
417*  Pointer to frame time context
418*
419* @returns
420*  tgt frame time
421*
422* @remarks
423*
424*******************************************************************************
425*/
426WORD32 ih264e_frame_time_get_tgt_time(frame_time_t *frame_time);
427
428/**
429*******************************************************************************
430*
431* @brief Function to update source frame time with a new source frame rate
432*
433* @par Description
434*  Function to update source frame time with a new source frame rate
435*
436* @param[in] ps_frame_time
437*  Pointer to frame time context
438*
439* @param[in] src_frm_rate
440*  source frame rate
441*
442* @returns
443*  None
444*
445* @remarks
446*
447*******************************************************************************
448*/
449void ih264e_frame_time_update_src_frame_rate(frame_time_t *ps_frame_time, WORD32 src_frm_rate);
450
451/**
452*******************************************************************************
453*
454* @brief Function to update target frame time with a new source frame rate
455*
456* @par Description
457*  Function to update target frame time with a new source frame rate
458*
459* @param[in] ps_frame_time
460*  Pointer to frame time context
461*
462* @param[in] tgt_frm_rate
463*  target frame rate
464*
465* @returns
466*  None
467*
468* @remarks
469*
470*******************************************************************************
471*/
472void ih264e_frame_time_update_tgt_frame_rate(frame_time_t *ps_frame_time, WORD32 tgt_frm_rate);
473
474/**
475*******************************************************************************
476*
477* @brief Function to update target frame time with a new source frame rate
478*
479* @par Description
480*  When the frame rate changes the time increment is modified by appropriate ticks
481*
482* @param[in] ps_time_stamp
483*  Pointer to time stamp structure
484*
485* @param[in] src_frm_rate
486*  source frame rate
487*
488* @returns
489*  None
490*
491* @remarks
492*
493*******************************************************************************
494*/
495void ih264_time_stamp_update_frame_rate(time_stamp_t *ps_time_stamp, UWORD32 src_frm_rate);
496
497#endif /*IH264E_TIME_STAMP_H_*/
498
499