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 */ 49 typedef 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 73 typedef 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 */ 88 typedef 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 119 typedef 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 */ 152 void 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 */ 185 UWORD8 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 */ 218 void 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 */ 245 void 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 */ 272 WORD32 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 */ 301 WORD32 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 */ 326 WORD32 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 */ 346 WORD32 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 */ 366 WORD32 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 */ 386 WORD32 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 */ 406 WORD32 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 */ 426 WORD32 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 */ 449 void 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 */ 472 void 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 */ 495 void 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