Search in sources :

Example 1 with Mp4StcoBox

use of org.jaudiotagger.audio.mp4.atom.Mp4StcoBox in project MusicDNA by harjot-oberai.

the class Mp4AtomTree method buildChildrenOfNode.

/**
     *
     * @param moovBuffer
     * @param parentNode
     * @throws IOException
     * @throws CannotReadException
     */
public void buildChildrenOfNode(ByteBuffer moovBuffer, DefaultMutableTreeNode parentNode) throws IOException, CannotReadException {
    Mp4BoxHeader boxHeader;
    //Preprocessing for nodes that contain data before their children atoms
    Mp4BoxHeader parentBoxHeader = (Mp4BoxHeader) parentNode.getUserObject();
    //We set the buffers position back to this after processing the children
    int justAfterHeaderPos = moovBuffer.position();
    //Preprocessing for meta that normally contains 4 data bytes, but doesn'timer where found under track or tags atom
    if (parentBoxHeader.getId().equals(Mp4AtomIdentifier.META.getFieldName())) {
        Mp4MetaBox meta = new Mp4MetaBox(parentBoxHeader, moovBuffer);
        meta.processData();
        try {
            boxHeader = new Mp4BoxHeader(moovBuffer);
        } catch (NullBoxIdException nbe) {
            //It might be that the meta box didn'timer actually have any additional data after it so we adjust the buffer
            //to be immediately after metabox and code can retry
            moovBuffer.position(moovBuffer.position() - Mp4MetaBox.FLAGS_LENGTH);
        } finally {
            //Skip back last header cos this was only a test 
            moovBuffer.position(moovBuffer.position() - Mp4BoxHeader.HEADER_LENGTH);
        }
    }
    //Defines where to start looking for the first child node
    int startPos = moovBuffer.position();
    while (moovBuffer.position() < ((startPos + parentBoxHeader.getDataLength()) - Mp4BoxHeader.HEADER_LENGTH)) {
        boxHeader = new Mp4BoxHeader(moovBuffer);
        if (boxHeader != null) {
            boxHeader.setFilePos(moovHeader.getFilePos() + moovBuffer.position());
            logger.finest("Atom " + boxHeader.getId() + " @ " + boxHeader.getFilePos() + " of size:" + boxHeader.getLength() + " ,ends @ " + (boxHeader.getFilePos() + boxHeader.getLength()));
            DefaultMutableTreeNode newAtom = new DefaultMutableTreeNode(boxHeader);
            parentNode.add(newAtom);
            if (boxHeader.getId().equals(Mp4AtomIdentifier.UDTA.getFieldName())) {
                udtaNode = newAtom;
            } else //only interested in metaNode that is child of udta node
            if (boxHeader.getId().equals(Mp4AtomIdentifier.META.getFieldName()) && parentBoxHeader.getId().equals(Mp4AtomIdentifier.UDTA.getFieldName())) {
                metaNode = newAtom;
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.HDLR.getFieldName()) && parentBoxHeader.getId().equals(Mp4AtomIdentifier.META.getFieldName())) {
                hdlrWithinMetaNode = newAtom;
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.HDLR.getFieldName())) {
                hdlrWithinMdiaNode = newAtom;
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.TAGS.getFieldName())) {
                tagsNode = newAtom;
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.STCO.getFieldName())) {
                if (stco == null) {
                    stco = new Mp4StcoBox(boxHeader, moovBuffer);
                    stcoNode = newAtom;
                }
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.ILST.getFieldName())) {
                DefaultMutableTreeNode parent = (DefaultMutableTreeNode) parentNode.getParent();
                if (parent != null) {
                    Mp4BoxHeader parentsParent = (Mp4BoxHeader) (parent).getUserObject();
                    if (parentsParent != null) {
                        if (parentBoxHeader.getId().equals(Mp4AtomIdentifier.META.getFieldName()) && parentsParent.getId().equals(Mp4AtomIdentifier.UDTA.getFieldName())) {
                            ilstNode = newAtom;
                        }
                    }
                }
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.FREE.getFieldName())) {
                //Might be multiple in different locations
                freeNodes.add(newAtom);
            } else if (boxHeader.getId().equals(Mp4AtomIdentifier.TRAK.getFieldName())) {
                //Might be multiple in different locations, although only one should be audio track
                trakNodes.add(newAtom);
            }
            //For these atoms iterate down to build their children
            if ((boxHeader.getId().equals(Mp4AtomIdentifier.TRAK.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.MDIA.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.MINF.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.STBL.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.UDTA.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.META.getFieldName())) || (boxHeader.getId().equals(Mp4AtomIdentifier.ILST.getFieldName()))) {
                buildChildrenOfNode(moovBuffer, newAtom);
            }
            //Now  adjust buffer for the next atom header at this level
            moovBuffer.position(moovBuffer.position() + boxHeader.getDataLength());
        }
    }
    moovBuffer.position(justAfterHeaderPos);
}
Also used : Mp4BoxHeader(org.jaudiotagger.audio.mp4.atom.Mp4BoxHeader) DefaultMutableTreeNode(org.jaudiotagger.utils.tree.DefaultMutableTreeNode) Mp4MetaBox(org.jaudiotagger.audio.mp4.atom.Mp4MetaBox) NullBoxIdException(org.jaudiotagger.audio.exceptions.NullBoxIdException) Mp4StcoBox(org.jaudiotagger.audio.mp4.atom.Mp4StcoBox)

Aggregations

NullBoxIdException (org.jaudiotagger.audio.exceptions.NullBoxIdException)1 Mp4BoxHeader (org.jaudiotagger.audio.mp4.atom.Mp4BoxHeader)1 Mp4MetaBox (org.jaudiotagger.audio.mp4.atom.Mp4MetaBox)1 Mp4StcoBox (org.jaudiotagger.audio.mp4.atom.Mp4StcoBox)1 DefaultMutableTreeNode (org.jaudiotagger.utils.tree.DefaultMutableTreeNode)1