Skip to content

Commit

Permalink
Add support for multiple subtitle tracks per PID and for naming heari…
Browse files Browse the repository at this point in the history
…ng impaired subtitles
  • Loading branch information
tresvecesseis committed Apr 4, 2017
1 parent d34d3f7 commit 38779de
Showing 1 changed file with 55 additions and 13 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
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;

Expand All @@ -33,20 +34,40 @@
*/
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;
}
}


Expand All @@ -57,10 +78,18 @@ public void seek() {

@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);
}
}


Expand All @@ -76,15 +105,28 @@ public void packetStarted(long pesTimeUs, boolean dataAlignmentIndicator) {

@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;
}

@Override
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;
}
}
Expand Down

0 comments on commit 38779de

Please sign in to comment.