11abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/*
21abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Copyright (C) 2015 The Android Open Source Project
31abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
41abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Licensed under the Apache License, Version 2.0 (the "License");
51abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * you may not use this file except in compliance with the License.
61abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * You may obtain a copy of the License at
71abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
81abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *      http://www.apache.org/licenses/LICENSE-2.0
91abddd9f6225298066094e20a6c29061b6af4590Nick Chalko *
101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Unless required by applicable law or agreed to in writing, software
111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * distributed under the License is distributed on an "AS IS" BASIS,
121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * See the License for the specific language governing permissions and
141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * limitations under the License.
151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
171abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopackage com.android.usbtuner.tvinput;
181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
191abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.os.SystemClock;
201abddd9f6225298066094e20a6c29061b6af4590Nick Chalkoimport android.util.Log;
211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/**
231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * A class to maintain various debugging information.
241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */
251abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class UsbTunerDebug {
261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static final String TAG = "UsbTunerDebug";
27ba5845f23b8fbc985890f892961abc8b39886611Nick Chalko    public static final boolean ENABLED = false;
281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private int mVideoFrameDrop;
301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private int mBytesInQueue;
311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mAudioPositionUs;
331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mAudioPtsUs;
341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mVideoPtsUs;
351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mLastAudioPositionUs;
371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mLastAudioPtsUs;
381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mLastVideoPtsUs;
391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mLastCheckTimestampMs;
401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mAudioPositionUsRate;
421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mAudioPtsUsRate;
431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private long mVideoPtsUsRate;
441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private UsbTunerDebug() {
461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        mVideoFrameDrop = 0;
471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        mLastCheckTimestampMs = SystemClock.elapsedRealtime();
481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    private static class LazyHolder {
511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        private static final UsbTunerDebug INSTANCE = new UsbTunerDebug();
521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static UsbTunerDebug getInstance() {
551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return LazyHolder.INSTANCE;
561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
581abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void notifyVideoFrameDrop(long delta) {
591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        // TODO: provide timestamp mismatch information using delta
601abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mVideoFrameDrop++;
621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
641abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static int getVideoFrameDrop() {
651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
661abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        int videoFrameDrop = sUsbTunerDebug.mVideoFrameDrop;
671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (videoFrameDrop > 0) {
681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            Log.d(TAG, "Dropped video frame: " + videoFrameDrop);
691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mVideoFrameDrop = 0;
711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return videoFrameDrop;
721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void setBytesInQueue(int bytesInQueue) {
751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mBytesInQueue = bytesInQueue;
771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static int getBytesInQueue() {
801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mBytesInQueue;
821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void setAudioPositionUs(long audioPositionUs) {
851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mAudioPositionUs = audioPositionUs;
871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getAudioPositionUs() {
901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mAudioPositionUs;
921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void setAudioPtsUs(long audioPtsUs) {
951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mAudioPtsUs = audioPtsUs;
971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getAudioPtsUs() {
1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mAudioPtsUs;
1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void setVideoPtsUs(long videoPtsUs) {
1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mVideoPtsUs = videoPtsUs;
1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getVideoPtsUs() {
1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mVideoPtsUs;
1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static void calculateDiff() {
1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        long currentTime = SystemClock.elapsedRealtime();
1171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        long duration = currentTime - sUsbTunerDebug.mLastCheckTimestampMs;
1181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        if (duration != 0) {
1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            sUsbTunerDebug.mAudioPositionUsRate =
1201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    (sUsbTunerDebug.mAudioPositionUs - sUsbTunerDebug.mLastAudioPositionUs) * 1000
1211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    / duration;
1221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            sUsbTunerDebug.mAudioPtsUsRate =
1231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    (sUsbTunerDebug.mAudioPtsUs - sUsbTunerDebug.mLastAudioPtsUs) * 1000
1241abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    / duration;
1251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko            sUsbTunerDebug.mVideoPtsUsRate =
1261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    (sUsbTunerDebug.mVideoPtsUs - sUsbTunerDebug.mLastVideoPtsUs) * 1000
1271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko                    / duration;
1281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        }
1291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mLastAudioPositionUs = sUsbTunerDebug.mAudioPositionUs;
1311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mLastAudioPtsUs = sUsbTunerDebug.mAudioPtsUs;
1321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mLastVideoPtsUs = sUsbTunerDebug.mVideoPtsUs;
1331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        sUsbTunerDebug.mLastCheckTimestampMs = currentTime;
1341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getAudioPositionUsRate() {
1371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1381abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mAudioPositionUsRate;
1391abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getAudioPtsUsRate() {
1421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mAudioPtsUsRate;
1441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko
1461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    public static long getVideoPtsUsRate() {
1471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        UsbTunerDebug sUsbTunerDebug = getInstance();
1481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko        return sUsbTunerDebug.mVideoPtsUsRate;
1491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko    }
1501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko}
151