| /* | |
| * Copyright 2018 The WebRTC 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. | |
| */ | |
| package org.webrtc; | |
| /** | |
| * The TimestampAligner class helps translating camera timestamps into the same timescale as is | |
| * used by webrtc::TimeNanos(). Some cameras have built in timestamping which is more accurate than | |
| * reading the system clock, but using a different epoch and unknown clock drift. Frame timestamps | |
| * in webrtc should use webrtc::TimeNanos (system monotonic time), and this class provides a filter | |
| * which lets us use the webrtc::TimeNanos timescale, and at the same time take advantage of higher | |
| * accuracy of the camera clock. This class is a wrapper on top of webrtc::TimestampAligner. | |
| */ | |
| public class TimestampAligner { | |
| /** | |
| * Wrapper around webrtc::TimeNanos(). This is normally same as System.nanoTime(), but call this | |
| * function to be safe. | |
| */ | |
| public static long getRtcTimeNanos() { | |
| return nativeRtcTimeNanos(); | |
| } | |
| private volatile long nativeTimestampAligner = nativeCreateTimestampAligner(); | |
| /** | |
| * Translates camera timestamps to the same timescale as is used by webrtc::TimeNanos(). | |
| * `cameraTimeNs` is assumed to be accurate, but with an unknown epoch and clock drift. Returns | |
| * the translated timestamp. | |
| */ | |
| public long translateTimestamp(long cameraTimeNs) { | |
| checkNativeAlignerExists(); | |
| return nativeTranslateTimestamp(nativeTimestampAligner, cameraTimeNs); | |
| } | |
| /** Dispose native timestamp aligner. */ | |
| public void dispose() { | |
| checkNativeAlignerExists(); | |
| nativeReleaseTimestampAligner(nativeTimestampAligner); | |
| nativeTimestampAligner = 0; | |
| } | |
| private void checkNativeAlignerExists() { | |
| if (nativeTimestampAligner == 0) { | |
| throw new IllegalStateException("TimestampAligner has been disposed."); | |
| } | |
| } | |
| private static native long nativeRtcTimeNanos(); | |
| private static native long nativeCreateTimestampAligner(); | |
| private static native void nativeReleaseTimestampAligner(long timestampAligner); | |
| private static native long nativeTranslateTimestamp(long timestampAligner, long cameraTimeNs); | |
| } |