Java 类com.google.android.exoplayer.extractor.mp4.Atom.LeafAtom 实例源码

项目:miku    文件:FragmentedMp4Extractor.java   
private void onMoovContainerAtomRead(ContainerAtom moov) {
  List<Atom.LeafAtom> moovChildren = moov.leafChildren;
  int moovChildrenSize = moovChildren.size();

  DrmInitData.Mapped drmInitData = null;
  for (int i = 0; i < moovChildrenSize; i++) {
    LeafAtom child = moovChildren.get(i);
    if (child.type == Atom.TYPE_pssh) {
      if (drmInitData == null) {
        drmInitData = new DrmInitData.Mapped(MimeTypes.VIDEO_MP4);
      }
      byte[] psshData = child.data.data;
      drmInitData.put(PsshAtomUtil.parseUuid(psshData), psshData);
    }
  }
  if (drmInitData != null) {
    extractorOutput.drmInitData(drmInitData);
  }

  ContainerAtom mvex = moov.getContainerAtomOfType(Atom.TYPE_mvex);
  extendsDefaults = parseTrex(mvex.getLeafAtomOfType(Atom.TYPE_trex).data);
  track = AtomParsers.parseTrak(moov.getContainerAtomOfType(Atom.TYPE_trak),
      moov.getLeafAtomOfType(Atom.TYPE_mvhd));
  Assertions.checkState(track != null);
  trackOutput.format(track.mediaFormat);
}
项目:ExoPlayer    文件:FragmentedMp4Extractor.java   
private void onMoovContainerAtomRead(ContainerAtom moov) {
  List<Atom.LeafAtom> moovChildren = moov.leafChildren;
  int moovChildrenSize = moovChildren.size();

  DrmInitData.Mapped drmInitData = null;
  for (int i = 0; i < moovChildrenSize; i++) {
    LeafAtom child = moovChildren.get(i);
    if (child.type == Atom.TYPE_pssh) {
      if (drmInitData == null) {
        drmInitData = new DrmInitData.Mapped(MimeTypes.VIDEO_MP4);
      }
      byte[] psshData = child.data.data;
      drmInitData.put(PsshAtomUtil.parseUuid(psshData), psshData);
    }
  }
  if (drmInitData != null) {
    extractorOutput.drmInitData(drmInitData);
  }

  ContainerAtom mvex = moov.getContainerAtomOfType(Atom.TYPE_mvex);
  extendsDefaults = parseTrex(mvex.getLeafAtomOfType(Atom.TYPE_trex).data);
  track = AtomParsers.parseTrak(moov.getContainerAtomOfType(Atom.TYPE_trak),
      moov.getLeafAtomOfType(Atom.TYPE_mvhd));
  Assertions.checkState(track != null);
  trackOutput.format(track.mediaFormat);
}
项目:miku    文件:FragmentedMp4Extractor.java   
private void readAtomPayload(ExtractorInput input) throws IOException, InterruptedException {
  int atomPayloadSize = (int) atomSize - atomHeaderBytesRead;
  if (atomData != null) {
    input.readFully(atomData.data, Atom.HEADER_SIZE, atomPayloadSize);
    onLeafAtomRead(new LeafAtom(atomType, atomData), input.getPosition());
  } else {
    input.skipFully(atomPayloadSize);
  }
  long currentPosition = input.getPosition();
  while (!containerAtoms.isEmpty() && containerAtoms.peek().endPosition == currentPosition) {
    onContainerAtomRead(containerAtoms.pop());
  }
  enterReadingAtomHeaderState();
}
项目:miku    文件:FragmentedMp4Extractor.java   
private void onLeafAtomRead(LeafAtom leaf, long inputPosition) {
  if (!containerAtoms.isEmpty()) {
    containerAtoms.peek().add(leaf);
  } else if (leaf.type == Atom.TYPE_sidx) {
    ChunkIndex segmentIndex = parseSidx(leaf.data, inputPosition);
    extractorOutput.seekMap(segmentIndex);
    haveOutputSeekMap = true;
  }
}
项目:miku    文件:FragmentedMp4Extractor.java   
/**
 * Parses a traf atom (defined in 14496-12).
 */
