Search in sources :

Example 6 with TrackOutput

use of com.google.android.exoplayer2.extractor.TrackOutput in project ExoPlayer by google.

the class HlsSampleStreamWrapper method track.

// ExtractorOutput implementation. Called by the loading thread.
@Override
public DefaultTrackOutput track(int id, int type) {
    if (sampleQueues.indexOfKey(id) >= 0) {
        return sampleQueues.get(id);
    }
    DefaultTrackOutput trackOutput = new DefaultTrackOutput(allocator);
    trackOutput.setUpstreamFormatChangeListener(this);
    trackOutput.sourceId(upstreamChunkUid);
    sampleQueues.put(id, trackOutput);
    return trackOutput;
}
Also used : DefaultTrackOutput(com.google.android.exoplayer2.extractor.DefaultTrackOutput)

Example 7 with TrackOutput

use of com.google.android.exoplayer2.extractor.TrackOutput in project ExoPlayer by google.

the class WebvttExtractor method processSample.

private void processSample() throws ParserException {
    ParsableByteArray webvttData = new ParsableByteArray(sampleData);
    // Validate the first line of the header.
    try {
        WebvttParserUtil.validateWebvttHeaderLine(webvttData);
    } catch (SubtitleDecoderException e) {
        throw new ParserException(e);
    }
    // Defaults to use if the header doesn't contain an X-TIMESTAMP-MAP header.
    long vttTimestampUs = 0;
    long tsTimestampUs = 0;
    // Parse the remainder of the header looking for X-TIMESTAMP-MAP.
    String line;
    while (!TextUtils.isEmpty(line = webvttData.readLine())) {
        if (line.startsWith("X-TIMESTAMP-MAP")) {
            Matcher localTimestampMatcher = LOCAL_TIMESTAMP.matcher(line);
            if (!localTimestampMatcher.find()) {
                throw new ParserException("X-TIMESTAMP-MAP doesn't contain local timestamp: " + line);
            }
            Matcher mediaTimestampMatcher = MEDIA_TIMESTAMP.matcher(line);
            if (!mediaTimestampMatcher.find()) {
                throw new ParserException("X-TIMESTAMP-MAP doesn't contain media timestamp: " + line);
            }
            vttTimestampUs = WebvttParserUtil.parseTimestampUs(localTimestampMatcher.group(1));
            tsTimestampUs = TimestampAdjuster.ptsToUs(Long.parseLong(mediaTimestampMatcher.group(1)));
        }
    }
    // Find the first cue header and parse the start time.
    Matcher cueHeaderMatcher = WebvttParserUtil.findNextCueHeader(webvttData);
    if (cueHeaderMatcher == null) {
        // No cues found. Don't output a sample, but still output a corresponding track.
        buildTrackOutput(0);
        return;
    }
    long firstCueTimeUs = WebvttParserUtil.parseTimestampUs(cueHeaderMatcher.group(1));
    long sampleTimeUs = timestampAdjuster.adjustSampleTimestamp(firstCueTimeUs + tsTimestampUs - vttTimestampUs);
    long subsampleOffsetUs = sampleTimeUs - firstCueTimeUs;
    // Output the track.
    TrackOutput trackOutput = buildTrackOutput(subsampleOffsetUs);
    // Output the sample.
    sampleDataWrapper.reset(sampleData, sampleSize);
    trackOutput.sampleData(sampleDataWrapper, sampleSize);
    trackOutput.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null);
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) ParserException(com.google.android.exoplayer2.ParserException) Matcher(java.util.regex.Matcher) TrackOutput(com.google.android.exoplayer2.extractor.TrackOutput) SubtitleDecoderException(com.google.android.exoplayer2.text.SubtitleDecoderException)

Example 8 with TrackOutput

use of com.google.android.exoplayer2.extractor.TrackOutput in project ExoPlayer by google.

the class ExtractorMediaPeriod method track.

// ExtractorOutput implementation. Called by the loading thread.
@Override
public TrackOutput track(int id, int type) {
    DefaultTrackOutput trackOutput = sampleQueues.get(id);
    if (trackOutput == null) {
        trackOutput = new DefaultTrackOutput(allocator);
        trackOutput.setUpstreamFormatChangeListener(this);
        sampleQueues.put(id, trackOutput);
    }
    return trackOutput;
}
Also used : DefaultTrackOutput(com.google.android.exoplayer2.extractor.DefaultTrackOutput)

Example 9 with TrackOutput

use of com.google.android.exoplayer2.extractor.TrackOutput in project ExoPlayer by google.

the class FragmentedMp4Extractor method maybeInitExtraTracks.

