diff --git a/RELEASENOTES.md b/RELEASENOTES.md index 3f451c8405..bc6dd6a75f 100644 --- a/RELEASENOTES.md +++ b/RELEASENOTES.md @@ -122,8 +122,8 @@ * Ignore excess characters in CEA-608 lines (max length is 32) ([#7341](https://github.com/google/ExoPlayer/issues/7341)). * Add support for WebVTT's `ruby-position` CSS property. - * Don't assume CEA-608 captions are in the bottom half of the - screen([#7475](https://github.com/google/ExoPlayer/issues/7475)). + * Fix positioning for CEA-608 roll-up captions in the top half of screen + ([#7475](https://github.com/google/ExoPlayer/issues/7475)). * DRM: * Add support for attaching DRM sessions to clear content in the demo app. * Remove `DrmSessionManager` references from all renderers. diff --git a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java index 1dfbff2598..1990cde9c2 100644 --- a/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java +++ b/library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java @@ -946,7 +946,7 @@ public final class Cea608Decoder extends CeaDecoder { int lineAnchor; int line; - // Note: Row indices are in the range [1-15]. + // Note: Row indices are in the range [1-15], Cue.line counts from 0 (top) and -1 (bottom). if (row > (BASE_ROW / 2)) { lineAnchor = Cue.ANCHOR_TYPE_END; line = row - BASE_ROW; @@ -955,9 +955,12 @@ public final class Cea608Decoder extends CeaDecoder { 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; + // The `row` of roll-up cues positions the bottom line (even for cues shown in the top + // half of the screen), so we need to consider the number of rows in this cue. In + // non-roll-up, we don't need any further adjustments because we leave the first line + // (cue.line=0) blank to act as the safe area, so positioning row=1 at Cue.line=1 is + // correct. + line = captionMode == CC_MODE_ROLL_UP ? row - (captionRowCount - 1) : row; } return new Cue(