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.usbtuner.data; 18 19 import com.android.usbtuner.cc.Cea708Parser; 20 21 import android.graphics.Color; 22 import android.support.annotation.NonNull; 23 24 /** 25 * Collection of CEA-708 structures. 26 */ 27 public class Cea708Data { 28 Cea708Data()29 private Cea708Data() { 30 } 31 32 // According to CEA-708B, the range of valid service number is between 1 and 63. 33 public static final int EMPTY_SERVICE_NUMBER = 0; 34 35 // For the details of the ranges of DTVCC code groups, see CEA-708B Table 6. 36 public static final int CODE_C0_RANGE_START = 0x00; 37 public static final int CODE_C0_RANGE_END = 0x1f; 38 public static final int CODE_C1_RANGE_START = 0x80; 39 public static final int CODE_C1_RANGE_END = 0x9f; 40 public static final int CODE_G0_RANGE_START = 0x20; 41 public static final int CODE_G0_RANGE_END = 0x7f; 42 public static final int CODE_G1_RANGE_START = 0xa0; 43 public static final int CODE_G1_RANGE_END = 0xff; 44 public static final int CODE_C2_RANGE_START = 0x00; 45 public static final int CODE_C2_RANGE_END = 0x1f; 46 public static final int CODE_C3_RANGE_START = 0x80; 47 public static final int CODE_C3_RANGE_END = 0x9f; 48 public static final int CODE_G2_RANGE_START = 0x20; 49 public static final int CODE_G2_RANGE_END = 0x7f; 50 public static final int CODE_G3_RANGE_START = 0xa0; 51 public static final int CODE_G3_RANGE_END = 0xff; 52 53 // The following ranges are defined in CEA-708B Section 7.4.1. 54 public static final int CODE_C0_SKIP2_RANGE_START = 0x18; 55 public static final int CODE_C0_SKIP2_RANGE_END = 0x1f; 56 public static final int CODE_C0_SKIP1_RANGE_START = 0x10; 57 public static final int CODE_C0_SKIP1_RANGE_END = 0x17; 58 59 // The following ranges are defined in CEA-708B Section 7.4.7. 60 public static final int CODE_C2_SKIP0_RANGE_START = 0x00; 61 public static final int CODE_C2_SKIP0_RANGE_END = 0x07; 62 public static final int CODE_C2_SKIP1_RANGE_START = 0x08; 63 public static final int CODE_C2_SKIP1_RANGE_END = 0x0f; 64 public static final int CODE_C2_SKIP2_RANGE_START = 0x10; 65 public static final int CODE_C2_SKIP2_RANGE_END = 0x17; 66 public static final int CODE_C2_SKIP3_RANGE_START = 0x18; 67 public static final int CODE_C2_SKIP3_RANGE_END = 0x1f; 68 69 // The following ranges are defined in CEA-708B Section 7.4.8. 70 public static final int CODE_C3_SKIP4_RANGE_START = 0x80; 71 public static final int CODE_C3_SKIP4_RANGE_END = 0x87; 72 public static final int CODE_C3_SKIP5_RANGE_START = 0x88; 73 public static final int CODE_C3_SKIP5_RANGE_END = 0x8f; 74 75 // The following values are the special characters of CEA-708 spec. 76 public static final int CODE_C0_NUL = 0x00; 77 public static final int CODE_C0_ETX = 0x03; 78 public static final int CODE_C0_BS = 0x08; 79 public static final int CODE_C0_FF = 0x0c; 80 public static final int CODE_C0_CR = 0x0d; 81 public static final int CODE_C0_HCR = 0x0e; 82 public static final int CODE_C0_EXT1 = 0x10; 83 public static final int CODE_C0_P16 = 0x18; 84 public static final int CODE_G0_MUSICNOTE = 0x7f; 85 public static final int CODE_G2_TSP = 0x20; 86 public static final int CODE_G2_NBTSP = 0x21; 87 public static final int CODE_G2_BLK = 0x30; 88 public static final int CODE_G3_CC = 0xa0; 89 90 // The following values are the command bits of CEA-708 spec. 91 public static final int CODE_C1_CW0 = 0x80; 92 public static final int CODE_C1_CW1 = 0x81; 93 public static final int CODE_C1_CW2 = 0x82; 94 public static final int CODE_C1_CW3 = 0x83; 95 public static final int CODE_C1_CW4 = 0x84; 96 public static final int CODE_C1_CW5 = 0x85; 97 public static final int CODE_C1_CW6 = 0x86; 98 public static final int CODE_C1_CW7 = 0x87; 99 public static final int CODE_C1_CLW = 0x88; 100 public static final int CODE_C1_DSW = 0x89; 101 public static final int CODE_C1_HDW = 0x8a; 102 public static final int CODE_C1_TGW = 0x8b; 103 public static final int CODE_C1_DLW = 0x8c; 104 public static final int CODE_C1_DLY = 0x8d; 105 public static final int CODE_C1_DLC = 0x8e; 106 public static final int CODE_C1_RST = 0x8f; 107 public static final int CODE_C1_SPA = 0x90; 108 public static final int CODE_C1_SPC = 0x91; 109 public static final int CODE_C1_SPL = 0x92; 110 public static final int CODE_C1_SWA = 0x97; 111 public static final int CODE_C1_DF0 = 0x98; 112 public static final int CODE_C1_DF1 = 0x99; 113 public static final int CODE_C1_DF2 = 0x9a; 114 public static final int CODE_C1_DF3 = 0x9b; 115 public static final int CODE_C1_DF4 = 0x9c; 116 public static final int CODE_C1_DF5 = 0x9d; 117 public static final int CODE_C1_DF6 = 0x9e; 118 public static final int CODE_C1_DF7 = 0x9f; 119 120 public static class CcPacket implements Comparable<CcPacket> { 121 public final byte[] bytes; 122 public final int ccCount; 123 public final long pts; 124 CcPacket(byte[] bytes, int ccCount, long pts)125 public CcPacket(byte[] bytes, int ccCount, long pts) { 126 this.bytes = bytes; 127 this.ccCount = ccCount; 128 this.pts = pts; 129 } 130 131 @Override compareTo(@onNull CcPacket another)132 public int compareTo(@NonNull CcPacket another) { 133 return Long.compare(pts, another.pts); 134 } 135 } 136 137 /** 138 * CEA-708B-specific color. 139 */ 140 public static class CaptionColor { 141 public static final int OPACITY_SOLID = 0; 142 public static final int OPACITY_FLASH = 1; 143 public static final int OPACITY_TRANSLUCENT = 2; 144 public static final int OPACITY_TRANSPARENT = 3; 145 146 private static final int[] COLOR_MAP = new int[] { 0x00, 0x0f, 0xf0, 0xff }; 147 private static final int[] OPACITY_MAP = new int[] { 0xff, 0xfe, 0x80, 0x00 }; 148 149 public final int opacity; 150 public final int red; 151 public final int green; 152 public final int blue; 153 CaptionColor(int opacity, int red, int green, int blue)154 public CaptionColor(int opacity, int red, int green, int blue) { 155 this.opacity = opacity; 156 this.red = red; 157 this.green = green; 158 this.blue = blue; 159 } 160 getArgbValue()161 public int getArgbValue() { 162 return Color.argb( 163 OPACITY_MAP[opacity], COLOR_MAP[red], COLOR_MAP[green], COLOR_MAP[blue]); 164 } 165 } 166 167 /** 168 * Caption event generated by {@link Cea708Parser}. 169 */ 170 public static class CaptionEvent { 171 @Cea708Parser.CaptionEmitType public final int type; 172 public final Object obj; 173 CaptionEvent(int type, Object obj)174 public CaptionEvent(int type, Object obj) { 175 this.type = type; 176 this.obj = obj; 177 } 178 } 179 180 /** 181 * Pen style information. 182 */ 183 public static class CaptionPenAttr { 184 // Pen sizes 185 public static final int PEN_SIZE_SMALL = 0; 186 public static final int PEN_SIZE_STANDARD = 1; 187 public static final int PEN_SIZE_LARGE = 2; 188 189 // Offsets 190 public static final int OFFSET_SUBSCRIPT = 0; 191 public static final int OFFSET_NORMAL = 1; 192 public static final int OFFSET_SUPERSCRIPT = 2; 193 194 public final int penSize; 195 public final int penOffset; 196 public final int textTag; 197 public final int fontTag; 198 public final int edgeType; 199 public final boolean underline; 200 public final boolean italic; 201 CaptionPenAttr(int penSize, int penOffset, int textTag, int fontTag, int edgeType, boolean underline, boolean italic)202 public CaptionPenAttr(int penSize, int penOffset, int textTag, int fontTag, int edgeType, 203 boolean underline, boolean italic) { 204 this.penSize = penSize; 205 this.penOffset = penOffset; 206 this.textTag = textTag; 207 this.fontTag = fontTag; 208 this.edgeType = edgeType; 209 this.underline = underline; 210 this.italic = italic; 211 } 212 } 213 214 /** 215 * {@link CaptionColor} objects that indicate the foreground, background, and edge color of a 216 * pen. 217 */ 218 public static class CaptionPenColor { 219 public final CaptionColor foregroundColor; 220 public final CaptionColor backgroundColor; 221 public final CaptionColor edgeColor; 222 CaptionPenColor(CaptionColor foregroundColor, CaptionColor backgroundColor, CaptionColor edgeColor)223 public CaptionPenColor(CaptionColor foregroundColor, CaptionColor backgroundColor, 224 CaptionColor edgeColor) { 225 this.foregroundColor = foregroundColor; 226 this.backgroundColor = backgroundColor; 227 this.edgeColor = edgeColor; 228 } 229 } 230 231 /** 232 * Location information of a pen. 233 */ 234 public static class CaptionPenLocation { 235 public final int row; 236 public final int column; 237 CaptionPenLocation(int row, int column)238 public CaptionPenLocation(int row, int column) { 239 this.row = row; 240 this.column = column; 241 } 242 } 243 244 /** 245 * Attributes of a caption window, which is defined in CEA-708B. 246 */ 247 public static class CaptionWindowAttr { 248 public final CaptionColor fillColor; 249 public final CaptionColor borderColor; 250 public final int borderType; 251 public final boolean wordWrap; 252 public final int printDirection; 253 public final int scrollDirection; 254 public final int justify; 255 public final int effectDirection; 256 public final int effectSpeed; 257 public final int displayEffect; 258 CaptionWindowAttr(CaptionColor fillColor, CaptionColor borderColor, int borderType, boolean wordWrap, int printDirection, int scrollDirection, int justify, int effectDirection, int effectSpeed, int displayEffect)259 public CaptionWindowAttr(CaptionColor fillColor, CaptionColor borderColor, int borderType, 260 boolean wordWrap, int printDirection, int scrollDirection, int justify, 261 int effectDirection, 262 int effectSpeed, int displayEffect) { 263 this.fillColor = fillColor; 264 this.borderColor = borderColor; 265 this.borderType = borderType; 266 this.wordWrap = wordWrap; 267 this.printDirection = printDirection; 268 this.scrollDirection = scrollDirection; 269 this.justify = justify; 270 this.effectDirection = effectDirection; 271 this.effectSpeed = effectSpeed; 272 this.displayEffect = displayEffect; 273 } 274 } 275 276 /** 277 * Construction information of the caption window of CEA-708B. 278 */ 279 public static class CaptionWindow { 280 public final int id; 281 public final boolean visible; 282 public final boolean rowLock; 283 public final boolean columnLock; 284 public final int priority; 285 public final boolean relativePositioning; 286 public final int anchorVertical; 287 public final int anchorHorizontal; 288 public final int anchorId; 289 public final int rowCount; 290 public final int columnCount; 291 public final int penStyle; 292 public final int windowStyle; 293 CaptionWindow(int id, boolean visible, boolean rowLock, boolean columnLock, int priority, boolean relativePositioning, int anchorVertical, int anchorHorizontal, int anchorId, int rowCount, int columnCount, int penStyle, int windowStyle)294 public CaptionWindow(int id, boolean visible, 295 boolean rowLock, boolean columnLock, int priority, boolean relativePositioning, 296 int anchorVertical, int anchorHorizontal, int anchorId, 297 int rowCount, int columnCount, int penStyle, int windowStyle) { 298 this.id = id; 299 this.visible = visible; 300 this.rowLock = rowLock; 301 this.columnLock = columnLock; 302 this.priority = priority; 303 this.relativePositioning = relativePositioning; 304 this.anchorVertical = anchorVertical; 305 this.anchorHorizontal = anchorHorizontal; 306 this.anchorId = anchorId; 307 this.rowCount = rowCount; 308 this.columnCount = columnCount; 309 this.penStyle = penStyle; 310 this.windowStyle = windowStyle; 311 } 312 } 313 } 314