1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package com.android.tv.tuner.tvinput.debug; 18 19 import android.os.SystemClock; 20 import android.util.Log; 21 22 /** A class to maintain various debugging information. */ 23 public class TunerDebug { 24 private static final String TAG = "TunerDebug"; 25 public static final boolean ENABLED = false; 26 27 private int mVideoFrameDrop; 28 private int mBytesInQueue; 29 30 private long mAudioPositionUs; 31 private long mAudioPtsUs; 32 private long mVideoPtsUs; 33 34 private long mLastAudioPositionUs; 35 private long mLastAudioPtsUs; 36 private long mLastVideoPtsUs; 37 private long mLastCheckTimestampMs; 38 39 private long mAudioPositionUsRate; 40 private long mAudioPtsUsRate; 41 private long mVideoPtsUsRate; 42 TunerDebug()43 private TunerDebug() { 44 mVideoFrameDrop = 0; 45 mLastCheckTimestampMs = SystemClock.elapsedRealtime(); 46 } 47 48 private static class LazyHolder { 49 private static final TunerDebug INSTANCE = new TunerDebug(); 50 } 51 getInstance()52 public static TunerDebug getInstance() { 53 return LazyHolder.INSTANCE; 54 } 55 notifyVideoFrameDrop(int count, long delta)56 public static void notifyVideoFrameDrop(int count, long delta) { 57 // TODO: provide timestamp mismatch information using delta 58 TunerDebug sTunerDebug = getInstance(); 59 sTunerDebug.mVideoFrameDrop += count; 60 } 61 getVideoFrameDrop()62 public static int getVideoFrameDrop() { 63 TunerDebug sTunerDebug = getInstance(); 64 int videoFrameDrop = sTunerDebug.mVideoFrameDrop; 65 if (videoFrameDrop > 0) { 66 Log.d(TAG, "Dropped video frame: " + videoFrameDrop); 67 } 68 sTunerDebug.mVideoFrameDrop = 0; 69 return videoFrameDrop; 70 } 71 setBytesInQueue(int bytesInQueue)72 public static void setBytesInQueue(int bytesInQueue) { 73 TunerDebug sTunerDebug = getInstance(); 74 sTunerDebug.mBytesInQueue = bytesInQueue; 75 } 76 getBytesInQueue()77 public static int getBytesInQueue() { 78 TunerDebug sTunerDebug = getInstance(); 79 return sTunerDebug.mBytesInQueue; 80 } 81 setAudioPositionUs(long audioPositionUs)82 public static void setAudioPositionUs(long audioPositionUs) { 83 TunerDebug sTunerDebug = getInstance(); 84 sTunerDebug.mAudioPositionUs = audioPositionUs; 85 } 86 getAudioPositionUs()87 public static long getAudioPositionUs() { 88 TunerDebug sTunerDebug = getInstance(); 89 return sTunerDebug.mAudioPositionUs; 90 } 91 setAudioPtsUs(long audioPtsUs)92 public static void setAudioPtsUs(long audioPtsUs) { 93 TunerDebug sTunerDebug = getInstance(); 94 sTunerDebug.mAudioPtsUs = audioPtsUs; 95 } 96 getAudioPtsUs()97 public static long getAudioPtsUs() { 98 TunerDebug sTunerDebug = getInstance(); 99 return sTunerDebug.mAudioPtsUs; 100 } 101 setVideoPtsUs(long videoPtsUs)102 public static void setVideoPtsUs(long videoPtsUs) { 103 TunerDebug sTunerDebug = getInstance(); 104 sTunerDebug.mVideoPtsUs = videoPtsUs; 105 } 106 getVideoPtsUs()107 public static long getVideoPtsUs() { 108 TunerDebug sTunerDebug = getInstance(); 109 return sTunerDebug.mVideoPtsUs; 110 } 111 calculateDiff()112 public static void calculateDiff() { 113 TunerDebug sTunerDebug = getInstance(); 114 long currentTime = SystemClock.elapsedRealtime(); 115 long duration = currentTime - sTunerDebug.mLastCheckTimestampMs; 116 if (duration != 0) { 117 sTunerDebug.mAudioPositionUsRate = 118 (sTunerDebug.mAudioPositionUs - sTunerDebug.mLastAudioPositionUs) 119 * 1000 120 / duration; 121 sTunerDebug.mAudioPtsUsRate = 122 (sTunerDebug.mAudioPtsUs - sTunerDebug.mLastAudioPtsUs) * 1000 / duration; 123 sTunerDebug.mVideoPtsUsRate = 124 (sTunerDebug.mVideoPtsUs - sTunerDebug.mLastVideoPtsUs) * 1000 / duration; 125 } 126 127 sTunerDebug.mLastAudioPositionUs = sTunerDebug.mAudioPositionUs; 128 sTunerDebug.mLastAudioPtsUs = sTunerDebug.mAudioPtsUs; 129 sTunerDebug.mLastVideoPtsUs = sTunerDebug.mVideoPtsUs; 130 sTunerDebug.mLastCheckTimestampMs = currentTime; 131 } 132 getAudioPositionUsRate()133 public static long getAudioPositionUsRate() { 134 TunerDebug sTunerDebug = getInstance(); 135 return sTunerDebug.mAudioPositionUsRate; 136 } 137 getAudioPtsUsRate()138 public static long getAudioPtsUsRate() { 139 TunerDebug sTunerDebug = getInstance(); 140 return sTunerDebug.mAudioPtsUsRate; 141 } 142 getVideoPtsUsRate()143 public static long getVideoPtsUsRate() { 144 TunerDebug sTunerDebug = getInstance(); 145 return sTunerDebug.mVideoPtsUsRate; 146 } 147 } 148