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 1765fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkopackage com.android.tv.tuner.util; 1865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko 1965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalkoimport java.util.Locale; 201abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 211abddd9f6225298066094e20a6c29061b6af4590Nick Chalko/** 221abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Utility class for tuner status messages. 231abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 241abddd9f6225298066094e20a6c29061b6af4590Nick Chalkopublic class StatusTextUtils { 251abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final int PACKETS_PER_SEC_YELLOW = 1500; 261abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final int PACKETS_PER_SEC_RED = 1000; 271abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final int AUDIO_POSITION_MS_RATE_DIFF_YELLOW = 100; 281abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final int AUDIO_POSITION_MS_RATE_DIFF_RED = 200; 291abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String COLOR_RED = "red"; 301abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String COLOR_YELLOW = "yellow"; 311abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String COLOR_GREEN = "green"; 321abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static final String COLOR_GRAY = "gray"; 331abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 341abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private StatusTextUtils() { } 351abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 361abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 371abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Returns tuner status warning message in HTML. 3865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * 3965fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko * <p>This is only called for debuging and always shown in english.</p> 401abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 411abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static String getStatusWarningInHTML(long packetsPerSec, 421abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int videoFrameDrop, int bytesInQueue, 431abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long audioPositionUs, long audioPositionUsRate, 441abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long audioPtsUs, long audioPtsUsRate, 451abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long videoPtsUs, long videoPtsUsRate) { 461abddd9f6225298066094e20a6c29061b6af4590Nick Chalko StringBuffer buffer = new StringBuffer(); 471abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 481abddd9f6225298066094e20a6c29061b6af4590Nick Chalko // audioPosition should go in rate of 1000ms. 491abddd9f6225298066094e20a6c29061b6af4590Nick Chalko long audioPositionMsRate = audioPositionUsRate / 1000; 501abddd9f6225298066094e20a6c29061b6af4590Nick Chalko String audioPositionColor; 511abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (Math.abs(audioPositionMsRate - 1000) > AUDIO_POSITION_MS_RATE_DIFF_RED) { 521abddd9f6225298066094e20a6c29061b6af4590Nick Chalko audioPositionColor = COLOR_RED; 531abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else if (Math.abs(audioPositionMsRate - 1000) > AUDIO_POSITION_MS_RATE_DIFF_YELLOW) { 541abddd9f6225298066094e20a6c29061b6af4590Nick Chalko audioPositionColor = COLOR_YELLOW; 551abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else { 561abddd9f6225298066094e20a6c29061b6af4590Nick Chalko audioPositionColor = COLOR_GRAY; 571abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 5865fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buffer.append(String.format(Locale.US, "<font color=%s>", audioPositionColor)); 591abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append( 6065fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko String.format(Locale.US, "audioPositionMs: %d (%d)<br>", audioPositionUs / 1000, 611abddd9f6225298066094e20a6c29061b6af4590Nick Chalko audioPositionMsRate)); 621abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("</font>\n"); 631abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("<font color=" + COLOR_GRAY + ">"); 6465fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buffer.append(String.format(Locale.US, "audioPtsMs: %d (%d, %d)<br>", audioPtsUs / 1000, 651abddd9f6225298066094e20a6c29061b6af4590Nick Chalko audioPtsUsRate / 1000, (audioPtsUs - audioPositionUs) / 1000)); 6665fda1eaa94968bb55d5ded10dcb0b3f37fb05f2Nick Chalko buffer.append(String.format(Locale.US, "videoPtsMs: %d (%d, %d)<br>", videoPtsUs / 1000, 671abddd9f6225298066094e20a6c29061b6af4590Nick Chalko videoPtsUsRate / 1000, (videoPtsUs - audioPositionUs) / 1000)); 681abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("</font>\n"); 691abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 701abddd9f6225298066094e20a6c29061b6af4590Nick Chalko appendStatusLine(buffer, "KbytesInQueue", bytesInQueue / 1000, 1, 10); 711abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("<br/>"); 721abddd9f6225298066094e20a6c29061b6af4590Nick Chalko appendErrorStatusLine(buffer, "videoFrameDrop", videoFrameDrop, 0, 2); 731abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("<br/>"); 741abddd9f6225298066094e20a6c29061b6af4590Nick Chalko appendStatusLine(buffer, "packetsPerSec", packetsPerSec, PACKETS_PER_SEC_RED, 751abddd9f6225298066094e20a6c29061b6af4590Nick Chalko PACKETS_PER_SEC_YELLOW); 761abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return buffer.toString(); 771abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 781abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 791abddd9f6225298066094e20a6c29061b6af4590Nick Chalko /** 801abddd9f6225298066094e20a6c29061b6af4590Nick Chalko * Returns audio unavailable warning message in HTML. 811abddd9f6225298066094e20a6c29061b6af4590Nick Chalko */ 821abddd9f6225298066094e20a6c29061b6af4590Nick Chalko public static String getAudioWarningInHTML(String msg) { 831abddd9f6225298066094e20a6c29061b6af4590Nick Chalko return String.format("<font color=%s>%s</font>\n", COLOR_YELLOW, msg); 841abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 851abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 861abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static void appendStatusLine(StringBuffer buffer, String factorName, long value, 871abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int minRed, int minYellow) { 881abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("<font color="); 891abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (value <= minRed) { 901abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_RED); 911abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else if (value <= minYellow) { 921abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_YELLOW); 931abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else { 941abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_GREEN); 951abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 961abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(">"); 971abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(factorName); 981abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(" : "); 991abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(value); 1001abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("</font>"); 1011abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1021abddd9f6225298066094e20a6c29061b6af4590Nick Chalko 1031abddd9f6225298066094e20a6c29061b6af4590Nick Chalko private static void appendErrorStatusLine(StringBuffer buffer, String factorName, int value, 1041abddd9f6225298066094e20a6c29061b6af4590Nick Chalko int minGreen, int minYellow) { 1051abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("<font color="); 1061abddd9f6225298066094e20a6c29061b6af4590Nick Chalko if (value <= minGreen) { 1071abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_GREEN); 1081abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else if (value <= minYellow) { 1091abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_YELLOW); 1101abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } else { 1111abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(COLOR_RED); 1121abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1131abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(">"); 1141abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(factorName); 1151abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(" : "); 1161abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append(value); 1171abddd9f6225298066094e20a6c29061b6af4590Nick Chalko buffer.append("</font>"); 1181abddd9f6225298066094e20a6c29061b6af4590Nick Chalko } 1191abddd9f6225298066094e20a6c29061b6af4590Nick Chalko} 120