Search in sources :

Example 11 with ContainerAtom

use of com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom in project edx-app-android by edx.

the class FragmentedMp4Extractor method onMoovContainerAtomRead.

private void onMoovContainerAtomRead(ContainerAtom moov) {
    List<Atom> moovChildren = moov.children;
    int moovChildrenSize = moovChildren.size();
    for (int i = 0; i < moovChildrenSize; i++) {
        Atom child = moovChildren.get(i);
        if (child.type == Atom.TYPE_pssh) {
            ParsableByteArray psshAtom = ((LeafAtom) child).data;
            psshAtom.setPosition(FULL_ATOM_HEADER_SIZE);
            UUID uuid = new UUID(psshAtom.readLong(), psshAtom.readLong());
            int dataSize = psshAtom.readInt();
            byte[] data = new byte[dataSize];
            psshAtom.readBytes(data, 0, dataSize);
            psshData.put(uuid, data);
        }
    }
    ContainerAtom mvex = moov.getContainerAtomOfType(Atom.TYPE_mvex);
    extendsDefaults = parseTrex(mvex.getLeafAtomOfType(Atom.TYPE_trex).data);
    track = parseTrak(moov.getContainerAtomOfType(Atom.TYPE_trak));
}
Also used : ContainerAtom(com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom) UUID(java.util.UUID) LeafAtom(com.google.android.exoplayer.parser.mp4.Atom.LeafAtom) ContainerAtom(com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom) SuppressLint(android.annotation.SuppressLint) LeafAtom(com.google.android.exoplayer.parser.mp4.Atom.LeafAtom)

Example 12 with ContainerAtom

use of com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom in project edx-app-android by edx.

the class FragmentedMp4Extractor method parseTrak.

/**
 * 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);
}
Also used : MediaFormat(com.google.android.exoplayer.MediaFormat) ContainerAtom(com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom) SuppressLint(android.annotation.SuppressLint)

Example 13 with ContainerAtom

use of com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom in project edx-app-android by edx.

the class FragmentedMp4Extractor method readAtomHeader.

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;
}
Also used : ContainerAtom(com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom) SuppressLint(android.annotation.SuppressLint)

Example 14 with ContainerAtom

use of com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom in project ExoPlayer by google.

the class FragmentedMp4Extractor method onMoovContainerAtomRead.

private void onMoovContainerAtomRead(ContainerAtom moov) throws ParserException {
    checkState(sideloadedTrack == null, "Unexpected moov box.");
    @Nullable DrmInitData drmInitData = getDrmInitDataFromAtoms(moov.leafChildren);
    // Read declaration of track fragments in the moov box.
    ContainerAtom mvex = checkNotNull(moov.getContainerAtomOfType(Atom.TYPE_mvex));
    SparseArray<DefaultSampleValues> defaultSampleValuesArray = new SparseArray<>();
    long duration = C.TIME_UNSET;
    int mvexChildrenSize = mvex.leafChildren.size();
    for (int i = 0; i < mvexChildrenSize; i++) {
        Atom.LeafAtom atom = mvex.leafChildren.get(i);
        if (atom.type == Atom.TYPE_trex) {
            Pair<Integer, DefaultSampleValues> trexData = parseTrex(atom.data);
            defaultSampleValuesArray.put(trexData.first, trexData.second);
        } else if (atom.type == Atom.TYPE_mehd) {
            duration = parseMehd(atom.data);
        }
    }
    // Construction of tracks and sample tables.
    List<TrackSampleTable> sampleTables = parseTraks(moov, new GaplessInfoHolder(), duration, drmInitData, /* ignoreEditLists= */
    (flags & FLAG_WORKAROUND_IGNORE_EDIT_LISTS) != 0, /* isQuickTime= */
    false, this::modifyTrack);
    int trackCount = sampleTables.size();
    if (trackBundles.size() == 0) {
        // We need to create the track bundles.
        for (int i = 0; i < trackCount; i++) {
            TrackSampleTable sampleTable = sampleTables.get(i);
            Track track = sampleTable.track;
            TrackBundle trackBundle = new TrackBundle(extractorOutput.track(i, track.type), sampleTable, getDefaultSampleValues(defaultSampleValuesArray, track.id));
            trackBundles.put(track.id, trackBundle);
            durationUs = max(durationUs, track.durationUs);
        }
        extractorOutput.endTracks();
    } else {
        checkState(trackBundles.size() == trackCount);
        for (int i = 0; i < trackCount; i++) {
            TrackSampleTable sampleTable = sampleTables.get(i);
            Track track = sampleTable.track;
            trackBundles.get(track.id).reset(sampleTable, getDefaultSampleValues(defaultSampleValuesArray, track.id));
        }
    }
}
Also used : ContainerAtom(com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom) LeafAtom(com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom) ContainerAtom(com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom) LeafAtom(com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom) SparseArray(android.util.SparseArray) DrmInitData(com.google.android.exoplayer2.drm.DrmInitData) GaplessInfoHolder(com.google.android.exoplayer2.extractor.GaplessInfoHolder) Nullable(androidx.annotation.Nullable)

Aggregations

LeafAtom (com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom)6 Nullable (androidx.annotation.Nullable)5 ContainerAtom (com.google.android.exoplayer2.extractor.mp4.Atom.ContainerAtom)5 ParsableByteArray (com.google.android.exoplayer2.util.ParsableByteArray)5 SuppressLint (android.annotation.SuppressLint)3 ContainerAtom (com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom)3 DrmInitData (com.google.android.exoplayer2.drm.DrmInitData)2 GaplessInfoHolder (com.google.android.exoplayer2.extractor.GaplessInfoHolder)2 SeekPoint (com.google.android.exoplayer2.extractor.SeekPoint)2 SparseArray (android.util.SparseArray)1 MediaFormat (com.google.android.exoplayer.MediaFormat)1 LeafAtom (com.google.android.exoplayer.parser.mp4.Atom.LeafAtom)1 Format (com.google.android.exoplayer2.Format)1 ExtractorOutput (com.google.android.exoplayer2.extractor.ExtractorOutput)1 SeekMap (com.google.android.exoplayer2.extractor.SeekMap)1 Metadata (com.google.android.exoplayer2.metadata.Metadata)1 MotionPhotoMetadata (com.google.android.exoplayer2.metadata.mp4.MotionPhotoMetadata)1 ArrayList (java.util.ArrayList)1 UUID (java.util.UUID)1