Search in sources :

Example 6 with LeafAtom

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

the class FragmentedMp4Extractor method parseTruns.

private static void parseTruns(ContainerAtom traf, TrackBundle trackBundle, @Flags int flags) throws ParserException {
    int trunCount = 0;
    int totalSampleCount = 0;
    List<LeafAtom> leafChildren = traf.leafChildren;
    int leafChildrenSize = leafChildren.size();
    for (int i = 0; i < leafChildrenSize; i++) {
        LeafAtom atom = leafChildren.get(i);
        if (atom.type == Atom.TYPE_trun) {
            ParsableByteArray trunData = atom.data;
            trunData.setPosition(Atom.FULL_HEADER_SIZE);
            int trunSampleCount = trunData.readUnsignedIntToInt();
            if (trunSampleCount > 0) {
                totalSampleCount += trunSampleCount;
                trunCount++;
            }
        }
    }
    trackBundle.currentTrackRunIndex = 0;
    trackBundle.currentSampleInTrackRun = 0;
    trackBundle.currentSampleIndex = 0;
    trackBundle.fragment.initTables(trunCount, totalSampleCount);
    int trunIndex = 0;
    int trunStartPosition = 0;
    for (int i = 0; i < leafChildrenSize; i++) {
        LeafAtom trun = leafChildren.get(i);
        if (trun.type == Atom.TYPE_trun) {
            trunStartPosition = parseTrun(trackBundle, trunIndex++, flags, trun.data, trunStartPosition);
        }
    }
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) LeafAtom(com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom)

Example 7 with LeafAtom

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

the class FragmentedMp4Extractor method parseSampleGroups.

private static void parseSampleGroups(ContainerAtom traf, @Nullable String schemeType, TrackFragment out) throws ParserException {
    // Find sbgp and sgpd boxes with grouping_type == seig.
    @Nullable ParsableByteArray sbgp = null;
    @Nullable ParsableByteArray sgpd = null;
    for (int i = 0; i < traf.leafChildren.size(); i++) {
        LeafAtom leafAtom = traf.leafChildren.get(i);
        ParsableByteArray leafAtomData = leafAtom.data;
        if (leafAtom.type == Atom.TYPE_sbgp) {
            leafAtomData.setPosition(Atom.FULL_HEADER_SIZE);
            if (leafAtomData.readInt() == SAMPLE_GROUP_TYPE_seig) {
                sbgp = leafAtomData;
            }
        } else if (leafAtom.type == Atom.TYPE_sgpd) {
            leafAtomData.setPosition(Atom.FULL_HEADER_SIZE);
            if (leafAtomData.readInt() == SAMPLE_GROUP_TYPE_seig) {
                sgpd = leafAtomData;
            }
        }
    }
    if (sbgp == null || sgpd == null) {
        return;
    }
    sbgp.setPosition(Atom.HEADER_SIZE);
    int sbgpVersion = Atom.parseFullAtomVersion(sbgp.readInt());
    // grouping_type == seig.
    sbgp.skipBytes(4);
    if (sbgpVersion == 1) {
        // grouping_type_parameter.
        sbgp.skipBytes(4);
    }
    if (sbgp.readInt() != 1) {
        // entry_count.
        throw ParserException.createForUnsupportedContainerFeature("Entry count in sbgp != 1 (unsupported).");
    }
    sgpd.setPosition(Atom.HEADER_SIZE);
    int sgpdVersion = Atom.parseFullAtomVersion(sgpd.readInt());
    // grouping_type == seig.
    sgpd.skipBytes(4);
    if (sgpdVersion == 1) {
        if (sgpd.readUnsignedInt() == 0) {
            throw ParserException.createForUnsupportedContainerFeature("Variable length description in sgpd found (unsupported)");
        }
    } else if (sgpdVersion >= 2) {
        // default_sample_description_index.
        sgpd.skipBytes(4);
    }
    if (sgpd.readUnsignedInt() != 1) {
        // entry_count.
        throw ParserException.createForUnsupportedContainerFeature("Entry count in sgpd != 1 (unsupported).");
    }
    // CencSampleEncryptionInformationGroupEntry
    // reserved = 0.
    sgpd.skipBytes(1);
    int patternByte = sgpd.readUnsignedByte();
    int cryptByteBlock = (patternByte & 0xF0) >> 4;
    int skipByteBlock = patternByte & 0x0F;
    boolean isProtected = sgpd.readUnsignedByte() == 1;
    if (!isProtected) {
        return;
    }
    int perSampleIvSize = sgpd.readUnsignedByte();
    byte[] keyId = new byte[16];
    sgpd.readBytes(keyId, 0, keyId.length);
    @Nullable byte[] constantIv = null;
    if (perSampleIvSize == 0) {
        int constantIvSize = sgpd.readUnsignedByte();
        constantIv = new byte[constantIvSize];
        sgpd.readBytes(constantIv, 0, constantIvSize);
    }
    out.definesEncryptionData = true;
    out.trackEncryptionBox = new TrackEncryptionBox(isProtected, schemeType, perSampleIvSize, keyId, cryptByteBlock, skipByteBlock, constantIv);
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) Nullable(androidx.annotation.Nullable) LeafAtom(com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom)

