blob: bd1fc9b91ffce3735e884c8b991ee1f3e3ea39fe [file] [log] [blame]
/*
* Copyright (C) 2015 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.android.tv.tuner.data;
import android.graphics.Color;
import android.support.annotation.NonNull;
/** Collection of CEA-708 structures. */
public class Cea708Data {
private Cea708Data() {}
// According to CEA-708B, the range of valid service number is between 1 and 63.
public static final int EMPTY_SERVICE_NUMBER = 0;
// For the details of the ranges of DTVCC code groups, see CEA-708B Table 6.
public static final int CODE_C0_RANGE_START = 0x00;
public static final int CODE_C0_RANGE_END = 0x1f;
public static final int CODE_C1_RANGE_START = 0x80;
public static final int CODE_C1_RANGE_END = 0x9f;
public static final int CODE_G0_RANGE_START = 0x20;
public static final int CODE_G0_RANGE_END = 0x7f;
public static final int CODE_G1_RANGE_START = 0xa0;
public static final int CODE_G1_RANGE_END = 0xff;
public static final int CODE_C2_RANGE_START = 0x00;
public static final int CODE_C2_RANGE_END = 0x1f;
public static final int CODE_C3_RANGE_START = 0x80;
public static final int CODE_C3_RANGE_END = 0x9f;
public static final int CODE_G2_RANGE_START = 0x20;
public static final int CODE_G2_RANGE_END = 0x7f;
public static final int CODE_G3_RANGE_START = 0xa0;
public static final int CODE_G3_RANGE_END = 0xff;
// The following ranges are defined in CEA-708B Section 7.4.1.
public static final int CODE_C0_SKIP2_RANGE_START = 0x18;
public static final int CODE_C0_SKIP2_RANGE_END = 0x1f;
public static final int CODE_C0_SKIP1_RANGE_START = 0x10;
public static final int CODE_C0_SKIP1_RANGE_END = 0x17;
// The following ranges are defined in CEA-708B Section 7.4.7.
public static final int CODE_C2_SKIP0_RANGE_START = 0x00;
public static final int CODE_C2_SKIP0_RANGE_END = 0x07;
public static final int CODE_C2_SKIP1_RANGE_START = 0x08;
public static final int CODE_C2_SKIP1_RANGE_END = 0x0f;
public static final int CODE_C2_SKIP2_RANGE_START = 0x10;
public static final int CODE_C2_SKIP2_RANGE_END = 0x17;
public static final int CODE_C2_SKIP3_RANGE_START = 0x18;
public static final int CODE_C2_SKIP3_RANGE_END = 0x1f;
// The following ranges are defined in CEA-708B Section 7.4.8.
public static final int CODE_C3_SKIP4_RANGE_START = 0x80;
public static final int CODE_C3_SKIP4_RANGE_END = 0x87;
public static final int CODE_C3_SKIP5_RANGE_START = 0x88;
public static final int CODE_C3_SKIP5_RANGE_END = 0x8f;
// The following values are the special characters of CEA-708 spec.
public static final int CODE_C0_NUL = 0x00;
public static final int CODE_C0_ETX = 0x03;
public static final int CODE_C0_BS = 0x08;
public static final int CODE_C0_FF = 0x0c;
public static final int CODE_C0_CR = 0x0d;
public static final int CODE_C0_HCR = 0x0e;
public static final int CODE_C0_EXT1 = 0x10;
public static final int CODE_C0_P16 = 0x18;
public static final int CODE_G0_MUSICNOTE = 0x7f;
public static final int CODE_G2_TSP = 0x20;
public static final int CODE_G2_NBTSP = 0x21;
public static final int CODE_G2_BLK = 0x30;
public static final int CODE_G3_CC = 0xa0;
// The following values are the command bits of CEA-708 spec.
public static final int CODE_C1_CW0 = 0x80;
public static final int CODE_C1_CW1 = 0x81;
public static final int CODE_C1_CW2 = 0x82;
public static final int CODE_C1_CW3 = 0x83;
public static final int CODE_C1_CW4 = 0x84;
public static final int CODE_C1_CW5 = 0x85;
public static final int CODE_C1_CW6 = 0x86;
public static final int CODE_C1_CW7 = 0x87;
public static final int CODE_C1_CLW = 0x88;
public static final int CODE_C1_DSW = 0x89;
public static final int CODE_C1_HDW = 0x8a;
public static final int CODE_C1_TGW = 0x8b;
public static final int CODE_C1_DLW = 0x8c;
public static final int CODE_C1_DLY = 0x8d;
public static final int CODE_C1_DLC = 0x8e;
public static final int CODE_C1_RST = 0x8f;
public static final int CODE_C1_SPA = 0x90;
public static final int CODE_C1_SPC = 0x91;
public static final int CODE_C1_SPL = 0x92;
public static final int CODE_C1_SWA = 0x97;
public static final int CODE_C1_DF0 = 0x98;
public static final int CODE_C1_DF1 = 0x99;
public static final int CODE_C1_DF2 = 0x9a;
public static final int CODE_C1_DF3 = 0x9b;
public static final int CODE_C1_DF4 = 0x9c;
public static final int CODE_C1_DF5 = 0x9d;
public static final int CODE_C1_DF6 = 0x9e;
public static final int CODE_C1_DF7 = 0x9f;
public static class CcPacket implements Comparable<CcPacket> {
public final byte[] bytes;
public final int ccCount;
public final long pts;
public CcPacket(byte[] bytes, int ccCount, long pts) {
this.bytes = bytes;
this.ccCount = ccCount;
this.pts = pts;
}
@Override
public int compareTo(@NonNull CcPacket another) {
return Long.compare(pts, another.pts);
}
}
/** CEA-708B-specific color. */
public static class CaptionColor {
public static final int OPACITY_SOLID = 0;
public static final int OPACITY_FLASH = 1;
public static final int OPACITY_TRANSLUCENT = 2;
public static final int OPACITY_TRANSPARENT = 3;
private static final int[] COLOR_MAP = new int[] {0x00, 0x0f, 0xf0, 0xff};
private static final int[] OPACITY_MAP = new int[] {0xff, 0xfe, 0x80, 0x00};
public final int opacity;
public final int red;
public final int green;
public final int blue;
public CaptionColor(int opacity, int red, int green, int blue) {
this.opacity = opacity;
this.red = red;
this.green = green;
this.blue = blue;
}
public int getArgbValue() {
return Color.argb(
OPACITY_MAP[opacity], COLOR_MAP[red], COLOR_MAP[green], COLOR_MAP[blue]);
}
}
/** Caption event generated by {@link Cea708Parser}. */
public static class CaptionEvent {
@Cea708Parser.CaptionEmitType public final int type;
public final Object obj;
public CaptionEvent(int type, Object obj) {
this.type = type;
this.obj = obj;
}
}
/** Pen style information. */
public static class CaptionPenAttr {
// Pen sizes
public static final int PEN_SIZE_SMALL = 0;
public static final int PEN_SIZE_STANDARD = 1;
public static final int PEN_SIZE_LARGE = 2;
// Offsets
public static final int OFFSET_SUBSCRIPT = 0;
public static final int OFFSET_NORMAL = 1;
public static final int OFFSET_SUPERSCRIPT = 2;
public final int penSize;
public final int penOffset;
public final int textTag;
public final int fontTag;
public final int edgeType;
public final boolean underline;
public final boolean italic;
public CaptionPenAttr(
int penSize,
int penOffset,
int textTag,
int fontTag,
int edgeType,
boolean underline,
boolean italic) {
this.penSize = penSize;
this.penOffset = penOffset;
this.textTag = textTag;
this.fontTag = fontTag;
this.edgeType = edgeType;
this.underline = underline;
this.italic = italic;
}
}
/**
* {@link CaptionColor} objects that indicate the foreground, background, and edge color of a
* pen.
*/
public static class CaptionPenColor {
public final CaptionColor foregroundColor;
public final CaptionColor backgroundColor;
public final CaptionColor edgeColor;
public CaptionPenColor(
CaptionColor foregroundColor,
CaptionColor backgroundColor,
CaptionColor edgeColor) {
this.foregroundColor = foregroundColor;
this.backgroundColor = backgroundColor;
this.edgeColor = edgeColor;
}
}
/** Location information of a pen. */
public static class CaptionPenLocation {
public final int row;
public final int column;
public CaptionPenLocation(int row, int column) {
this.row = row;
this.column = column;
}
}
/** Attributes of a caption window, which is defined in CEA-708B. */
public static class CaptionWindowAttr {
public static final int JUSTIFY_LEFT = 0;
public static final int JUSTIFY_CENTER = 2;
public static final int PRINT_LEFT_TO_RIGHT = 0;
public static final int PRINT_RIGHT_TO_LEFT = 1;
public static final int PRINT_TOP_TO_BOTTOM = 2;
public static final int PRINT_BOTTOM_TO_TOP = 3;
public final CaptionColor fillColor;
public final CaptionColor borderColor;
public final int borderType;
public final boolean wordWrap;
public final int printDirection;
public final int scrollDirection;
public final int justify;
public final int effectDirection;
public final int effectSpeed;
public final int displayEffect;
public CaptionWindowAttr(
CaptionColor fillColor,
CaptionColor borderColor,
int borderType,
boolean wordWrap,
int printDirection,
int scrollDirection,
int justify,
int effectDirection,
int effectSpeed,
int displayEffect) {
this.fillColor = fillColor;
this.borderColor = borderColor;
this.borderType = borderType;
this.wordWrap = wordWrap;
this.printDirection = printDirection;
this.scrollDirection = scrollDirection;
this.justify = justify;
this.effectDirection = effectDirection;
this.effectSpeed = effectSpeed;
this.displayEffect = displayEffect;
}
}
/** Construction information of the caption window of CEA-708B. */
public static class CaptionWindow {
public final int id;
public final boolean visible;
public final boolean rowLock;
public final boolean columnLock;
public final int priority;
public final boolean relativePositioning;
public final int anchorVertical;
public final int anchorHorizontal;
public final int anchorId;
public final int rowCount;
public final int columnCount;
public final int penStyle;
public final int windowStyle;
public 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) {
this.id = id;
this.visible = visible;
this.rowLock = rowLock;
this.columnLock = columnLock;
this.priority = priority;
this.relativePositioning = relativePositioning;
this.anchorVertical = anchorVertical;
this.anchorHorizontal = anchorHorizontal;
this.anchorId = anchorId;
this.rowCount = rowCount;
this.columnCount = columnCount;
this.penStyle = penStyle;
this.windowStyle = windowStyle;
}
}
}