blob: 1ee559da2128e021bcde7488bc80a7cdafa813f0 [file] [log] [blame]
Hamsalekha S8d3d3032015-03-13 21:24:58 +05301/******************************************************************************
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