Commit 255a34d3 by olly Committed by Oliver Woodman

Noop cleanup of Cea608Decoder.CueBuilder

PiperOrigin-RevId: 228309236
parent 6e127d01
...@@ -421,7 +421,7 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -421,7 +421,7 @@ public final class Cea608Decoder extends CeaDecoder {
} else if (isPreambleAddressCode(cc1, cc2)) { } else if (isPreambleAddressCode(cc1, cc2)) {
handlePreambleAddressCode(cc1, cc2); handlePreambleAddressCode(cc1, cc2);
} else if (isTabCtrlCode(cc1, cc2)) { } else if (isTabCtrlCode(cc1, cc2)) {
currentCueBuilder.setTab(cc2 - 0x20); currentCueBuilder.tabOffset = cc2 - 0x20;
} else if (isMiscCode(cc1, cc2)) { } else if (isMiscCode(cc1, cc2)) {
handleMiscCode(cc2); handleMiscCode(cc2);
} }
...@@ -456,12 +456,12 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -456,12 +456,12 @@ public final class Cea608Decoder extends CeaDecoder {
row++; row++;
} }
if (row != currentCueBuilder.getRow()) { if (row != currentCueBuilder.row) {
if (captionMode != CC_MODE_ROLL_UP && !currentCueBuilder.isEmpty()) { if (captionMode != CC_MODE_ROLL_UP && !currentCueBuilder.isEmpty()) {
currentCueBuilder = new CueBuilder(captionMode, captionRowCount); currentCueBuilder = new CueBuilder(captionMode, captionRowCount);
cueBuilders.add(currentCueBuilder); cueBuilders.add(currentCueBuilder);
} }
currentCueBuilder.setRow(row); currentCueBuilder.row = row;
} }
// cc2 - 0|1|N|0|STYLE|U // cc2 - 0|1|N|0|STYLE|U
...@@ -475,7 +475,7 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -475,7 +475,7 @@ public final class Cea608Decoder extends CeaDecoder {
currentCueBuilder.setStyle(isCursor ? STYLE_UNCHANGED : cursorOrStyle, underline); currentCueBuilder.setStyle(isCursor ? STYLE_UNCHANGED : cursorOrStyle, underline);
if (isCursor) { if (isCursor) {
currentCueBuilder.setIndent(COLUMN_INDICES[cursorOrStyle]); currentCueBuilder.indent = COLUMN_INDICES[cursorOrStyle];
} }
} }
...@@ -672,6 +672,12 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -672,6 +672,12 @@ public final class Cea608Decoder extends CeaDecoder {
tabOffset = 0; tabOffset = 0;
} }
public boolean isEmpty() {
return cueStyles.isEmpty()
&& rolledUpCaptions.isEmpty()
&& captionStringBuilder.length() == 0;
}
public void setCaptionMode(int captionMode) { public void setCaptionMode(int captionMode) {
this.captionMode = captionMode; this.captionMode = captionMode;
} }
...@@ -680,10 +686,8 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -680,10 +686,8 @@ public final class Cea608Decoder extends CeaDecoder {
this.captionRowCount = captionRowCount; this.captionRowCount = captionRowCount;
} }
public boolean isEmpty() { public void setStyle(int style, boolean underline) {
return cueStyles.isEmpty() cueStyles.add(new CueStyle(style, underline, captionStringBuilder.length()));
&& rolledUpCaptions.isEmpty()
&& captionStringBuilder.length() == 0;
} }
public void backspace() { public void backspace() {
...@@ -703,16 +707,12 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -703,16 +707,12 @@ public final class Cea608Decoder extends CeaDecoder {
} }
} }
public int getRow() { public void append(char text) {
return row; captionStringBuilder.append(text);
}
public void setRow(int row) {
this.row = row;
} }
public void rollUp() { public void rollUp() {
rolledUpCaptions.add(buildSpannableString()); rolledUpCaptions.add(buildCurrentLine());
captionStringBuilder.setLength(0); captionStringBuilder.setLength(0);
cueStyles.clear(); cueStyles.clear();
int numRows = Math.min(captionRowCount, row); int numRows = Math.min(captionRowCount, row);
...@@ -721,23 +721,76 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -721,23 +721,76 @@ public final class Cea608Decoder extends CeaDecoder {
} }
} }
public void setIndent(int indent) { public Cue build() {
this.indent = indent; SpannableStringBuilder cueString = new SpannableStringBuilder();
// Add any rolled up captions, separated by new lines.
for (int i = 0; i < rolledUpCaptions.size(); i++) {
cueString.append(rolledUpCaptions.get(i));
cueString.append('\n');
} }
// Add the current line.
cueString.append(buildCurrentLine());
public void setTab(int tabs) { if (cueString.length() == 0) {
tabOffset = tabs; // The cue is empty.
return null;
} }
public void setStyle(int style, boolean underline) { float position;
cueStyles.add(new CueStyle(style, underline, captionStringBuilder.length())); int positionAnchor;
// The number of empty columns before the start of the text, in the range [0-31].
int startPadding = indent + tabOffset;
// The number of empty columns after the end of the text, in the same range.
int endPadding = SCREEN_CHARWIDTH - startPadding - cueString.length();
int startEndPaddingDelta = startPadding - endPadding;
if (captionMode == CC_MODE_POP_ON && (Math.abs(startEndPaddingDelta) < 3 || endPadding < 0)) {
// Treat approximately centered pop-on captions as middle aligned. We also treat captions
// that are wider than they should be in this way. See
// https://github.com/google/ExoPlayer/issues/3534.
position = 0.5f;
positionAnchor = Cue.ANCHOR_TYPE_MIDDLE;
} else if (captionMode == CC_MODE_POP_ON && startEndPaddingDelta > 0) {
// Treat pop-on captions with less padding at the end than the start as end aligned.
position = (float) (SCREEN_CHARWIDTH - endPadding) / SCREEN_CHARWIDTH;
// Adjust the position to fit within the safe area.
position = position * 0.8f + 0.1f;
positionAnchor = Cue.ANCHOR_TYPE_END;
} else {
// For all other cases assume start aligned.
position = (float) startPadding / SCREEN_CHARWIDTH;
// Adjust the position to fit within the safe area.
position = position * 0.8f + 0.1f;
positionAnchor = Cue.ANCHOR_TYPE_START;
} }
public void append(char text) { int lineAnchor;
captionStringBuilder.append(text); int line;
// Note: Row indices are in the range [1-15].
if (captionMode == CC_MODE_ROLL_UP || row > (BASE_ROW / 2)) {
lineAnchor = Cue.ANCHOR_TYPE_END;
line = row - BASE_ROW;
// Two line adjustments. The first is because line indices from the bottom of the window
// start from -1 rather than 0. The second is a blank row to act as the safe area.
line -= 2;
} else {
lineAnchor = Cue.ANCHOR_TYPE_START;
// Line indices from the top of the window start from 0, but we want a blank row to act as
// the safe area. As a result no adjustment is necessary.
line = row;
} }
public SpannableString buildSpannableString() { return new Cue(
cueString,
Alignment.ALIGN_NORMAL,
line,
Cue.LINE_TYPE_NUMBER,
lineAnchor,
position,
positionAnchor,
Cue.DIMEN_UNSET);
}
private SpannableString buildCurrentLine() {
SpannableStringBuilder builder = new SpannableStringBuilder(captionStringBuilder); SpannableStringBuilder builder = new SpannableStringBuilder(captionStringBuilder);
int length = builder.length(); int length = builder.length();
...@@ -803,73 +856,6 @@ public final class Cea608Decoder extends CeaDecoder { ...@@ -803,73 +856,6 @@ public final class Cea608Decoder extends CeaDecoder {
return new SpannableString(builder); return new SpannableString(builder);
} }
public Cue build() {
SpannableStringBuilder cueString = new SpannableStringBuilder();
// Add any rolled up captions, separated by new lines.
for (int i = 0; i < rolledUpCaptions.size(); i++) {
cueString.append(rolledUpCaptions.get(i));
cueString.append('\n');
}
// Add the current line.
cueString.append(buildSpannableString());
if (cueString.length() == 0) {
// The cue is empty.
return null;
}
float position;
int positionAnchor;
// The number of empty columns before the start of the text, in the range [0-31].
int startPadding = indent + tabOffset;
// The number of empty columns after the end of the text, in the same range.
int endPadding = SCREEN_CHARWIDTH - startPadding - cueString.length();
int startEndPaddingDelta = startPadding - endPadding;
if (captionMode == CC_MODE_POP_ON && (Math.abs(startEndPaddingDelta) < 3 || endPadding < 0)) {
// Treat approximately centered pop-on captions as middle aligned. We also treat captions
// that are wider than they should be in this way. See
// https://github.com/google/ExoPlayer/issues/3534.
position = 0.5f;
positionAnchor = Cue.ANCHOR_TYPE_MIDDLE;
} else if (captionMode == CC_MODE_POP_ON && startEndPaddingDelta > 0) {
// Treat pop-on captions with less padding at the end than the start as end aligned.
position = (float) (SCREEN_CHARWIDTH - endPadding) / SCREEN_CHARWIDTH;
// Adjust the position to fit within the safe area.
position = position * 0.8f + 0.1f;
positionAnchor = Cue.ANCHOR_TYPE_END;
} else {
// For all other cases assume start aligned.
position = (float) startPadding / SCREEN_CHARWIDTH;
// Adjust the position to fit within the safe area.
position = position * 0.8f + 0.1f;
positionAnchor = Cue.ANCHOR_TYPE_START;
}
int lineAnchor;
int line;
// Note: Row indices are in the range [1-15].
if (captionMode == CC_MODE_ROLL_UP || row > (BASE_ROW / 2)) {
lineAnchor = Cue.ANCHOR_TYPE_END;
line = row - BASE_ROW;
// Two line adjustments. The first is because line indices from the bottom of the window
// start from -1 rather than 0. The second is a blank row to act as the safe area.
line -= 2;
} else {
lineAnchor = Cue.ANCHOR_TYPE_START;
// Line indices from the top of the window start from 0, but we want a blank row to act as
// the safe area. As a result no adjustment is necessary.
line = row;
}
return new Cue(cueString, Alignment.ALIGN_NORMAL, line, Cue.LINE_TYPE_NUMBER, lineAnchor,
position, positionAnchor, Cue.DIMEN_UNSET);
}
@Override
public String toString() {
return captionStringBuilder.toString();
}
private static void setUnderlineSpan(SpannableStringBuilder builder, int start, int end) { private static void setUnderlineSpan(SpannableStringBuilder builder, int start, int end) {
builder.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE); builder.setSpan(new UnderlineSpan(), start, end, Spanned.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or sign in to comment