Files
android_external_libvpx/vpx_util/vpx_timestamp.h
Yue Chen 11de1b8381 Fix timestamp overflow issues
- Save the initial user-specified timestamp and rebase all further
timestamps by this value. This makes libvpx internal timestamps to
always start from zero, regardless of the user's timestamps.
- Calculate reduced timestamp conversion ratio and use it to convert
user's timestamps to libvpx internal timestamps and back. The effect
of this is that integer overflow due to multiplication doesn't
happen for a much longer time.

BUG=webm:701

Change-Id: Ic6f5eacd9a7c21b95707d31ee2da77dc8ac7dccf
2019-06-18 10:41:10 -07:00

46 lines
1.1 KiB
C

/*
* Copyright (c) 2019 The WebM project authors. All Rights Reserved.
*
* Use of this source code is governed by a BSD-style license
* that can be found in the LICENSE file in the root of the source
* tree. An additional intellectual property rights grant can be found
* in the file PATENTS. All contributing project authors may
* be found in the AUTHORS file in the root of the source tree.
*/
#ifndef VPX_VPX_UTIL_VPX_TIMESTAMP_H_
#define VPX_VPX_UTIL_VPX_TIMESTAMP_H_
#ifdef __cplusplus
extern "C" {
#endif // __cplusplus
// Rational Number with an int64 numerator
typedef struct vpx_rational64 {
int64_t num; // fraction numerator
int den; // fraction denominator
} vpx_rational64_t; // alias for struct vpx_rational64_t
static INLINE int gcd(int64_t a, int b) {
int r; // remainder
while (b > 0) {
r = (int)(a % b);
a = b;
b = r;
}
return (int)a;
}
static INLINE void reduce_ratio(vpx_rational64_t *ratio) {
const int denom = gcd(ratio->num, ratio->den);
ratio->num /= denom;
ratio->den /= denom;
}
#ifdef __cplusplus
} // extern "C"
#endif // __cplusplus
#endif // VPX_VPX_UTIL_VPX_TIMESTAMP_H_