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