Example 8 with LeafAtom

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

the class FragmentedMp4Extractor method readAtomPayload.

private void readAtomPayload(ExtractorInput input) throws IOException {
    int atomPayloadSize = (int) atomSize - atomHeaderBytesRead;
    @Nullable ParsableByteArray atomData = this.atomData;
    if (atomData != null) {
        input.readFully(atomData.getData(), Atom.HEADER_SIZE, atomPayloadSize);
        onLeafAtomRead(new LeafAtom(atomType, atomData), input.getPosition());
    } else {
        input.skipFully(atomPayloadSize);
    }
    processAtomEnded(input.getPosition());
}
Also used : ParsableByteArray(com.google.android.exoplayer2.util.ParsableByteArray) Nullable(androidx.annotation.Nullable) LeafAtom(com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom)

Example 9 with LeafAtom

use of com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom 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 10 with LeafAtom

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

the class FragmentedMp4Extractor method readAtomPayload.

private int readAtomPayload(NonBlockingInputStream inputStream) {
    int bytesRead;
    if (atomData != null) {
        bytesRead = inputStream.read(atomData.data, atomBytesRead, atomSize - atomBytesRead);
    } else {
        bytesRead = inputStream.skip(atomSize - atomBytesRead);
    }
    if (bytesRead == -1) {
        return RESULT_END_OF_STREAM;
    }
    rootAtomBytesRead += bytesRead;
    atomBytesRead += bytesRead;
    if (atomBytesRead != atomSize) {
        return RESULT_NEED_MORE_DATA;
    }
    int results = 0;
    if (atomData != null) {
        results |= onLeafAtomRead(new LeafAtom(atomType, atomData));
    }
    while (!containerAtomEndPoints.isEmpty() && containerAtomEndPoints.peek() == rootAtomBytesRead) {
        containerAtomEndPoints.pop();
        results |= onContainerAtomRead(containerAtoms.pop());
    }
    enterState(STATE_READING_ATOM_HEADER);
    return results;
}
Also used : SuppressLint(android.annotation.SuppressLint) LeafAtom(com.google.android.exoplayer.parser.mp4.Atom.LeafAtom)

Aggregations

LeafAtom (com.google.android.exoplayer2.extractor.mp4.Atom.LeafAtom)7 Nullable (androidx.annotation.Nullable)4 ParsableByteArray (com.google.android.exoplayer2.util.ParsableByteArray)4 LeafAtom (com.google.android.exoplayer.parser.mp4.Atom.LeafAtom)3 SuppressLint (android.annotation.SuppressLint)2 UUID (java.util.UUID)2 ContainerAtom (com.google.android.exoplayer.parser.mp4.Atom.ContainerAtom)1 DrmInitData (com.google.android.exoplayer2.drm.DrmInitData)1 SchemeData (com.google.android.exoplayer2.drm.DrmInitData.SchemeData)1