| /****************************************************************************** |
| * |
| * 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; |
| |
| /*****************************************************************************/ |
| /* Extern function declarations */ |
| /*****************************************************************************/ |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to init frame time context |
| * |
| * @par Description |
| * Frame time structure stores the time of the source and the target frames to |
| * be encoded. Based on the time we decide whether or not to encode the source |
| * frame |
| * |
| * @param[in] ps_frame_time |
| * Pointer Frame time context |
| * |
| * @param[in] u4_src_frm_rate |
| * Source frame rate |
| * |
| * @param[in] u4_tgt_frm_rate |
| * Target frame rate |
| * |
| * @returns |
| * none |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_init_frame_time(frame_time_t *ps_frame_time, |
| UWORD32 u4_src_frm_rate, |
| UWORD32 u4_tgt_frm_rate); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to check if frame can be skipped |
| * |
| * @par Description |
| * Based on the source and target frame time and the delta time stamp |
| * we decide whether to code the source or not. |
| * This is based on the assumption |
| * that the source frame rate is greater that target frame rate. |
| * Updates the time_stamp structure |
| * |
| * @param[in] ps_frame_time |
| * Handle to frame time context |
| * |
| * @param[in] u4_delta_time_stamp |
| * Time stamp difference between frames |
| * |
| * @param[out] pu4_frm_not_skipped_for_dts |
| * Flag to indicate if frame is already skipped by application |
| * |
| * @returns |
| * Flag to skip frame |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| UWORD8 ih264e_should_src_be_skipped(frame_time_t *ps_frame_time, |
| UWORD32 u4_delta_time_stamp, |
| UWORD32 *pu4_frm_not_skipped_for_dts); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to initialize time stamp context |
| * |
| * @par Description |
| * Time stamp structure stores the time stamp data that |
| * needs to be sent in to the header of MPEG4. Based on the |
| * max target frame rate the vop_time increment resolution is set |
| * so as to support all the frame rates below max frame rate. |
| * A support till the third decimal point is assumed. |
| * |
| * @param[in] ps_time_stamp |
| * Pointer to time stamp structure |
| * |
| * @param[in] u4_max_frm_rate |
| * Maximum frame rate |
| * |
| * @param[in] u4_src_frm_rate |
| * Source frame rate |
| * |
| * @returns |
| * none |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_init_time_stamp(time_stamp_handle time_stamp, |
| UWORD32 max_frm_rate, |
| UWORD32 src_frm_rate); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to update time stamp context |
| * |
| * @par Description |
| * Vop time is incremented by increment value. When vop time goes |
| * more than the vop time resolution set the modulo time base to |
| * 1 and reduce the vop time by vop time resolution so that the |
| * excess value is present in vop time and get accumulated over time |
| * so that the corresponding frame rate is achieved at a average of |
| * 1000 seconds |
| * |
| * @param[in] ps_time_stamp |
| * Pointer to time stamp structure |
| * |
| * @returns |
| * none |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_update_time_stamp(time_stamp_handle time_stamp); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to init frame time memtabs |
| * |
| * @par Description |
| * Function to init frame time memtabs |
| * |
| * @param[in] pps_frame_time |
| * Pointer to frame time contexts |
| * |
| * @param[in] ps_memtab |
| * Pointer to memtab |
| * |
| * @param[in] e_func_type |
| * Function type (get memtabs/init memtabs) |
| * |
| * @returns |
| * none |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| 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); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief |
| * Function to initialize time stamp memtabs |
| * |
| * @par Description |
| * Function to initialize time stamp memtabs |
| * |
| * @param[in] pps_time_stamp |
| * Pointer to time stamp context |
| * |
| * @param[in] ps_memtab |
| * Pointer to memtab |
| * |
| * @param[in] e_func_type |
| * Funcion type (Get memtab/ init memtab) |
| * |
| * @returns |
| * number of memtabs used |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| 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); |
| |
| /**************************************************************************** |
| Run-Time Modifying functions |
| ****************************************************************************/ |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get source frame rate |
| * |
| * @par Description |
| * Function to get source frame rate |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * source frame rate |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_src_frame_rate(frame_time_t *ps_frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get target frame rate |
| * |
| * @par Description |
| * Function to get target frame rate |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * target frame rate |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_tgt_frame_rate(frame_time_t *ps_frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get source time increment |
| * |
| * @par Description |
| * Function to get source time increment |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * source time increment |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_src_ticks(frame_time_t *ps_frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get target time increment |
| * |
| * @par Description |
| * Function to get target time increment |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * target time increment |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_tgt_ticks(frame_time_t *ps_frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get src frame time |
| * |
| * @par Description |
| * Function to get src frame time |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * src frame time |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_src_time(frame_time_t *frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to get tgt frame time |
| * |
| * @par Description |
| * Function to get tgt frame time |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @returns |
| * tgt frame time |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| WORD32 ih264e_frame_time_get_tgt_time(frame_time_t *frame_time); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to update source frame time with a new source frame rate |
| * |
| * @par Description |
| * Function to update source frame time with a new source frame rate |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @param[in] src_frm_rate |
| * source frame rate |
| * |
| * @returns |
| * None |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_frame_time_update_src_frame_rate(frame_time_t *ps_frame_time, WORD32 src_frm_rate); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to update target frame time with a new source frame rate |
| * |
| * @par Description |
| * Function to update target frame time with a new source frame rate |
| * |
| * @param[in] ps_frame_time |
| * Pointer to frame time context |
| * |
| * @param[in] tgt_frm_rate |
| * target frame rate |
| * |
| * @returns |
| * None |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264e_frame_time_update_tgt_frame_rate(frame_time_t *ps_frame_time, WORD32 tgt_frm_rate); |
| |
| /** |
| ******************************************************************************* |
| * |
| * @brief Function to update target frame time with a new source frame rate |
| * |
| * @par Description |
| * When the frame rate changes the time increment is modified by appropriate ticks |
| * |
| * @param[in] ps_time_stamp |
| * Pointer to time stamp structure |
| * |
| * @param[in] src_frm_rate |
| * source frame rate |
| * |
| * @returns |
| * None |
| * |
| * @remarks |
| * |
| ******************************************************************************* |
| */ |
| void ih264_time_stamp_update_frame_rate(time_stamp_t *ps_time_stamp, UWORD32 src_frm_rate); |
| |
| #endif /*IH264E_TIME_STAMP_H_*/ |
| |