diff --git a/library/src/main/java/com/google/android/exoplayer/text/eia608/ClosedCaptionCtrl.java b/library/src/main/java/com/google/android/exoplayer/text/eia608/ClosedCaptionCtrl.java index 0fd1b1fcb6..e1f2bab41e 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/eia608/ClosedCaptionCtrl.java +++ b/library/src/main/java/com/google/android/exoplayer/text/eia608/ClosedCaptionCtrl.java @@ -94,4 +94,8 @@ package com.google.android.exoplayer.text.eia608; return (cc1 >= 0x10 && cc1 <= 0x1F) && (cc2 >= 0x40 && cc2 <= 0x7F); } + public boolean isRepeatable() { + return cc1 >= 0x10 && cc1 <= 0x1F; + } + } diff --git a/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java b/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java index 7b384581d8..d4facb4d91 100644 --- a/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java +++ b/library/src/main/java/com/google/android/exoplayer/text/eia608/Eia608TrackRenderer.java @@ -66,6 +66,7 @@ public final class Eia608TrackRenderer extends SampleSourceTrackRenderer impleme private int captionRowCount; private String caption; private String lastRenderedCaption; + private ClosedCaptionCtrl repeatableControl; /** * @param textRenderer The text renderer. @@ -94,6 +95,7 @@ public final class Eia608TrackRenderer extends SampleSourceTrackRenderer impleme @Override protected void onReset(long positionUs) { inputStreamEnded = false; + repeatableControl = null; pendingCaptionLists.clear(); clearPendingSample(); captionRowCount = DEFAULT_CAPTIONS_ROW_COUNT; @@ -193,10 +195,20 @@ public final class Eia608TrackRenderer extends SampleSourceTrackRenderer impleme return; } + boolean isRepeatableControl = false; for (int i = 0; i < captionBufferSize; i++) { ClosedCaption caption = captionList.captions[i]; if (caption.type == ClosedCaption.TYPE_CTRL) { ClosedCaptionCtrl captionCtrl = (ClosedCaptionCtrl) caption; + isRepeatableControl = captionBufferSize == 1 && captionCtrl.isRepeatable(); + if (isRepeatableControl && repeatableControl != null + && repeatableControl.cc1 == captionCtrl.cc1 + && repeatableControl.cc2 == captionCtrl.cc2) { + repeatableControl = null; + continue; + } else if (isRepeatableControl) { + repeatableControl = captionCtrl; + } if (captionCtrl.isMiscCode()) { handleMiscCode(captionCtrl); } else if (captionCtrl.isPreambleAddressCode()) { @@ -207,6 +219,9 @@ public final class Eia608TrackRenderer extends SampleSourceTrackRenderer impleme } } + if (!isRepeatableControl) { + repeatableControl = null; + } if (captionMode == CC_MODE_ROLL_UP || captionMode == CC_MODE_PAINT_ON) { caption = getDisplayCaption(); }