[libbluray-devel] Parse Binding Unit Manifest file

hpi1 git at videolan.org
Tue Nov 18 12:51:32 CET 2014


libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Mon Nov 17 15:16:28 2014 +0200| [36fdd94601b85b4ff904180dcac8003edb4085db] | committer: hpi1

Parse Binding Unit Manifest file

> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=36fdd94601b85b4ff904180dcac8003edb4085db
---

 .../bdj/java/org/bluray/vfs/VFSManager.java        |   29 +++-
 src/libbluray/bdj/java/org/videolan/BUMFAsset.java |   38 +++++
 .../bdj/java/org/videolan/BUMFParser.java          |  169 ++++++++++++++++++++
 3 files changed, 229 insertions(+), 7 deletions(-)

diff --git a/src/libbluray/bdj/java/org/bluray/vfs/VFSManager.java b/src/libbluray/bdj/java/org/bluray/vfs/VFSManager.java
index 2550eaa..66ac4e8 100644
--- a/src/libbluray/bdj/java/org/bluray/vfs/VFSManager.java
+++ b/src/libbluray/bdj/java/org/bluray/vfs/VFSManager.java
@@ -1,6 +1,7 @@
 /*
  * This file is part of libbluray
  * Copyright (C) 2010  William Hahne
+ * Copyright (C) 2014  Petri Hintukainen <phintuka at users.sourceforge.net>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -19,21 +20,27 @@
 
 package org.bluray.vfs;
 
+import org.videolan.BUMFAsset;
+import org.videolan.BUMFParser;
 import org.videolan.Logger;
 
 public class VFSManager {
+
+    private static VFSManager instance = null;
+
     public static VFSManager getInstance() throws SecurityException,
             UnsupportedOperationException
     {
-        logger.unimplemented("getInstance");
-        return new VFSManager();
-        //throw new UnsupportedOperationException();
+        if (instance == null) {
+            instance = new VFSManager();
+        }
+
+        return instance;
     }
 
     protected VFSManager()
     {
-        state = PREPARING;
-        logger.unimplemented("VFSManager");
+        state = STABLE;
     }
 
     public boolean disableClip(String streamfile)
@@ -56,8 +63,7 @@ public class VFSManager {
 
     public int getState()
     {
-        logger.unimplemented("getState");
-        return STABLE;
+        return state;
     }
 
     public boolean isEnabledClip(String clipID)
@@ -69,7 +75,16 @@ public class VFSManager {
     public void requestUpdating(String manifestfile, String signaturefile,
             boolean initBackupRegs) throws PreparingFailedException
     {
+        state = PREPARING;
+
+        BUMFAsset[] assets = BUMFParser.parse(manifestfile);
+        if (assets == null) {
+            state = STABLE;
+            throw new PreparingFailedException();
+        }
+
         logger.unimplemented("requestUpdating(" + manifestfile + ")");
+        state = STABLE;
         throw new PreparingFailedException();
     }
 
diff --git a/src/libbluray/bdj/java/org/videolan/BUMFAsset.java b/src/libbluray/bdj/java/org/videolan/BUMFAsset.java
new file mode 100644
index 0000000..b3c4b78
--- /dev/null
+++ b/src/libbluray/bdj/java/org/videolan/BUMFAsset.java
@@ -0,0 +1,38 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014  Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+package org.videolan;
+
+public class BUMFAsset {
+    public BUMFAsset(String vpFile, String budaFile) {
+        this.vpFile   = vpFile;
+        this.budaFile = budaFile;
+    }
+
+    String getVpFile() {
+        return vpFile;
+    }
+
+    String getBudaFile() {
+        return budaFile;
+    }
+
+    private String vpFile;
+    private String budaFile;
+}
diff --git a/src/libbluray/bdj/java/org/videolan/BUMFParser.java b/src/libbluray/bdj/java/org/videolan/BUMFParser.java
new file mode 100644
index 0000000..be53f91
--- /dev/null
+++ b/src/libbluray/bdj/java/org/videolan/BUMFParser.java
@@ -0,0 +1,169 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2014  Petri Hintukainen <phintuka at users.sourceforge.net>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see
+ * <http://www.gnu.org/licenses/>.
+ */
+
+package org.videolan;
+
+import java.io.FileInputStream;
+import java.util.LinkedList;
+
+import javax.xml.parsers.SAXParser;
+import javax.xml.parsers.SAXParserFactory;
+import org.xml.sax.Attributes;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
+
+public class BUMFParser extends DefaultHandler {
+
+    public static BUMFAsset[] parse(String manifestFile) {
+        try {
+            return new BUMFParser(manifestFile).getAssets();
+        } catch (Exception e) {
+        }
+        return null;
+    }
+
+    /*
+     *
+     */
+
+    private BUMFAsset[] getAssets() {
+        return (BUMFAsset[])assets.toArray(new BUMFAsset[assets.size()]);
+    }
+
+    private BUMFParser(String manifestFile) throws Exception {
+
+        FileInputStream stream = null;
+        try {
+            stream = new FileInputStream(manifestFile);
+            SAXParser parser = SAXParserFactory.newInstance().newSAXParser();
+            parser.parse(stream, this);
+        } catch (Exception e) {
+            logger.error("Binding unit manifest file parsing failed: " + e);
+            throw e;
+        } finally {
+            if (stream != null) {
+                try {
+                    stream.close();
+                } catch (Exception e) {
+                }
+            }
+        }
+    }
+
+    private LinkedList assets = new LinkedList();
+
+    /*
+     *
+     */
+
+    public void startElement (String uri, String localName, String qName, Attributes attributes)
+        throws SAXException {
+
+        if (qName.equalsIgnoreCase("bumf:manifest")) {
+            inBudaFile = true;
+            return;
+        }
+
+        if (!inBudaFile) {
+            logger.error("invalid start element: " + qName);
+            throw new SAXException("element not supported");
+        }
+
+        if (qName.equalsIgnoreCase("Assets")) {
+            inDocument = true;
+            return;
+        }
+
+        if (!inDocument) {
+            logger.error("unknown element: " + qName + " (expected Assets)");
+            throw new SAXException("element not supported");
+        }
+
+        if (qName.equalsIgnoreCase("Asset")) {
+            vpFile = null;
+            budaFile = null;
+            element = ELEMENT_ASSET;
+        } else if (qName.equalsIgnoreCase("BUDAFile")) {
+            element = ELEMENT_BUDA_FILE;
+        } else {
+            logger.error("unknown element: " + qName);
+            throw new SAXException("element not supported");
+        }
+
+        if (element == ELEMENT_ASSET) {
+            for (int i = 0; i < attributes.getLength(); i++) {
+                String attrName = attributes.getQName(i);
+                if (attrName.equals("VPFilename")) {
+                    vpFile = attributes.getValue(i);
+                } else {
+                    logger.error("unknown VPFilename attribute: " + attrName);
+                    throw new SAXException("invalid attribute name: " + attrName);
+                }
+            }
+        } else if (element == ELEMENT_BUDA_FILE) {
+            for (int i = 0; i < attributes.getLength(); i++) {
+                String attrName = attributes.getQName(i);
+                if (attrName.equals("name")) {
+                    budaFile = attributes.getValue(i);
+                } else {
+                    logger.error("unknown BUDAFile attribute: " + attrName);
+                    throw new SAXException("invalid attribute name: " + attrName);
+                }
+            }
+        }
+    }
+
+    public void endElement (String uri, String localName, String qName)
+        throws SAXException {
+
+        if (qName.equalsIgnoreCase("Assets")) {
+            inDocument = false;
+            return;
+        }
+
+        if (inDocument) {
+            if (qName.equalsIgnoreCase("Asset")) {
+                logger.info("Asset: " + vpFile + " <- " + budaFile);
+                if (vpFile != null && budaFile != null) {
+                    assets.add(new BUMFAsset(vpFile, budaFile));
+                }
+                vpFile = null;
+                budaFile = null;
+            }
+        }
+        element = ELEMENT_NONE;
+    }
+
+    private static final int ELEMENT_NONE = 0;
+    private static final int ELEMENT_ASSET = 1;
+    private static final int ELEMENT_BUDA_FILE = 2;
+
+    private boolean inBudaFile = false;
+    private boolean inDocument = false;
+    private int element = ELEMENT_NONE;
+
+    private String vpFile = null;
+    private String budaFile = null;
+
+    private static final Logger logger = Logger.getLogger(BUMFParser.class.getName());
+}
+
+
+
+



More information about the libbluray-devel mailing list