Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
SDK
/
exoplayer
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
e0c6f538
authored
Jan 08, 2019
by
Oliver Woodman
Browse files
Options
_('Browse Files')
Download
Plain Diff
Merge pull request #5201 from zsmatyas:dev-v2
PiperOrigin-RevId: 228341073
parents
0b56a038
80807534
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
47 additions
and
13 deletions
library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java
library/core/src/main/java/com/google/android/exoplayer2/text/cea/Cea608Decoder.java
View file @
e0c6f538
...
@@ -542,13 +542,34 @@ public final class Cea608Decoder extends CeaDecoder {
...
@@ -542,13 +542,34 @@ public final class Cea608Decoder extends CeaDecoder {
}
}
private
List
<
Cue
>
getDisplayCues
()
{
private
List
<
Cue
>
getDisplayCues
()
{
List
<
Cue
>
displayCues
=
new
ArrayList
<>();
// CEA-608 does not define middle and end alignment, however content providers artificially
for
(
int
i
=
0
;
i
<
cueBuilders
.
size
();
i
++)
{
// introduce them using whitespace. When each cue is built, we try and infer the alignment based
Cue
cue
=
cueBuilders
.
get
(
i
).
build
();
// on the amount of whitespace either side of the text. To avoid consecutive cues being aligned
// differently, we force all cues to have the same alignment, with start alignment given
// preference, then middle alignment, then end alignment.
@Cue
.
AnchorType
int
positionAnchor
=
Cue
.
ANCHOR_TYPE_END
;
int
cueBuilderCount
=
cueBuilders
.
size
();
List
<
Cue
>
cueBuilderCues
=
new
ArrayList
<>(
cueBuilderCount
);
for
(
int
i
=
0
;
i
<
cueBuilderCount
;
i
++)
{
Cue
cue
=
cueBuilders
.
get
(
i
).
build
(
/* forcedPositionAnchor= */
Cue
.
TYPE_UNSET
);
cueBuilderCues
.
add
(
cue
);
if
(
cue
!=
null
)
{
if
(
cue
!=
null
)
{
positionAnchor
=
Math
.
min
(
positionAnchor
,
cue
.
positionAnchor
);
}
}
// Skip null cues and rebuild any that don't have the preferred alignment.
List
<
Cue
>
displayCues
=
new
ArrayList
<>(
cueBuilderCount
);
for
(
int
i
=
0
;
i
<
cueBuilderCount
;
i
++)
{
Cue
cue
=
cueBuilderCues
.
get
(
i
);
if
(
cue
!=
null
)
{
if
(
cue
.
positionAnchor
!=
positionAnchor
)
{
cue
=
cueBuilders
.
get
(
i
).
build
(
positionAnchor
);
}
displayCues
.
add
(
cue
);
displayCues
.
add
(
cue
);
}
}
}
}
return
displayCues
;
return
displayCues
;
}
}
...
@@ -721,7 +742,7 @@ public final class Cea608Decoder extends CeaDecoder {
...
@@ -721,7 +742,7 @@ public final class Cea608Decoder extends CeaDecoder {
}
}
}
}
public
Cue
build
()
{
public
Cue
build
(
@Cue
.
AnchorType
int
forcedPositionAnchor
)
{
SpannableStringBuilder
cueString
=
new
SpannableStringBuilder
();
SpannableStringBuilder
cueString
=
new
SpannableStringBuilder
();
// Add any rolled up captions, separated by new lines.
// Add any rolled up captions, separated by new lines.
for
(
int
i
=
0
;
i
<
rolledUpCaptions
.
size
();
i
++)
{
for
(
int
i
=
0
;
i
<
rolledUpCaptions
.
size
();
i
++)
{
...
@@ -736,33 +757,46 @@ public final class Cea608Decoder extends CeaDecoder {
...
@@ -736,33 +757,46 @@ public final class Cea608Decoder extends CeaDecoder {
return
null
;
return
null
;
}
}
float
position
;
int
positionAnchor
;
int
positionAnchor
;
// The number of empty columns before the start of the text, in the range [0-31].
// The number of empty columns before the start of the text, in the range [0-31].
int
startPadding
=
indent
+
tabOffset
;
int
startPadding
=
indent
+
tabOffset
;
// The number of empty columns after the end of the text, in the same range.
// The number of empty columns after the end of the text, in the same range.
int
endPadding
=
SCREEN_CHARWIDTH
-
startPadding
-
cueString
.
length
();
int
endPadding
=
SCREEN_CHARWIDTH
-
startPadding
-
cueString
.
length
();
int
startEndPaddingDelta
=
startPadding
-
endPadding
;
int
startEndPaddingDelta
=
startPadding
-
endPadding
;
if
(
captionMode
==
CC_MODE_POP_ON
&&
(
Math
.
abs
(
startEndPaddingDelta
)
<
3
||
endPadding
<
0
))
{
if
(
forcedPositionAnchor
!=
Cue
.
TYPE_UNSET
)
{
positionAnchor
=
forcedPositionAnchor
;
}
else
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
// Treat approximately centered pop-on captions as middle aligned. We also treat captions
// that are wider than they should be in this way. See
// that are wider than they should be in this way. See
// https://github.com/google/ExoPlayer/issues/3534.
// https://github.com/google/ExoPlayer/issues/3534.
position
=
0.5f
;
positionAnchor
=
Cue
.
ANCHOR_TYPE_MIDDLE
;
positionAnchor
=
Cue
.
ANCHOR_TYPE_MIDDLE
;
}
else
if
(
captionMode
==
CC_MODE_POP_ON
&&
startEndPaddingDelta
>
0
)
{
}
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.
// 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
;
positionAnchor
=
Cue
.
ANCHOR_TYPE_END
;
}
else
{
}
else
{
// For all other cases assume start aligned.
// 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
;
positionAnchor
=
Cue
.
ANCHOR_TYPE_START
;
}
}
float
position
;
switch
(
positionAnchor
)
{
case
Cue
.
ANCHOR_TYPE_MIDDLE
:
position
=
0.5f
;
break
;
case
Cue
.
ANCHOR_TYPE_END
:
position
=
(
float
)
(
SCREEN_CHARWIDTH
-
endPadding
)
/
SCREEN_CHARWIDTH
;
// Adjust the position to fit within the safe area.
position
=
position
*
0.8f
+
0.1f
;
break
;
case
Cue
.
ANCHOR_TYPE_START
:
default
:
position
=
(
float
)
startPadding
/
SCREEN_CHARWIDTH
;
// Adjust the position to fit within the safe area.
position
=
position
*
0.8f
+
0.1f
;
break
;
}
int
lineAnchor
;
int
lineAnchor
;
int
line
;
int
line
;
// Note: Row indices are in the range [1-15].
// Note: Row indices are in the range [1-15].
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment