Java 类com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom 实例源码

项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
private void onMoofContainerAtomRead(ContainerAtom moof) {
  fragmentRun.reset();
  parseMoof(track, extendsDefaults, moof, fragmentRun, workaroundFlags, extendedTypeScratch);
  sampleIndex = 0;
  lastSyncSampleIndex = 0;
  pendingSeekSyncSampleIndex = 0;
  if (pendingSeekTimeMs != 0) {
    for (int i = 0; i < fragmentRun.length; i++) {
      if (fragmentRun.sampleIsSyncFrameTable[i]) {
        if (fragmentRun.getSamplePresentationTime(i) <= pendingSeekTimeMs) {
          pendingSeekSyncSampleIndex = i;
        }
      }
    }
    pendingSeekTimeMs = 0;
  }
}
项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
/**
 * Parses a trak atom (defined in 14496-12).
 */
private static Track parseTrak(ContainerAtom trak) {
  ContainerAtom mdia = trak.getContainerAtomOfType(Atom.TYPE_mdia);
  int trackType = parseHdlr(mdia.getLeafAtomOfType(Atom.TYPE_hdlr).data);
  Assertions.checkState(trackType == Track.TYPE_AUDIO || trackType == Track.TYPE_VIDEO);

  Pair<Integer, Long> header = parseTkhd(trak.getLeafAtomOfType(Atom.TYPE_tkhd).data);
  int id = header.first;
  // TODO: This value should be used to set a duration field on the Track object
  // instantiated below, however we've found examples where the value is 0. Revisit whether we
  // should set it anyway (and just have it be wrong for bad media streams).
  // long duration = header.second;
  long timescale = parseMdhd(mdia.getLeafAtomOfType(Atom.TYPE_mdhd).data);
  ContainerAtom stbl = mdia.getContainerAtomOfType(Atom.TYPE_minf)
      .getContainerAtomOfType(Atom.TYPE_stbl);

  Pair<MediaFormat, TrackEncryptionBox[]> sampleDescriptions =
      parseStsd(stbl.getLeafAtomOfType(Atom.TYPE_stsd).data);
  return new Track(id, trackType, timescale, sampleDescriptions.first, sampleDescriptions.second);
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
private void onMoofContainerAtomRead(ContainerAtom moof) {
  fragmentRun.reset();
  parseMoof(track, extendsDefaults, moof, fragmentRun, workaroundFlags, extendedTypeScratch);
  sampleIndex = 0;
  lastSyncSampleIndex = 0;
  pendingSeekSyncSampleIndex = 0;
  if (pendingSeekTimeMs != 0) {
    for (int i = 0; i < fragmentRun.length; i++) {
      if (fragmentRun.sampleIsSyncFrameTable[i]) {
        if (fragmentRun.getSamplePresentationTime(i) <= pendingSeekTimeMs) {
          pendingSeekSyncSampleIndex = i;
        }
      }
    }
    pendingSeekTimeMs = 0;
  }
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
/**
 * Parses a trak atom (defined in 14496-12).
 */
private static Track parseTrak(ContainerAtom trak) {
  ContainerAtom mdia = trak.getContainerAtomOfType(Atom.TYPE_mdia);
  int trackType = parseHdlr(mdia.getLeafAtomOfType(Atom.TYPE_hdlr).data);
  Assertions.checkState(trackType == Track.TYPE_AUDIO || trackType == Track.TYPE_VIDEO);

  Pair<Integer, Long> header = parseTkhd(trak.getLeafAtomOfType(Atom.TYPE_tkhd).data);
  int id = header.first;
  // TODO: This value should be used to set a duration field on the Track object
  // instantiated below, however we've found examples where the value is 0. Revisit whether we
  // should set it anyway (and just have it be wrong for bad media streams).
  // long duration = header.second;
  long timescale = parseMdhd(mdia.getLeafAtomOfType(Atom.TYPE_mdhd).data);
  ContainerAtom stbl = mdia.getContainerAtomOfType(Atom.TYPE_minf)
      .getContainerAtomOfType(Atom.TYPE_stbl);

  Pair<MediaFormat, TrackEncryptionBox[]> sampleDescriptions =
      parseStsd(stbl.getLeafAtomOfType(Atom.TYPE_stsd).data);
  return new Track(id, trackType, timescale, sampleDescriptions.first, sampleDescriptions.second);
}
项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
/**
 * @param workaroundFlags Flags to allow parsing of faulty streams.
 *     {@link #WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME} is currently the only flag defined.
 */
public FragmentedMp4Extractor(int workaroundFlags) {
  this.workaroundFlags = workaroundFlags;
  parserState = STATE_READING_ATOM_HEADER;
  atomHeader = new ParsableByteArray(ATOM_HEADER_SIZE);
  extendedTypeScratch = new byte[16];
  containerAtoms = new Stack<ContainerAtom>();
  containerAtomEndPoints = new Stack<Integer>();
  fragmentRun = new TrackFragment();
  psshData = new HashMap<UUID, byte[]>();
}
项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
private int onContainerAtomRead(ContainerAtom container) {
  if (container.type == Atom.TYPE_moov) {
    onMoovContainerAtomRead(container);
    return RESULT_READ_INIT;
  } else if (container.type == Atom.TYPE_moof) {
    onMoofContainerAtomRead(container);
  } else if (!containerAtoms.isEmpty()) {
    containerAtoms.peek().add(container);
  }
  return 0;
}
项目:android-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.children.size();
  for (int i = 0; i < childrenSize; i++) {
    Atom atom = traf.children.get(i);
    if (atom.type == Atom.TYPE_uuid) {
      parseUuid(((LeafAtom) atom).data, out, extendedTypeScratch);
    }
  }
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
/**
 * @param workaroundFlags Flags to allow parsing of faulty streams.
 *     {@link #WORKAROUND_EVERY_VIDEO_FRAME_IS_SYNC_FRAME} is currently the only flag defined.
 */
public FragmentedMp4Extractor(int workaroundFlags) {
  this.workaroundFlags = workaroundFlags;
  parserState = STATE_READING_ATOM_HEADER;
  atomHeader = new ParsableByteArray(ATOM_HEADER_SIZE);
  extendedTypeScratch = new byte[16];
  containerAtoms = new Stack<ContainerAtom>();
  containerAtomEndPoints = new Stack<Integer>();
  fragmentRun = new TrackFragment();
  psshData = new HashMap<UUID, byte[]>();
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
private int onContainerAtomRead(ContainerAtom container) {
  if (container.type == Atom.TYPE_moov) {
    onMoovContainerAtomRead(container);
    return RESULT_READ_INIT;
  } else if (container.type == Atom.TYPE_moof) {
    onMoofContainerAtomRead(container);
  } else if (!containerAtoms.isEmpty()) {
    containerAtoms.peek().add(container);
  }
  return 0;
}
项目:edx-app-android    文件: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);
  }

  LeafAtom uuid = traf.getLeafAtomOfType(Atom.TYPE_uuid);
  if (uuid != null) {
    parseUuid(uuid.data, out, extendedTypeScratch);
  }
}
项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
private int readAtomHeader(NonBlockingInputStream inputStream) {
  int remainingBytes = ATOM_HEADER_SIZE - atomBytesRead;
  int bytesRead = inputStream.read(atomHeader.data, atomBytesRead, remainingBytes);
  if (bytesRead == -1) {
    return RESULT_END_OF_STREAM;
  }
  rootAtomBytesRead += bytesRead;
  atomBytesRead += bytesRead;
  if (atomBytesRead != ATOM_HEADER_SIZE) {
    return RESULT_NEED_MORE_DATA;
  }

  atomHeader.setPosition(0);
  atomSize = atomHeader.readInt();
  atomType = atomHeader.readInt();

  if (atomType == Atom.TYPE_mdat) {
    if (fragmentRun.sampleEncryptionDataNeedsFill) {
      enterState(STATE_READING_ENCRYPTION_DATA);
    } else {
      enterState(STATE_READING_SAMPLE);
    }
    return 0;
  }

  if (PARSED_ATOMS.contains(atomType)) {
    if (CONTAINER_TYPES.contains(atomType)) {
      enterState(STATE_READING_ATOM_HEADER);
      containerAtoms.add(new ContainerAtom(atomType));
      containerAtomEndPoints.add(rootAtomBytesRead + atomSize - ATOM_HEADER_SIZE);
    } else {
      atomData = new ParsableByteArray(atomSize);
      System.arraycopy(atomHeader.data, 0, atomData.data, 0, ATOM_HEADER_SIZE);
      enterState(STATE_READING_ATOM_PAYLOAD);
    }
  } else {
    atomData = null;
    enterState(STATE_READING_ATOM_PAYLOAD);
  }

  return 0;
}
项目:android-exoplayer    文件:FragmentedMp4Extractor.java   
private static void parseMoof(Track track, DefaultSampleValues extendsDefaults,
    ContainerAtom moof, TrackFragment out, int workaroundFlags, byte[] extendedTypeScratch) {
  parseTraf(track, extendsDefaults, moof.getContainerAtomOfType(Atom.TYPE_traf),
      out, workaroundFlags, extendedTypeScratch);
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
private int readAtomHeader(NonBlockingInputStream inputStream) {
  int remainingBytes = ATOM_HEADER_SIZE - atomBytesRead;
  int bytesRead = inputStream.read(atomHeader.data, atomBytesRead, remainingBytes);
  if (bytesRead == -1) {
    return RESULT_END_OF_STREAM;
  }
  rootAtomBytesRead += bytesRead;
  atomBytesRead += bytesRead;
  if (atomBytesRead != ATOM_HEADER_SIZE) {
    return RESULT_NEED_MORE_DATA;
  }

  atomHeader.setPosition(0);
  atomSize = atomHeader.readInt();
  atomType = atomHeader.readInt();

  if (atomType == Atom.TYPE_mdat) {
    if (fragmentRun.sampleEncryptionDataNeedsFill) {
      enterState(STATE_READING_ENCRYPTION_DATA);
    } else {
      enterState(STATE_READING_SAMPLE);
    }
    return 0;
  }

  if (PARSED_ATOMS.contains(atomType)) {
    if (CONTAINER_TYPES.contains(atomType)) {
      enterState(STATE_READING_ATOM_HEADER);
      containerAtoms.add(new ContainerAtom(atomType));
      containerAtomEndPoints.add(rootAtomBytesRead + atomSize - ATOM_HEADER_SIZE);
    } else {
      atomData = new ParsableByteArray(atomSize);
      System.arraycopy(atomHeader.data, 0, atomData.data, 0, ATOM_HEADER_SIZE);
      enterState(STATE_READING_ATOM_PAYLOAD);
    }
  } else {
    atomData = null;
    enterState(STATE_READING_ATOM_PAYLOAD);
  }

  return 0;
}
项目:edx-app-android    文件:FragmentedMp4Extractor.java   
private static void parseMoof(Track track, DefaultSampleValues extendsDefaults,
    ContainerAtom moof, TrackFragment out, int workaroundFlags, byte[] extendedTypeScratch) {
  parseTraf(track, extendsDefaults, moof.getContainerAtomOfType(Atom.TYPE_traf),
      out, workaroundFlags, extendedTypeScratch);
}