private static void parseTraf(Track track, DefaultSampleValues extendsDefaults,
    ContainerAtom traf, TrackFragment out, int workaroundFlags, byte[] extendedTypeScratch) {
  LeafAtom tfdtAtom = traf.getLeafAtomOfType(Atom.TYPE_tfdt);
  long decodeTime = tfdtAtom == null ? 0 : parseTfdt(traf.getLeafAtomOfType(Atom.TYPE_tfdt).data);

  LeafAtom tfhd = traf.getLeafAtomOfType(Atom.TYPE_tfhd);
  DefaultSampleValues fragmentHeader = parseTfhd(extendsDefaults, tfhd.data);
  out.sampleDescriptionIndex = fragmentHeader.sampleDescriptionIndex;

  LeafAtom trun = traf.getLeafAtomOfType(Atom.TYPE_trun);
  parseTrun(track, fragmentHeader, decodeTime, workaroundFlags, trun.data, out);

  LeafAtom saiz = traf.getLeafAtomOfType(Atom.TYPE_saiz);
  if (saiz != null) {
    TrackEncryptionBox trackEncryptionBox =
        track.sampleDescriptionEncryptionBoxes[fragmentHeader.sampleDescriptionIndex];
    parseSaiz(trackEncryptionBox, saiz.data, out);
  }

  LeafAtom senc = traf.getLeafAtomOfType(Atom.TYPE_senc);
  if (senc != null) {
    parseSenc(senc.data, out);
  }

  int childrenSize = traf.leafChildren.size();
  for (int i = 0; i < childrenSize; i++) {
    LeafAtom atom = traf.leafChildren.get(i);
    if (atom.type == Atom.TYPE_uuid) {
      parseUuid(atom.data, out, extendedTypeScratch);
    }
  }
}
项目:ExoPlayer-Demo    文件:FragmentedMp4Extractor.java   
private void readAtomPayload(ExtractorInput input) throws IOException, InterruptedException {
  int atomPayloadSize = (int) atomSize - atomHeaderBytesRead;
  if (atomData != null) {
    input.readFully(atomData.data, Atom.HEADER_SIZE, atomPayloadSize);
    onLeafAtomRead(new LeafAtom(atomType, atomData), input.getPosition());
  } else {
    input.skipFully(atomPayloadSize);
  }
  processAtomEnded(input.getPosition());
}
项目:ExoPlayer-Demo    文件:FragmentedMp4Extractor.java   
private void onLeafAtomRead(LeafAtom leaf, long inputPosition) throws ParserException {
  if (!containerAtoms.isEmpty()) {
    containerAtoms.peek().add(leaf);
  } else if (leaf.type == Atom.TYPE_sidx) {
    ChunkIndex segmentIndex = parseSidx(leaf.data, inputPosition);
    extractorOutput.seekMap(segmentIndex);
    haveOutputSeekMap = true;
  } else if (leaf.type == Atom.TYPE_emsg) {
    parseEmsg(leaf.data, inputPosition);
  }
}
项目:ExoPlayer    文件:FragmentedMp4Extractor.java   
private void readAtomPayload(ExtractorInput input) throws IOException, InterruptedException {
  int atomPayloadSize = (int) atomSize - atomHeaderBytesRead;
  if (atomData != null) {
    input.readFully(atomData.data, Atom.HEADER_SIZE, atomPayloadSize);
    onLeafAtomRead(new LeafAtom(atomType, atomData), input.getPosition());
  } else {
    input.skipFully(atomPayloadSize);
  }
  long currentPosition = input.getPosition();
  while (!containerAtoms.isEmpty() && containerAtoms.peek().endPosition == currentPosition) {
    onContainerAtomRead(containerAtoms.pop());
  }
  enterReadingAtomHeaderState();
}
项目:ExoPlayer    文件:FragmentedMp4Extractor.java   
private void onLeafAtomRead(LeafAtom leaf, long inputPosition) {
  if (!containerAtoms.isEmpty()) {
    containerAtoms.peek().add(leaf);
  } else if (leaf.type == Atom.TYPE_sidx) {
    ChunkIndex segmentIndex = parseSidx(leaf.data, inputPosition);
    extractorOutput.seekMap(segmentIndex);
    haveOutputSeekMap = true;
  }
}
项目:ExoPlayer    文件:FragmentedMp4Extractor.java   
/**
 * Parses a traf atom (defined in 14496-12).
 */
