Java Code Examples for com.google.android.exoplayer2.extractor.TrackOutput#sampleMetadata()

The following examples show how to use com.google.android.exoplayer2.extractor.TrackOutput#sampleMetadata() . You can vote up the ones you like or vote down the ones you don't like, and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example 1
Source File: FragmentedMp4Extractor.java    From MediaSDK with Apache License 2.0 6 votes vote down vote up
private void outputPendingMetadataSamples(long sampleTimeUs) {
  while (!pendingMetadataSampleInfos.isEmpty()) {
    MetadataSampleInfo sampleInfo = pendingMetadataSampleInfos.removeFirst();
    pendingMetadataSampleBytes -= sampleInfo.size;
    long metadataTimeUs = sampleTimeUs + sampleInfo.presentationTimeDeltaUs;
    if (timestampAdjuster != null) {
      metadataTimeUs = timestampAdjuster.adjustSampleTimestamp(metadataTimeUs);
    }
    for (TrackOutput emsgTrackOutput : emsgTrackOutputs) {
      emsgTrackOutput.sampleMetadata(
          metadataTimeUs,
          C.BUFFER_FLAG_KEY_FRAME,
          sampleInfo.size,
          pendingMetadataSampleBytes,
          null);
    }
  }
}
 
Example 2
Source File: FragmentedMp4Extractor.java    From Telegram with GNU General Public License v2.0 6 votes vote down vote up
private void outputPendingMetadataSamples(long sampleTimeUs) {
  while (!pendingMetadataSampleInfos.isEmpty()) {
    MetadataSampleInfo sampleInfo = pendingMetadataSampleInfos.removeFirst();
    pendingMetadataSampleBytes -= sampleInfo.size;
    long metadataTimeUs = sampleTimeUs + sampleInfo.presentationTimeDeltaUs;
    if (timestampAdjuster != null) {
      metadataTimeUs = timestampAdjuster.adjustSampleTimestamp(metadataTimeUs);
    }
    for (TrackOutput emsgTrackOutput : emsgTrackOutputs) {
      emsgTrackOutput.sampleMetadata(
          metadataTimeUs,
          C.BUFFER_FLAG_KEY_FRAME,
          sampleInfo.size,
          pendingMetadataSampleBytes,
          null);
    }
  }
}
 
Example 3
Source File: FragmentedMp4Extractor.java    From Telegram-FOSS with GNU General Public License v2.0 6 votes vote down vote up
private void outputPendingMetadataSamples(long sampleTimeUs) {
  while (!pendingMetadataSampleInfos.isEmpty()) {
    MetadataSampleInfo sampleInfo = pendingMetadataSampleInfos.removeFirst();
    pendingMetadataSampleBytes -= sampleInfo.size;
    long metadataTimeUs = sampleTimeUs + sampleInfo.presentationTimeDeltaUs;
    if (timestampAdjuster != null) {
      metadataTimeUs = timestampAdjuster.adjustSampleTimestamp(metadataTimeUs);
    }
    for (TrackOutput emsgTrackOutput : emsgTrackOutputs) {
      emsgTrackOutput.sampleMetadata(
          metadataTimeUs,
          C.BUFFER_FLAG_KEY_FRAME,
          sampleInfo.size,
          pendingMetadataSampleBytes,
          null);
    }
  }
}
 
Example 4
Source File: DvbSubtitleReader.java    From Telegram-FOSS with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void packetFinished() {
  if (writingSample) {
    for (TrackOutput output : outputs) {
      output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleBytesWritten, 0, null);
    }
    writingSample = false;
  }
}
 
Example 5
Source File: DvbSubtitleReader.java    From MediaSDK with Apache License 2.0 5 votes vote down vote up
@Override
public void packetFinished() {
  if (writingSample) {
    for (TrackOutput output : outputs) {
      output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleBytesWritten, 0, null);
    }
    writingSample = false;
  }
}
 
Example 6
Source File: SingleSampleMediaChunk.java    From K-Sonic with MIT License 5 votes vote down vote up
@SuppressWarnings("NonAtomicVolatileUpdate")
@Override
public void load() throws IOException, InterruptedException {
  DataSpec loadDataSpec = Util.getRemainderDataSpec(dataSpec, bytesLoaded);
  try {
    // Create and open the input.
    long length = dataSource.open(loadDataSpec);
    if (length != C.LENGTH_UNSET) {
      length += bytesLoaded;
    }
    ExtractorInput extractorInput = new DefaultExtractorInput(dataSource, bytesLoaded, length);
    BaseMediaChunkOutput output = getOutput();
    output.setSampleOffsetUs(0);
    TrackOutput trackOutput = output.track(0, trackType);
    trackOutput.format(sampleFormat);
    // Load the sample data.
    int result = 0;
    while (result != C.RESULT_END_OF_INPUT) {
      bytesLoaded += result;
      result = trackOutput.sampleData(extractorInput, Integer.MAX_VALUE, true);
    }
    int sampleSize = bytesLoaded;
    trackOutput.sampleMetadata(startTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null);
  } finally {
    Util.closeQuietly(dataSource);
  }
  loadCompleted = true;
}
 
