mirror of
https://github.com/androidx/media.git
synced 2025-05-09 00:20:45 +08:00
Add support for multiple subtitle tracks per PID and for naming hearing impaired subtitles
This commit is contained in:
parent
d34d3f76be
commit
38779de225
@ -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.MimeTypes;
|
||||||
import com.google.android.exoplayer2.util.ParsableByteArray;
|
import com.google.android.exoplayer2.util.ParsableByteArray;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@ -33,20 +34,40 @@ import java.util.List;
|
|||||||
*/
|
*/
|
||||||
public final class DvbSubtitlesReader implements ElementaryStreamReader {
|
public final class DvbSubtitlesReader implements ElementaryStreamReader {
|
||||||
|
|
||||||
private final String language;
|
private class SubtitleTrack {
|
||||||
private List<byte[]> initializationData;
|
private String language;
|
||||||
|
private List<byte[]> initializationData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<SubtitleTrack> subtitles = new ArrayList<>();
|
||||||
|
|
||||||
private long sampleTimeUs;
|
private long sampleTimeUs;
|
||||||
private int sampleBytesWritten;
|
private int sampleBytesWritten;
|
||||||
private boolean writingSample;
|
private boolean writingSample;
|
||||||
|
|
||||||
private TrackOutput output;
|
private List<TrackOutput> outputTracks = new ArrayList<>();
|
||||||
|
|
||||||
public DvbSubtitlesReader(TsPayloadReader.EsInfo esInfo) {
|
public DvbSubtitlesReader(TsPayloadReader.EsInfo esInfo) {
|
||||||
this.language = esInfo.language;
|
int pos = 2;
|
||||||
initializationData = Collections.singletonList(new byte[] {(byte) 0x00,
|
|
||||||
esInfo.descriptorBytes[6], esInfo.descriptorBytes[7],
|
while (pos < esInfo.descriptorBytes.length) {
|
||||||
esInfo.descriptorBytes[8], esInfo.descriptorBytes[9]});
|
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
|
@Override
|
||||||
public void createTracks(ExtractorOutput extractorOutput, TrackIdGenerator idGenerator) {
|
public void createTracks(ExtractorOutput extractorOutput, TrackIdGenerator idGenerator) {
|
||||||
idGenerator.generateNewId();
|
TrackOutput output;
|
||||||
this.output = extractorOutput.track(idGenerator.getTrackId(), C.TRACK_TYPE_TEXT);
|
SubtitleTrack subtitle;
|
||||||
output.format(Format.createImageSampleFormat(idGenerator.getFormatId(),
|
|
||||||
MimeTypes.APPLICATION_DVBSUBS, null, Format.NO_VALUE, initializationData, language, null));
|
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
|
@Override
|
||||||
public void packetFinished() {
|
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;
|
writingSample = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,7 +118,15 @@ public final class DvbSubtitlesReader implements ElementaryStreamReader {
|
|||||||
public void consume(ParsableByteArray data) {
|
public void consume(ParsableByteArray data) {
|
||||||
if (writingSample) {
|
if (writingSample) {
|
||||||
int bytesAvailable = data.bytesLeft();
|
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;
|
sampleBytesWritten += bytesAvailable;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user