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
38779de2
authored
Apr 04, 2017
by
Sergio Moreno Mozota
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
Add support for multiple subtitle tracks per PID and for naming hearing impaired subtitles
parent
d34d3f76
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
55 additions
and
13 deletions
library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitlesReader.java
library/core/src/main/java/com/google/android/exoplayer2/extractor/ts/DvbSubtitlesReader.java
View file @
38779de2
...
...
@@ -24,6 +24,7 @@ import com.google.android.exoplayer2.extractor.ts.TsPayloadReader.TrackIdGenerat
import
com.google.android.exoplayer2.util.MimeTypes
;
import
com.google.android.exoplayer2.util.ParsableByteArray
;
import
java.util.ArrayList
;
import
java.util.Collections
;
import
java.util.List
;
...
...
@@ -33,20 +34,40 @@ import java.util.List;
*/
public
final
class
DvbSubtitlesReader
implements
ElementaryStreamReader
{
private
final
String
language
;
private
List
<
byte
[]>
initializationData
;
private
class
SubtitleTrack
{
private
String
language
;
private
List
<
byte
[]>
initializationData
;
}
private
List
<
SubtitleTrack
>
subtitles
=
new
ArrayList
<>();
private
long
sampleTimeUs
;
private
int
sampleBytesWritten
;
private
boolean
writingSample
;
private
TrackOutput
output
;
private
List
<
TrackOutput
>
outputTracks
=
new
ArrayList
<>()
;
public
DvbSubtitlesReader
(
TsPayloadReader
.
EsInfo
esInfo
)
{
this
.
language
=
esInfo
.
language
;
initializationData
=
Collections
.
singletonList
(
new
byte
[]
{(
byte
)
0x00
,
esInfo
.
descriptorBytes
[
6
],
esInfo
.
descriptorBytes
[
7
],
esInfo
.
descriptorBytes
[
8
],
esInfo
.
descriptorBytes
[
9
]});
int
pos
=
2
;
while
(
pos
<
esInfo
.
descriptorBytes
.
length
)
{
SubtitleTrack
subtitle
=
new
SubtitleTrack
();
subtitle
.
language
=
new
String
(
new
byte
[]
{
esInfo
.
descriptorBytes
[
pos
],
esInfo
.
descriptorBytes
[
pos
+
1
],
esInfo
.
descriptorBytes
[
pos
+
2
]});
if
(((
esInfo
.
descriptorBytes
[
pos
+
3
]
&
0xF0
)
>>
4
)
==
2
)
{
subtitle
.
language
+=
" for hard of hearing"
;
}
subtitle
.
initializationData
=
Collections
.
singletonList
(
new
byte
[]
{(
byte
)
0x00
,
esInfo
.
descriptorBytes
[
pos
+
4
],
esInfo
.
descriptorBytes
[
pos
+
5
],
esInfo
.
descriptorBytes
[
pos
+
6
],
esInfo
.
descriptorBytes
[
pos
+
7
]});
subtitles
.
add
(
subtitle
);
pos
+=
8
;
}
}
...
...
@@ -57,10 +78,18 @@ public final class DvbSubtitlesReader implements ElementaryStreamReader {
@Override
public
void
createTracks
(
ExtractorOutput
extractorOutput
,
TrackIdGenerator
idGenerator
)
{
idGenerator
.
generateNewId
();
this
.
output
=
extractorOutput
.
track
(
idGenerator
.
getTrackId
(),
C
.
TRACK_TYPE_TEXT
);
output
.
format
(
Format
.
createImageSampleFormat
(
idGenerator
.
getFormatId
(),
MimeTypes
.
APPLICATION_DVBSUBS
,
null
,
Format
.
NO_VALUE
,
initializationData
,
language
,
null
));
TrackOutput
output
;
SubtitleTrack
subtitle
;
for
(
int
i
=
0
;
i
<
subtitles
.
size
();
i
++)
{
subtitle
=
subtitles
.
get
(
i
);
idGenerator
.
generateNewId
();
output
=
extractorOutput
.
track
(
idGenerator
.
getTrackId
(),
C
.
TRACK_TYPE_TEXT
);
output
.
format
(
Format
.
createImageSampleFormat
(
idGenerator
.
getFormatId
(),
MimeTypes
.
APPLICATION_DVBSUBS
,
null
,
Format
.
NO_VALUE
,
subtitle
.
initializationData
,
subtitle
.
language
,
null
));
outputTracks
.
add
(
output
);
}
}
...
...
@@ -76,7 +105,12 @@ public final class DvbSubtitlesReader implements ElementaryStreamReader {
@Override
public
void
packetFinished
()
{
output
.
sampleMetadata
(
sampleTimeUs
,
C
.
BUFFER_FLAG_KEY_FRAME
,
sampleBytesWritten
,
0
,
null
);
TrackOutput
output
;
for
(
int
i
=
0
;
i
<
outputTracks
.
size
();
i
++)
{
output
=
outputTracks
.
get
(
i
);
output
.
sampleMetadata
(
sampleTimeUs
,
C
.
BUFFER_FLAG_KEY_FRAME
,
sampleBytesWritten
,
0
,
null
);
}
writingSample
=
false
;
}
...
...
@@ -84,7 +118,15 @@ public final class DvbSubtitlesReader implements ElementaryStreamReader {
public
void
consume
(
ParsableByteArray
data
)
{
if
(
writingSample
)
{
int
bytesAvailable
=
data
.
bytesLeft
();
output
.
sampleData
(
data
,
bytesAvailable
);
TrackOutput
output
;
int
dataPosition
=
data
.
getPosition
();
for
(
int
i
=
0
;
i
<
outputTracks
.
size
();
i
++)
{
data
.
setPosition
(
dataPosition
);
output
=
outputTracks
.
get
(
i
);
output
.
sampleData
(
data
,
bytesAvailable
);
}
sampleBytesWritten
+=
bytesAvailable
;
}
}
...
...
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