Example 7
Source File: CeaUtil.java    From K-Sonic with MIT License 5 votes vote down vote up
/**
 * Consumes the unescaped content of an SEI NAL unit, writing the content of any CEA-608 messages
 * as samples to all of the provided outputs.
 *
 * @param presentationTimeUs The presentation time in microseconds for any samples.
 * @param seiBuffer The unescaped SEI NAL unit data, excluding the NAL unit start code and type.
 * @param outputs The outputs to which any samples should be written.
 */
public static void consume(long presentationTimeUs, ParsableByteArray seiBuffer,
    TrackOutput[] outputs) {
  while (seiBuffer.bytesLeft() > 1 /* last byte will be rbsp_trailing_bits */) {
    int payloadType = readNon255TerminatedValue(seiBuffer);
    int payloadSize = readNon255TerminatedValue(seiBuffer);
    // Process the payload.
    if (payloadSize == -1 || payloadSize > seiBuffer.bytesLeft()) {
      // This might occur if we're trying to read an encrypted SEI NAL unit.
      Log.w(TAG, "Skipping remainder of malformed SEI NAL unit.");
      seiBuffer.setPosition(seiBuffer.limit());
    } else if (isSeiMessageCea608(payloadType, payloadSize, seiBuffer)) {
      // Ignore country_code (1) + provider_code (2) + user_identifier (4)
      // + user_data_type_code (1).
      seiBuffer.skipBytes(8);
      // Ignore first three bits: reserved (1) + process_cc_data_flag (1) + zero_bit (1).
      int ccCount = seiBuffer.readUnsignedByte() & 0x1F;
      // Ignore em_data (1)
      seiBuffer.skipBytes(1);
      // Each data packet consists of 24 bits: marker bits (5) + cc_valid (1) + cc_type (2)
      // + cc_data_1 (8) + cc_data_2 (8).
      int sampleLength = ccCount * 3;
      int sampleStartPosition = seiBuffer.getPosition();
      for (TrackOutput output : outputs) {
        seiBuffer.setPosition(sampleStartPosition);
        output.sampleData(seiBuffer, sampleLength);
        output.sampleMetadata(presentationTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleLength, 0, null);
      }
      // Ignore trailing information in SEI, if any.
      seiBuffer.skipBytes(payloadSize - (10 + ccCount * 3));
    } else {
      seiBuffer.skipBytes(payloadSize);
    }
  }
}
 
Example 8
Source File: FlacExtractor.java    From Telegram with GNU General Public License v2.0 5 votes vote down vote up
private static void outputSample(
    ParsableByteArray sampleData, int size, long timeUs, TrackOutput output) {
  sampleData.setPosition(0);
  output.sampleData(sampleData, size);
  output.sampleMetadata(
      timeUs, C.BUFFER_FLAG_KEY_FRAME, size, /* offset= */ 0, /* encryptionData= */ null);
}
 
Example 9
Source File: FlacExtractor.java    From Telegram-FOSS with GNU General Public License v2.0 5 votes vote down vote up
private static void outputSample(
    ParsableByteArray sampleData, int size, long timeUs, TrackOutput output) {
  sampleData.setPosition(0);
  output.sampleData(sampleData, size);
  output.sampleMetadata(
      timeUs, C.BUFFER_FLAG_KEY_FRAME, size, /* offset= */ 0, /* encryptionData= */ null);
}
 
Example 10
Source File: SingleSampleMediaChunk.java    From Telegram-FOSS with GNU General Public License v2.0 5 votes vote down vote up
@SuppressWarnings("NonAtomicVolatileUpdate")
@Override
public void load() throws IOException, InterruptedException {
  DataSpec loadDataSpec = dataSpec.subrange(nextLoadPosition);
  try {
    // Create and open the input.
    long length = dataSource.open(loadDataSpec);
    if (length != C.LENGTH_UNSET) {
      length += nextLoadPosition;
    }
    ExtractorInput extractorInput =
        new DefaultExtractorInput(dataSource, nextLoadPosition, length);
    BaseMediaChunkOutput output = getOutput();
    output.setSampleOffsetUs(0);
    TrackOutput trackOutput = output.track(0, trackType);
    trackOutput.format(sampleFormat);
    // Load the sample data.
    int result = 0;
    while (result != C.RESULT_END_OF_INPUT) {
      nextLoadPosition += result;
      result = trackOutput.sampleData(extractorInput, Integer.MAX_VALUE, true);
    }
    int sampleSize = (int) nextLoadPosition;
    trackOutput.sampleMetadata(startTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null);
  } finally {
    Util.closeQuietly(dataSource);
  }
  loadCompleted = true;
}
 
