blob: d3af887fd3d40f7d7ce180cb137d0f9e350d471c [file] [log] [blame]
/******************************************************************************
*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*****************************************************************************
* Originally developed and contributed by Ittiam Systems Pvt. Ltd, Bangalore
*/
/**
*******************************************************************************
* @file
* ih264e_time_stamp.h
*
* @brief
* This file contains function declarations used for managing input and output
* frame time stamps
*
* @author
* ittiam
*
* @remarks
* none
*
*******************************************************************************
*/
#ifndef _IH264E_TIME_STAMP_H_
#define _IH264E_TIME_STAMP_H_
/*****************************************************************************/
/* Structures */
/*****************************************************************************/
/**
* Parameters for Src/Tgt frames that are encoded
*/
typedef struct frame_time_t
{
/* common time base(=LCM) between source and target frame rate (in ticks)*/
WORD32 common_time_base;
/* number of ticks between two source frames */
UWORD32 u4_src_frm_time_incr;
/* number of ticks between two target frames */
UWORD32 u4_tgt_frm_time_incr;
/* Source frame time - measured as modulo of common time base
and incremented by src_frm_time_incr */
UWORD32 u4_src_frm_time;
/* Target frame time - measured as modulo of common time base
and incremented by tgt_frm_time_incr */
UWORD32 u4_tgt_frm_time;
/* Number of frames not to be skipped while maintaining
tgt_frm_rate due to delta_time_stamp */
UWORD32 u4_num_frms_dont_skip;
}frame_time_t;
typedef struct frame_time_t *frame_time_handle;
/**
* Parameters that go in the bitstream based on tgt_frm_rate
* 1) Initialize the vop_time_incr_res with the max_frame_rate (in frames per 1000 bits)
* - To represent all kinds of frame rates
* 2) Decide the vop_time_incr based on the source frame rate
* - The decoder would like to know which source frame is encoded i.e. the source time
* id of the target frame encoded and there by adjusting its time of delay
* 3) vop_time increments every source frame and whenever a frame is encoded (target frame),
* the encoder queries the vop time of the source frame and sends it in the bit stream.
* 4) Since the Source frame skip logic is taken care by the frame_time module, whenever the
* encoder queries the time stamp module (which gets updated outside the encoder) the
* time stamp module would have the source time
*/
typedef struct time_stamp_t
{
/*vop_time_incr_res is a integer that indicates
the number of evenly spaced subintervals, called ticks,
within one modulo time. */
UWORD32 u4_vop_time_incr_res;
/* number of bits to represent vop_time_incr_res */
UWORD32 u4_vop_time_incr_range;
/* The number of ticks elapsed between two source vops */
UWORD32 u4_vop_time_incr;
/* incremented by vop_time_incr for every source frame.
Represents the time offset after a modulo_time_base = 1 is sent
in bit stream*/
UWORD32 u4_vop_time;
/* A temporary buffer to copy of vop time and modulo time base
is stored since update is called before query (get time stamp) and
so these extra variables cur_tgt_vop_time, */
UWORD32 u4_cur_tgt_vop_time;
UWORD32 u4_prev_tgt_vop_time;
/* This variable is set to 1 if we scale max frame rate by a factor of 2.
For mpeg4 standard, we just have 16bits and we can't accommodate more than 60000 as frame rate.
So we scale it and work with it */
WORD32 is_max_frame_rate_scaled;
} time_stamp_t;
typedef struct time_stamp_t *time_stamp_handle;
/*****************************************************************************/
/* Function declarations */
/*****************************************************************************/
void ih264e_init_frame_time(frame_time_t *ps_frame_time,
UWORD32 u4_src_frm_rate,
UWORD32 u4_tgt_frm_rate);
UWORD8 ih264e_should_src_be_skipped(frame_time_t *ps_frame_time,
UWORD32 u4_delta_time_stamp,
UWORD32 *pu4_frm_not_skipped_for_dts);
void ih264e_init_time_stamp(time_stamp_handle time_stamp,
UWORD32 max_frm_rate,
UWORD32 src_frm_rate);
void ih264e_update_time_stamp(time_stamp_handle time_stamp);
WORD32 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);
WORD32 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);
WORD32 ih264e_frame_time_get_src_frame_rate(frame_time_t *ps_frame_time);
WORD32 ih264e_frame_time_get_tgt_frame_rate(frame_time_t *ps_frame_time);
WORD32 ih264e_frame_time_get_src_ticks(frame_time_t *ps_frame_time);
WORD32 ih264e_frame_time_get_tgt_ticks(frame_time_t *ps_frame_time);
WORD32 ih264e_frame_time_get_src_time(frame_time_t *frame_time);
WORD32 ih264e_frame_time_get_tgt_time(frame_time_t *frame_time);
void ih264e_frame_time_update_src_frame_rate(frame_time_t *ps_frame_time,
WORD32 src_frm_rate);
void ih264e_frame_time_update_tgt_frame_rate(frame_time_t *ps_frame_time,
WORD32 tgt_frm_rate);
void ih264_time_stamp_update_frame_rate(time_stamp_t *ps_time_stamp,
UWORD32 src_frm_rate);
#endif /*_IH264E_TIME_STAMP_H_ */