private static void parseTraf(Track track, DefaultSampleValues extendsDefaults,
    ContainerAtom traf, TrackFragment out, int workaroundFlags, byte[] extendedTypeScratch) {
  LeafAtom tfdtAtom = traf.getLeafAtomOfType(Atom.TYPE_tfdt);
  long decodeTime = tfdtAtom == null ? 0 : parseTfdt(traf.getLeafAtomOfType(Atom.TYPE_tfdt).data);

  LeafAtom tfhd = traf.getLeafAtomOfType(Atom.TYPE_tfhd);
  DefaultSampleValues fragmentHeader = parseTfhd(extendsDefaults, tfhd.data);
  out.sampleDescriptionIndex = fragmentHeader.sampleDescriptionIndex;

  LeafAtom trun = traf.getLeafAtomOfType(Atom.TYPE_trun);
  parseTrun(track, fragmentHeader, decodeTime, workaroundFlags, trun.data, out);

  LeafAtom saiz = traf.getLeafAtomOfType(Atom.TYPE_saiz);
  if (saiz != null) {
    TrackEncryptionBox trackEncryptionBox =
        track.sampleDescriptionEncryptionBoxes[fragmentHeader.sampleDescriptionIndex];
    parseSaiz(trackEncryptionBox, saiz.data, out);
  }

  LeafAtom senc = traf.getLeafAtomOfType(Atom.TYPE_senc);
  if (senc != null) {
    parseSenc(senc.data, out);
  }

  int childrenSize = traf.leafChildren.size();
  for (int i = 0; i < childrenSize; i++) {
    LeafAtom atom = traf.leafChildren.get(i);
    if (atom.type == Atom.TYPE_uuid) {
      parseUuid(atom.data, out, extendedTypeScratch);
    }
  }
}
项目:ExoPlayer-Demo    文件:FragmentedMp4Extractor.java   
/**
 * Parses a traf atom (defined in 14496-12).
 */
private static void parseTraf(ContainerAtom traf, SparseArray<TrackBundle> trackBundleArray,
    int flags, byte[] extendedTypeScratch) throws ParserException {
  if (traf.getChildAtomOfTypeCount(Atom.TYPE_trun) != 1) {
    throw new ParserException("Trun count in traf != 1 (unsupported).");
  }

  LeafAtom tfhd = traf.getLeafAtomOfType(Atom.TYPE_tfhd);
  TrackBundle trackBundle = parseTfhd(tfhd.data, trackBundleArray, flags);
  if (trackBundle == null) {
    return;
  }

  TrackFragment fragment = trackBundle.fragment;
  long decodeTime = fragment.nextFragmentDecodeTime;
  trackBundle.reset();

  LeafAtom tfdtAtom = traf.getLeafAtomOfType(Atom.TYPE_tfdt);
  if (tfdtAtom != null && (flags & FLAG_WORKAROUND_IGNORE_TFDT_BOX) == 0) {
    decodeTime = parseTfdt(traf.getLeafAtomOfType(Atom.TYPE_tfdt).data);
  }

  LeafAtom trun = traf.getLeafAtomOfType(Atom.TYPE_trun);
  parseTrun(trackBundle, decodeTime, flags, trun.data);

  LeafAtom saiz = traf.getLeafAtomOfType(Atom.TYPE_saiz);
  if (saiz != null) {
    TrackEncryptionBox trackEncryptionBox = trackBundle.track
        .sampleDescriptionEncryptionBoxes[fragment.header.sampleDescriptionIndex];
    parseSaiz(trackEncryptionBox, saiz.data, fragment);
  }

  LeafAtom saio = traf.getLeafAtomOfType(Atom.TYPE_saio);
  if (saio != null) {
    parseSaio(saio.data, fragment);
  }

  LeafAtom senc = traf.getLeafAtomOfType(Atom.TYPE_senc);
  if (senc != null) {
    parseSenc(senc.data, fragment);
  }

  LeafAtom sbgp = traf.getLeafAtomOfType(Atom.TYPE_sbgp);
  LeafAtom sgpd = traf.getLeafAtomOfType(Atom.TYPE_sgpd);
  if (sbgp != null && sgpd != null) {
    parseSgpd(sbgp.data, sgpd.data, fragment);
  }

  int childrenSize = traf.leafChildren.size();
  for (int i = 0; i < childrenSize; i++) {
    LeafAtom atom = traf.leafChildren.get(i);
    if (atom.type == Atom.TYPE_uuid) {
      parseUuid(atom.data, fragment, extendedTypeScratch);
    }
  }
}