Example 11
Source File: DvbSubtitleReader.java    From TelePlus-Android with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void packetFinished() {
  if (writingSample) {
    for (TrackOutput output : outputs) {
      output.sampleMetadata(sampleTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleBytesWritten, 0, null);
    }
    writingSample = false;
  }
}
 
Example 12
Source File: ProgressiveMediaPeriod.java    From Telegram with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void onIcyMetadata(ParsableByteArray metadata) {
  // Always output the first ICY metadata at the start time. This helps minimize any delay
  // between the start of playback and the first ICY metadata event.
  long timeUs =
      !seenIcyMetadata ? seekTimeUs : Math.max(getLargestQueuedTimestampUs(), seekTimeUs);
  int length = metadata.bytesLeft();
  TrackOutput icyTrackOutput = Assertions.checkNotNull(this.icyTrackOutput);
  icyTrackOutput.sampleData(metadata, length);
  icyTrackOutput.sampleMetadata(
      timeUs, C.BUFFER_FLAG_KEY_FRAME, length, /* offset= */ 0, /* encryptionData= */ null);
  seenIcyMetadata = true;
}
 
Example 13
Source File: CeaUtil.java    From Telegram-FOSS with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Consumes caption data (cc_data), writing the content as samples to all of the provided outputs.
 *
 * @param presentationTimeUs The presentation time in microseconds for any samples.
 * @param ccDataBuffer The buffer containing the caption data.
 * @param outputs The outputs to which any samples should be written.
 */
public static void consumeCcData(
    long presentationTimeUs, ParsableByteArray ccDataBuffer, TrackOutput[] outputs) {
  // First byte contains: reserved (1), process_cc_data_flag (1), zero_bit (1), cc_count (5).
  int firstByte = ccDataBuffer.readUnsignedByte();
  boolean processCcDataFlag = (firstByte & 0x40) != 0;
  if (!processCcDataFlag) {
    // No need to process.
    return;
  }
  int ccCount = firstByte & 0x1F;
  ccDataBuffer.skipBytes(1); // Ignore em_data
  // Each data packet consists of 24 bits: marker bits (5) + cc_valid (1) + cc_type (2)
  // + cc_data_1 (8) + cc_data_2 (8).
  int sampleLength = ccCount * 3;
  int sampleStartPosition = ccDataBuffer.getPosition();
  for (TrackOutput output : outputs) {
    ccDataBuffer.setPosition(sampleStartPosition);
    output.sampleData(ccDataBuffer, sampleLength);
    output.sampleMetadata(
        presentationTimeUs,
        C.BUFFER_FLAG_KEY_FRAME,
        sampleLength,
        /* offset= */ 0,
        /* encryptionData= */ null);
  }
}
 
Example 14
Source File: CeaUtil.java    From TelePlus-Android with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Consumes caption data (cc_data), writing the content as samples to all of the provided outputs.
 *
 * @param presentationTimeUs The presentation time in microseconds for any samples.
 * @param ccDataBuffer The buffer containing the caption data.
 * @param outputs The outputs to which any samples should be written.
 */
public static void consumeCcData(
    long presentationTimeUs, ParsableByteArray ccDataBuffer, TrackOutput[] outputs) {
  // First byte contains: reserved (1), process_cc_data_flag (1), zero_bit (1), cc_count (5).
  int firstByte = ccDataBuffer.readUnsignedByte();
  boolean processCcDataFlag = (firstByte & 0x40) != 0;
  if (!processCcDataFlag) {
    // No need to process.
    return;
  }
  int ccCount = firstByte & 0x1F;
  ccDataBuffer.skipBytes(1); // Ignore em_data
  // Each data packet consists of 24 bits: marker bits (5) + cc_valid (1) + cc_type (2)
  // + cc_data_1 (8) + cc_data_2 (8).
  int sampleLength = ccCount * 3;
  int sampleStartPosition = ccDataBuffer.getPosition();
  for (TrackOutput output : outputs) {
    ccDataBuffer.setPosition(sampleStartPosition);
    output.sampleData(ccDataBuffer, sampleLength);
    output.sampleMetadata(
        presentationTimeUs,
        C.BUFFER_FLAG_KEY_FRAME,
        sampleLength,
        /* offset= */ 0,
        /* encryptionData= */ null);
  }
}
 