private void maybeInitExtraTracks() {
    if ((flags & FLAG_ENABLE_EMSG_TRACK) != 0 && eventMessageTrackOutput == null) {
        eventMessageTrackOutput = extractorOutput.track(trackBundles.size(), C.TRACK_TYPE_METADATA);
        eventMessageTrackOutput.format(Format.createSampleFormat(null, MimeTypes.APPLICATION_EMSG, Format.OFFSET_SAMPLE_RELATIVE));
    }
    if ((flags & FLAG_ENABLE_CEA608_TRACK) != 0 && cea608TrackOutputs == null) {
        TrackOutput cea608TrackOutput = extractorOutput.track(trackBundles.size() + 1, C.TRACK_TYPE_TEXT);
        cea608TrackOutput.format(Format.createTextSampleFormat(null, MimeTypes.APPLICATION_CEA608, null, Format.NO_VALUE, 0, null, null));
        cea608TrackOutputs = new TrackOutput[] { cea608TrackOutput };
    }
}
Also used : TrackOutput(com.google.android.exoplayer2.extractor.TrackOutput)

Example 10 with TrackOutput

use of com.google.android.exoplayer2.extractor.TrackOutput in project ExoPlayer by google.

the class FragmentedMp4Extractor method appendSampleEncryptionData.

/**
   * Appends the corresponding encryption data to the {@link TrackOutput} contained in the given
   * {@link TrackBundle}.
   *
   * @param trackBundle The {@link TrackBundle} that contains the {@link Track} for which the
   *     Sample encryption data must be output.
   * @return The number of written bytes.
   */
private int appendSampleEncryptionData(TrackBundle trackBundle) {
    TrackFragment trackFragment = trackBundle.fragment;
    ParsableByteArray sampleEncryptionData = trackFragment.sampleEncryptionData;
    int sampleDescriptionIndex = trackFragment.header.sampleDescriptionIndex;
    TrackEncryptionBox encryptionBox = trackFragment.trackEncryptionBox != null ? trackFragment.trackEncryptionBox : trackBundle.track.sampleDescriptionEncryptionBoxes[sampleDescriptionIndex];
    int vectorSize = encryptionBox.initializationVectorSize;
    boolean subsampleEncryption = trackFragment.sampleHasSubsampleEncryptionTable[trackBundle.currentSampleIndex];
    // Write the signal byte, containing the vector size and the subsample encryption flag.
    encryptionSignalByte.data[0] = (byte) (vectorSize | (subsampleEncryption ? 0x80 : 0));
    encryptionSignalByte.setPosition(0);
    TrackOutput output = trackBundle.output;
    output.sampleData(encryptionSignalByte, 1);
    // Write the vector.
    output.sampleData(sampleEncryptionData, vectorSize);
    // If we don't have subsample encryption data, we're done.
    if (!subsampleEncryption) {
        return 1 + vectorSize;
    }
    // Write the subsample encryption data.
    int subsampleCount = sampleEncryptionData.readUnsignedShort();
    sampleEncryptionData.skipBytes(-2);
    int subsampleDataLength = 2 + 6 * subsampleCount;
    output.sampleData(sampleEncryptionData, subsampleDataLength);
    return 1 + vectorSize + subsampleDataLength;
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) TrackOutput(com.google.android.exoplayer2.extractor.TrackOutput)

Aggregations

TrackOutput (com.google.android.exoplayer2.extractor.TrackOutput)11 ParserException (com.google.android.exoplayer2.ParserException)3 DefaultTrackOutput (com.google.android.exoplayer2.extractor.DefaultTrackOutput)2 ParsableByteArray (com.google.android.exoplayer2.util.ParsableByteArray)2 Format (com.google.android.exoplayer2.Format)1 DefaultExtractorInput (com.google.android.exoplayer2.extractor.DefaultExtractorInput)1 ExtractorInput (com.google.android.exoplayer2.extractor.ExtractorInput)1 PositionHolder (com.google.android.exoplayer2.extractor.PositionHolder)1 FakeExtractorInput (com.google.android.exoplayer2.testutil.FakeExtractorInput)1 FakeExtractorOutput (com.google.android.exoplayer2.testutil.FakeExtractorOutput)1 FakeTrackOutput (com.google.android.exoplayer2.testutil.FakeTrackOutput)1 SubtitleDecoderException (com.google.android.exoplayer2.text.SubtitleDecoderException)1 DataSpec (com.google.android.exoplayer2.upstream.DataSpec)1 TimestampAdjuster (com.google.android.exoplayer2.util.TimestampAdjuster)1 Matcher (java.util.regex.Matcher)1