Example 15
Source File: FragmentedMp4Extractor.java    From TelePlus-Android with GNU General Public License v2.0 5 votes vote down vote up
private void outputPendingMetadataSamples(long sampleTimeUs) {
  while (!pendingMetadataSampleInfos.isEmpty()) {
    MetadataSampleInfo sampleInfo = pendingMetadataSampleInfos.removeFirst();
    pendingMetadataSampleBytes -= sampleInfo.size;
    for (TrackOutput emsgTrackOutput : emsgTrackOutputs) {
      emsgTrackOutput.sampleMetadata(
          sampleTimeUs + sampleInfo.presentationTimeDeltaUs,
          C.BUFFER_FLAG_KEY_FRAME, sampleInfo.size, pendingMetadataSampleBytes, null);
    }
  }
}
 
Example 16
Source File: CeaUtil.java    From Telegram with GNU General Public License v2.0 5 votes vote down vote up
/**
 * Consumes caption data (cc_data), writing the content as samples to all of the provided outputs.
 *
 * @param presentationTimeUs The presentation time in microseconds for any samples.
 * @param ccDataBuffer The buffer containing the caption data.
 * @param outputs The outputs to which any samples should be written.
 */
public static void consumeCcData(
    long presentationTimeUs, ParsableByteArray ccDataBuffer, TrackOutput[] outputs) {
  // First byte contains: reserved (1), process_cc_data_flag (1), zero_bit (1), cc_count (5).
  int firstByte = ccDataBuffer.readUnsignedByte();
  boolean processCcDataFlag = (firstByte & 0x40) != 0;
  if (!processCcDataFlag) {
    // No need to process.
    return;
  }
  int ccCount = firstByte & 0x1F;
  ccDataBuffer.skipBytes(1); // Ignore em_data
  // Each data packet consists of 24 bits: marker bits (5) + cc_valid (1) + cc_type (2)
  // + cc_data_1 (8) + cc_data_2 (8).
  int sampleLength = ccCount * 3;
  int sampleStartPosition = ccDataBuffer.getPosition();
  for (TrackOutput output : outputs) {
    ccDataBuffer.setPosition(sampleStartPosition);
    output.sampleData(ccDataBuffer, sampleLength);
    output.sampleMetadata(
        presentationTimeUs,
        C.BUFFER_FLAG_KEY_FRAME,
        sampleLength,
        /* offset= */ 0,
        /* encryptionData= */ null);
  }
}
 
Example 17
Source File: ProgressiveMediaPeriod.java    From Telegram-FOSS with GNU General Public License v2.0 5 votes vote down vote up
@Override
public void onIcyMetadata(ParsableByteArray metadata) {
  // Always output the first ICY metadata at the start time. This helps minimize any delay
  // between the start of playback and the first ICY metadata event.
  long timeUs =
      !seenIcyMetadata ? seekTimeUs : Math.max(getLargestQueuedTimestampUs(), seekTimeUs);
  int length = metadata.bytesLeft();
  TrackOutput icyTrackOutput = Assertions.checkNotNull(this.icyTrackOutput);
  icyTrackOutput.sampleData(metadata, length);
  icyTrackOutput.sampleMetadata(
      timeUs, C.BUFFER_FLAG_KEY_FRAME, length, /* offset= */ 0, /* encryptionData= */ null);
  seenIcyMetadata = true;
}
 
Example 18
Source File: SingleSampleMediaChunk.java    From Telegram with GNU General Public License v2.0 5 votes vote down vote up
@SuppressWarnings("NonAtomicVolatileUpdate")
@Override
public void load() throws IOException, InterruptedException {
  DataSpec loadDataSpec = dataSpec.subrange(nextLoadPosition);
  try {
    // Create and open the input.
    long length = dataSource.open(loadDataSpec);
    if (length != C.LENGTH_UNSET) {
      length += nextLoadPosition;
    }
    ExtractorInput extractorInput =
        new DefaultExtractorInput(dataSource, nextLoadPosition, length);
    BaseMediaChunkOutput output = getOutput();
    output.setSampleOffsetUs(0);
    TrackOutput trackOutput = output.track(0, trackType);
    trackOutput.format(sampleFormat);
    // Load the sample data.
    int result = 0;
    while (result != C.RESULT_END_OF_INPUT) {
      nextLoadPosition += result;
      result = trackOutput.sampleData(extractorInput, Integer.MAX_VALUE, true);
    }
    int sampleSize = (int) nextLoadPosition;
    trackOutput.sampleMetadata(startTimeUs, C.BUFFER_FLAG_KEY_FRAME, sampleSize, 0, null);
  } finally {
    Util.closeQuietly(dataSource);
  }
  loadCompleted = true;
}
 
Example 19
Source File: WebvttExtractor.java    From TelePlus-Android with GNU General Public License v2.0 4 votes vote down vote up
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.adjustTsTimestamp(
      TimestampAdjuster.usToPts(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);
}
 
Example 20
Source File: WebvttExtractor.java    From K-Sonic with MIT License 4 votes vote down vote up
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);
}