[libbluray-devel] [Git][videolan/libbluray][master] 12 commits: index.bdmv: parse UHD extension data 3.1
Petri Hintukainen
gitlab at videolan.org
Fri Jan 18 22:43:58 CET 2019
Petri Hintukainen pushed to branch master at VideoLAN / libbluray
Commits:
4be68cdf by hpi1 at 2019-01-04T18:49:06Z
index.bdmv: parse UHD extension data 3.1
- - - - -
c9da2197 by hpi1 at 2019-01-12T20:41:13Z
Add const
- - - - -
41642e77 by hpi1 at 2019-01-15T10:02:39Z
havi: use S3D/UHD configuration templates when running as profile 5 or 6 player
- - - - -
2be17860 by hpi1 at 2019-01-15T10:30:22Z
Change disc_info init order
- - - - -
3c455ce4 by hpi1 at 2019-01-15T10:34:04Z
Remove unneeded variable
- - - - -
bdcd1116 by hpi1 at 2019-01-17T09:39:06Z
Use enum for BD-J check result
- - - - -
37bc53f4 by hpi1 at 2019-01-17T09:39:06Z
sound_parse: use bdmv_parse_header() and check for EOF
- - - - -
46ea4e66 by hpi1 at 2019-01-18T15:50:23Z
configure: Test for ant only when building jar file
- - - - -
3af11f0a by hpi1 at 2019-01-18T15:50:40Z
BD-J: Add dummy classes to allow building with Java 9+ and Java < 9
- - - - -
b1e45cbf by hpi1 at 2019-01-18T15:52:16Z
BDFramePeer: Fix Java 9+ compatibility
- - - - -
221749ee by hpi1 at 2019-01-18T15:56:48Z
BD-J: parametrize java language and binary code versions
- - - - -
37bac2f7 by hpi1 at 2019-01-18T16:16:10Z
configure: try to autodetect Java 9+
- - - - -
18 changed files:
- ChangeLog
- Makefile.am
- configure.ac
- src/libbluray/bdj/bdj.c
- src/libbluray/bdj/bdj.h
- src/libbluray/bdj/build.xml
- + src/libbluray/bdj/java-build-support/java/awt/event/FocusEvent.java
- + src/libbluray/bdj/java-build-support/sun/awt/CausedFocusEvent.java
- src/libbluray/bdj/java-j2se/java/awt/peer/BDFramePeer.java
- src/libbluray/bdj/java/org/havi/ui/HBackgroundDevice.java
- src/libbluray/bdj/java/org/havi/ui/HGraphicsDevice.java
- src/libbluray/bdj/java/org/havi/ui/HScreenDevice.java
- src/libbluray/bdj/java/org/havi/ui/HVideoDevice.java
- src/libbluray/bdnav/index_parse.c
- src/libbluray/bdnav/index_parse.h
- src/libbluray/bdnav/navigation.c
- src/libbluray/bdnav/sound_parse.c
- src/libbluray/bluray.c
Changes:
=====================================
ChangeLog
=====================================
@@ -1,3 +1,5 @@
+- Add support for compiling .jar file with Java 9+ compiler.
+
2017-12-01: Version 1.0.2
- Add initial support for UHD BluRay discs (without BD-J menus).
- Detect JRE (from the Java Applet plugin) on MacOS.
=====================================
Makefile.am
=====================================
@@ -226,6 +226,18 @@ pkginclude_HEADERS = \
if USING_BDJAVA_BUILD_JAR
+if USING_JAVAC_9
+java_versions = -Djava_version_asm=1.6 -Djava_version_bdj=1.6
+else
+java_versions = -Djava_version_asm=1.5 -Djava_version_bdj=1.4
+endif
+
+if BDJ_J2SE
+awt_src = java-$(BDJ_TYPE):java-build-support
+else
+awt_src = java-$(BDJ_TYPE)
+endif
+
jardir=$(datadir)/java/
jar_DATA = \
$(top_builddir)/.libs/libbluray-$(BDJ_TYPE)-$(VERSION).jar \
@@ -237,7 +249,8 @@ all-local:
ant -f $(top_srcdir)/src/libbluray/bdj/build.xml \
-Dbuild='$(abs_builddir)/src/libbluray/bdj/build' \
-Ddist='$(abs_builddir)/.libs' \
- -Dsrc_awt=:java-$(BDJ_TYPE) \
+ -Dsrc_awt=:$(awt_src) \
+ $(java_versions) \
-Dbootclasspath="$(BDJ_BOOTCLASSPATH)" \
-Dversion='$(BDJ_TYPE)-$(VERSION)'
=====================================
configure.ac
=====================================
@@ -112,6 +112,9 @@ AC_ARG_WITH([bdj-bootclasspath],
[BDJ_BOOTCLASSPATH=$withval],
[BDJ_BOOTCLASSPATH=])
+AC_ARG_WITH([java9],
+ [AS_HELP_STRING([--with-java9], [build with Java 9+ (drop support for Java <1.6) @<:@default=without@:>@])])
+
dnl required programs
AC_PROG_CC
AM_PROG_CC_C_O
@@ -228,14 +231,35 @@ AS_IF([test "x${JDK_HOME}" != "x"], [
BDJAVA_CFLAGS='-I${abs_top_srcdir}/jni -I${abs_top_srcdir}/jni/'"${java_os}"
])
-AC_CHECK_PROG(HAVE_ANT, [ant], yes, no)
-if test "x$use_bdjava_jar" = "xyes" && test "x$HAVE_ANT" = "xno"; then
- AC_MSG_ERROR([BD-J requires ANT, but ant was not found. Please install it.])
-fi
+AS_IF([test "x$use_bdjava_jar" = "xyes"], [
+
+ dnl check for ant
+ AC_CHECK_PROG(HAVE_ANT, [ant], yes, no)
+ AS_IF([test "x$HAVE_ANT" = "xno"], [
+ AC_MSG_ERROR([BD-J requires ANT, but ant was not found. Install ant or disable jar file building (--disable-bdjava-jar)])
+ ])
+
+ AS_IF([test "x$with_java9" = "x" -a "$BDJ_TYPE" != "j2me"], [
+
+ dnl check for javac
+ AS_IF([test "x${JAVA_HOME}" != "x"],
+ [AC_PATH_PROG(JAVAC, javac, none, ["${JAVA_HOME}/bin"])],
+ [AC_PATH_PROG(JAVAC, javac, none)])
+ AS_IF([test x"$JAVAC" = x"none"],
+ [AC_MSG_WARN([javac not found. Disable jar file building (--disable-bdjava-jar), set JAVA_HOME or javac type with --with[out]-java9 option.])])
+
+ dnl check for Java 9+
+ javac_version=`"$JAVAC" -version 2>&1 | head -n 1`
+ [with_java9=`echo "$javac_version" | grep -E -q '^javac\ (9|1[0-9])' && echo yes`]
+ ])
+
+ AS_IF([test "x$with_java9" = "xyes" -a "$BDJ_TYPE" != "j2me"], [java_code_version=1.6], [java_code_version=1.4])
+])
AC_DEFINE_UNQUOTED([JAVA_ARCH], ["$java_arch"], ["Defines the architecture of the java vm."])
AC_DEFINE_UNQUOTED([JDK_HOME], ["$JDK_HOME"], [""])
AM_CONDITIONAL([USING_BDJAVA_BUILD_JAR], [ test $use_bdjava_jar = "yes" ])
+AM_CONDITIONAL([USING_JAVAC_9], [ test x"$with_java9" = x"yes" ])
dnl BD-J type
if test "$BDJ_TYPE" = "j2me"; then
@@ -244,6 +268,7 @@ else
BDJ_TYPE=j2se
fi
AC_SUBST(BDJ_TYPE)
+AM_CONDITIONAL([BDJ_J2SE], [ test x"$BDJ_TYPE" != x"j2me" ])
dnl bootclasspath
AC_SUBST(BDJ_BOOTCLASSPATH)
@@ -286,6 +311,12 @@ echo " Summary:"
echo " --------"
echo " BD-J type: $BDJ_TYPE"
echo " build JAR: $use_bdjava_jar"
+if test "x$use_bdjava_jar" = "xyes"; then
+if test "x$javac_version" != "x"; then
+echo " javac version: $javac_version"
+fi
+echo " Java binary version: $java_code_version"
+fi
if test x"$BDJ_BOOTCLASSPATH" != x""; then
echo " BD-J bootclasspath: $BDJ_BOOTCLASSPATH"
fi
=====================================
src/libbluray/bdj/bdj.c
=====================================
@@ -1,7 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
- * Copyright (C) 2012 Petri Hintukainen <phintuka at users.sourceforge.net>
+ * Copyright (C) 2012-2019 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
@@ -743,18 +743,18 @@ int bdj_jvm_available(BDJ_STORAGE *storage)
void* jvm_lib = _load_jvm(&java_home);
if (!jvm_lib) {
BD_DEBUG(DBG_BDJ | DBG_CRIT, "BD-J check: Failed to load JVM library\n");
- return 0;
+ return BDJ_CHECK_NO_JVM;
}
dl_dlclose(jvm_lib);
if (!_find_libbluray_jar(storage)) {
BD_DEBUG(DBG_BDJ | DBG_CRIT, "BD-J check: Failed to load libbluray.jar\n");
- return 1;
+ return BDJ_CHECK_NO_JAR;
}
BD_DEBUG(DBG_BDJ, "BD-J check: OK\n");
- return 2;
+ return BDJ_CHECK_OK;
}
static int _find_jvm(void *jvm_lib, JNIEnv **env, JavaVM **jvm)
=====================================
src/libbluray/bdj/bdj.h
=====================================
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2012-2019 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
@@ -80,7 +81,13 @@ BD_PRIVATE BDJAVA* bdj_open(const char *path, struct bluray *bd,
BD_PRIVATE void bdj_close(BDJAVA *bdjava);
BD_PRIVATE int bdj_process_event(BDJAVA *bdjava, unsigned ev, unsigned param);
-BD_PRIVATE int bdj_jvm_available(BDJ_STORAGE *storage); /* 0: no. 1: only jvm. 2: jvm + libbluray.jar. */
+enum {
+ BDJ_CHECK_OK = 0,
+ BDJ_CHECK_NO_JVM = 1,
+ BDJ_CHECK_NO_JAR = 2,
+};
+
+BD_PRIVATE int bdj_jvm_available(BDJ_STORAGE *storage); /* rreturn: BDJ_CHECK_* */
BD_PRIVATE void bdj_storage_cleanup(BDJ_STORAGE *);
=====================================
src/libbluray/bdj/build.xml
=====================================
@@ -10,6 +10,8 @@
<property name="src_asm" value="../../../contrib/asm/src/"/>
<property name="bootclasspath" value=""/>
<property name="version" value=""/>
+ <property name="java_version_asm" value="1.5"/>
+ <property name="java_version_bdj" value="1.4"/>
<target name="init">
<tstamp/>
@@ -21,13 +23,13 @@
description="compile the source " >
<javac srcdir="${src_asm}" destdir="${build}" debug="yes"
bootclasspath="${bootclasspath}"
- source="1.5" target="1.5">
+ source="${java_version_asm}" target="${java_version_asm}">
<compilerarg value="-XDignore.symbol.file"/>
<compilerarg value="-Xlint:-deprecation"/>
</javac>
<javac srcdir="${src}${src_awt}" destdir="${build}" debug="yes"
bootclasspath="${bootclasspath}"
- source="1.4" target="1.4">
+ source="${java_version_bdj}" target="${java_version_bdj}">
<compilerarg value="-XDignore.symbol.file"/>
<compilerarg value="-Xlint:-deprecation"/>
</javac>
@@ -41,6 +43,9 @@
<jar jarfile="${dist}/libbluray-awt-${version}.jar" basedir="${build}">
<include name="java/awt/**" />
<include name="sun/**" />
+ <!-- following classes are used only at build time -->
+ <exclude name="sun/awt/CausedFocusEvent**" />
+ <exclude name="java/awt/event/FocusEvent**" />
</jar>
</target>
=====================================
src/libbluray/bdj/java-build-support/java/awt/event/FocusEvent.java
=====================================
@@ -0,0 +1,63 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2019 libbluray
+ *
+ * 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 java.awt.event;
+
+import java.awt.Component;
+
+public class FocusEvent extends ComponentEvent {
+
+ /*
+ * Dummy class used during compilation
+ *
+ * This class is used at compile time to hide Java 8 / Java 9 differences in
+ * java.awt.peer.*, java.awt.FocusEvent and sun.awt.CausedFocusEvent.
+ *
+ * This allows compiling special version of BDFramePeer
+ * that will work both in Java < 9 and Java > 9.
+ * Correct methods and dependencies are automatically selected at run time,
+ * thanks to Java on-demand linking.
+ *
+ * NOTE:
+ * This class is not complete and should not be included at runtime.
+ *
+ */
+
+ static {
+ if (System.getProperty("does_not_exist") == null)
+ throw new Error("This class should not be included at run time");
+ }
+
+ public class /* enum */ Cause {
+ }
+
+ /* Needed when compiling for HaVi */
+ public static final int FOCUS_FIRST = 1004;
+ public static final int FOCUS_LAST = 1005;
+ public static final int FOCUS_GAINED = FOCUS_FIRST;
+ public static final int FOCUS_LOST = 1 + FOCUS_FIRST;
+
+ public FocusEvent(Component src, int id, boolean t) {
+ super(src, id);
+ }
+
+ public FocusEvent(Component src, int id) {
+ super(src, id);
+ }
+}
=====================================
src/libbluray/bdj/java-build-support/sun/awt/CausedFocusEvent.java
=====================================
@@ -0,0 +1,53 @@
+/*
+ * This file is part of libbluray
+ * Copyright (C) 2019 libbluray
+ *
+ * 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 sun.awt;
+
+import java.awt.event.FocusEvent;
+import java.awt.Component;
+
+public class CausedFocusEvent extends FocusEvent {
+
+ /*
+ * Dummy class used during compilation
+ *
+ * This class is used at compile time to hide Java 8 / Java 9 differences in
+ * java.awt.peer.*, java.awt.FocusEvent and sun.awt.CausedFocusEvent.
+ *
+ * This allows compiling special version of BDFramePeer
+ * that will work both in Java < 9 and Java > 9.
+ * Correct methods and dependencies are automatically selected at run time,
+ * thanks to Java on-demand linking.
+ *
+ * NOTE:
+ * This class is not complete and should not be included at runtime.
+ *
+ */
+ static {
+ if (System.getProperty("does_not_exist") == null)
+ throw new Error("This class should not be included at run time");
+ }
+
+ public class /* enum */ Cause {
+ };
+
+ public CausedFocusEvent(Component src, int id) {
+ super(src, id);
+ }
+}
=====================================
src/libbluray/bdj/java-j2se/java/awt/peer/BDFramePeer.java
=====================================
@@ -1,6 +1,6 @@
/*
* This file is part of libbluray
- * Copyright (C) 2012 Petri Hintukainen <phintuka at users.sourceforge.net>
+ * Copyright (C) 2012-2019 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
@@ -173,7 +173,20 @@ public class BDFramePeer extends BDComponentPeer implements FramePeer
return ((BDToolkit)BDToolkit.getDefaultToolkit()).createImage((Component)null, width, height);
}
+ /* Java >= 9 */
+ public boolean requestFocus(Component c/*lightweightChild*/, boolean a/*temporary*/,
+ boolean b/*focusedWindowChangeAllowed*/, long l/*time*/,
+ java.awt.event.FocusEvent.Cause cause
+ ) {
+ return requestFocusHelper(c, a, b, l);
+ }
+
+ /* Java < 9 */
public boolean requestFocus(Component c, boolean a, boolean b, long l, sun.awt.CausedFocusEvent.Cause d) {
+ return requestFocusHelper(c, a, b, l);
+ }
+
+ private boolean requestFocusHelper(Component c, boolean a, boolean b, long l) {
if (c == null) {
return true;
}
=====================================
src/libbluray/bdj/java/org/havi/ui/HBackgroundDevice.java
=====================================
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2019 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,14 +20,26 @@
package org.havi.ui;
+import org.blurayx.s3d.ui.HBackgroundConfigTemplateS3D;
+import org.blurayx.uhd.ui.HBackgroundConfigurationTemplateUHD;
+
import java.awt.Color;
public class HBackgroundDevice extends HScreenDevice {
protected HBackgroundDevice() {
+ boolean is_p6 = isProfile6();
+ boolean is_p5 = isProfile5();
int length = HScreenConfigTemplate.defaultConfig.length;
hbcArray = new HBackgroundConfiguration[length];
for (int i = 0; i < length; i++) {
- HBackgroundConfigTemplate hbct = new HBackgroundConfigTemplate();
+ HBackgroundConfigTemplate hbct;
+ if (is_p6) {
+ hbct = new HBackgroundConfigurationTemplateUHD();
+ } else if (is_p5) {
+ hbct = new HBackgroundConfigTemplateS3D();
+ } else {
+ hbct = new HBackgroundConfigTemplate();
+ }
HScreenConfigTemplate.initDefaultConfigTemplate(hbct, i);
hbcArray[i] = new HStillImageBackgroundConfiguration(hbct, new Color(0, 0, 0, 0));
}
=====================================
src/libbluray/bdj/java/org/havi/ui/HGraphicsDevice.java
=====================================
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2019 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,6 +20,9 @@
package org.havi.ui;
+import org.blurayx.s3d.ui.HGraphicsConfigTemplateS3D;
+import org.blurayx.uhd.ui.HGraphicsConfigurationTemplateUHD;
+
import java.awt.Dimension;
import org.videolan.GUIManager;
@@ -26,10 +30,19 @@ import org.videolan.Logger;
public class HGraphicsDevice extends HScreenDevice {
protected HGraphicsDevice() {
+ boolean is_p6 = isProfile6();
+ boolean is_p5 = isProfile5();
int length = HScreenConfigTemplate.defaultConfig.length;
hgcArray = new HGraphicsConfiguration[length];
for (int i = 0; i < length; i++) {
- HGraphicsConfigTemplate hgct = new HGraphicsConfigTemplate();
+ HGraphicsConfigTemplate hgct;
+ if (is_p6) {
+ hgct = new HGraphicsConfigurationTemplateUHD();
+ } else if (is_p5) {
+ hgct = new HGraphicsConfigTemplateS3D();
+ } else {
+ hgct = new HGraphicsConfigTemplate();
+ }
HScreenConfigTemplate.initDefaultConfigTemplate(hgct, i);
hgcArray[i] = new HGraphicsConfiguration(hgct);
}
=====================================
src/libbluray/bdj/java/org/havi/ui/HScreenDevice.java
=====================================
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2019 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
@@ -38,6 +39,15 @@ public class HScreenDevice implements ResourceProxy, ResourceServer {
HScreenDevice() {
}
+ protected boolean isProfile5() {
+ String p = System.getProperty("bluray.profile.5");
+ return (p != null && p.equals("YES"));
+ }
+ protected boolean isProfile6() {
+ String p = System.getProperty("bluray.profile.6");
+ return (p != null && p.equals("YES"));
+ }
+
public String getIDstring() {
return "HAVi Screen Device";
}
=====================================
src/libbluray/bdj/java/org/havi/ui/HVideoDevice.java
=====================================
@@ -1,6 +1,7 @@
/*
* This file is part of libbluray
* Copyright (C) 2010 William Hahne
+ * Copyright (C) 2019 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,12 +20,24 @@
package org.havi.ui;
+import org.blurayx.s3d.ui.HVideoConfigTemplateS3D;
+import org.blurayx.uhd.ui.HVideoConfigurationTemplateUHD;
+
public class HVideoDevice extends HScreenDevice {
protected HVideoDevice() {
+ boolean is_p6 = isProfile6();
+ boolean is_p5 = isProfile5();
int length = HScreenConfigTemplate.defaultConfig.length;
hvcArray = new HVideoConfiguration[length];
for (int i = 0; i < length; i++) {
- HVideoConfigTemplate hvct = new HVideoConfigTemplate();
+ HVideoConfigTemplate hvct;
+ if (is_p6) {
+ hvct = new HVideoConfigurationTemplateUHD();
+ } else if (is_p5) {
+ hvct = new HVideoConfigTemplateS3D();
+ } else {
+ hvct = new HVideoConfigTemplate();
+ }
HScreenConfigTemplate.initDefaultConfigTemplate(hvct, i);
hvcArray[i] = new HVideoConfiguration(hvct);
}
=====================================
src/libbluray/bdnav/index_parse.c
=====================================
@@ -195,6 +195,55 @@ static int _parse_header(BITSTREAM *bs,
return 1;
}
+static int _parse_indx_extension_hevc(BITSTREAM *bs, INDX_ROOT *index)
+{
+ uint32_t len;
+ unsigned unk0, unk1, unk2, unk3, unk4;
+
+ len = bs_read(bs, 32);
+ if (len < 8) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: unsupported extension 3.1 length (%d)\n", len);
+ return 0;
+ }
+
+ index->disc_type = bs_read(bs, 4);
+ unk0 = bs_read(bs, 3);
+ index->exist_4k_flag = bs_read(bs, 1);
+ unk1 = bs_read(bs, 8);
+ unk2 = bs_read(bs, 6);
+ index->hdr_flags = bs_read(bs, 2);
+ unk3 = bs_read(bs, 8);
+ unk4 = bs_read(bs, 32);
+
+ BD_DEBUG(DBG_NAV, "UHD disc type: %d, 4k: %d, HDR: %d\n",
+ index->disc_type, index->exist_4k_flag, index->hdr_flags);
+
+ if (unk0 | unk1 | unk2 | unk3 | unk4) {
+ BD_DEBUG(DBG_CRIT|DBG_NAV,
+ "index.bdmv: unknown data in extension 3.1: "
+ "0x%02x 0x%02x 0x%02x 0x%02x 0x%08x\n", unk0, unk1, unk2, unk3, unk4);
+ }
+
+ return 1;
+}
+
+static int
+_parse_indx_extension(BITSTREAM *bits, int id1, int id2, void *handle)
+{
+ INDX_ROOT *index = (INDX_ROOT *)handle;
+ (void)bits;
+
+ if (id1 == 3) {
+ if (id2 == 1) {
+ return _parse_indx_extension_hevc(bits, index);
+ }
+ }
+
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "_parse_indx_extension(): unknown extension %d.%d\n", id1, id2);
+
+ return 0;
+}
+
static INDX_ROOT *_indx_parse(BD_FILE_H *fp)
{
BITSTREAM bs;
@@ -230,7 +279,10 @@ static INDX_ROOT *_indx_parse(BD_FILE_H *fp)
}
if (extension_data_start) {
- BD_DEBUG(DBG_NAV | DBG_CRIT, "index.bdmv: unknown extension data at %u\n", (unsigned)extension_data_start);
+ bdmv_parse_extension_data(&bs,
+ extension_data_start,
+ _parse_indx_extension,
+ index);
}
return index;
=====================================
src/libbluray/bdnav/index_parse.h
=====================================
@@ -114,6 +114,11 @@ typedef struct indx_root_s {
INDX_TITLE *titles;
uint32_t indx_version;
+
+ /* UHD extension */
+ uint8_t disc_type;
+ uint8_t exist_4k_flag;
+ uint8_t hdr_flags;
} INDX_ROOT;
=====================================
src/libbluray/bdnav/navigation.c
=====================================
@@ -45,11 +45,11 @@
*/
static uint32_t
-_pl_duration(MPLS_PL *pl)
+_pl_duration(const MPLS_PL *pl)
{
unsigned ii;
uint32_t duration = 0;
- MPLS_PI *pi;
+ const MPLS_PI *pi;
for (ii = 0; ii < pl->list_count; ii++) {
pi = &pl->play_item[ii];
@@ -59,7 +59,7 @@ _pl_duration(MPLS_PL *pl)
}
static uint32_t
-_pl_chapter_count(MPLS_PL *pl)
+_pl_chapter_count(const MPLS_PL *pl)
{
unsigned ii, chapters = 0;
@@ -77,7 +77,7 @@ _pl_chapter_count(MPLS_PL *pl)
* Check if two playlists are the same
*/
-static int _stream_cmp(MPLS_STREAM *a, MPLS_STREAM *b)
+static int _stream_cmp(const MPLS_STREAM *a, const MPLS_STREAM *b)
{
if (a->stream_type == b->stream_type &&
a->coding_type == b->coding_type &&
@@ -93,7 +93,7 @@ static int _stream_cmp(MPLS_STREAM *a, MPLS_STREAM *b)
return 1;
}
-static int _streams_cmp(MPLS_STREAM *s1, MPLS_STREAM *s2, unsigned count)
+static int _streams_cmp(const MPLS_STREAM *s1, const MPLS_STREAM *s2, unsigned count)
{
unsigned ii;
for (ii = 0; ii < count; ii++) {
@@ -104,7 +104,7 @@ static int _streams_cmp(MPLS_STREAM *s1, MPLS_STREAM *s2, unsigned count)
return 0;
}
-static int _pi_cmp(MPLS_PI *pi1, MPLS_PI *pi2)
+static int _pi_cmp(const MPLS_PI *pi1, const MPLS_PI *pi2)
{
if (memcmp(pi1->clip[0].clip_id, pi2->clip[0].clip_id, 5) != 0 ||
pi1->in_time != pi2->in_time ||
@@ -133,7 +133,7 @@ static int _pi_cmp(MPLS_PI *pi1, MPLS_PI *pi2)
return 0;
}
-static int _pm_cmp(MPLS_PLM *pm1, MPLS_PLM *pm2)
+static int _pm_cmp(const MPLS_PLM *pm1, const MPLS_PLM *pm2)
{
if (pm1->mark_type == pm2->mark_type &&
pm1->play_item_ref == pm2->play_item_ref &&
@@ -146,7 +146,7 @@ static int _pm_cmp(MPLS_PLM *pm1, MPLS_PLM *pm2)
return 1;
}
-static int _pl_cmp(MPLS_PL *pl1, MPLS_PL *pl2)
+static int _pl_cmp(const MPLS_PL *pl1, const MPLS_PL *pl2)
{
unsigned ii;
@@ -182,7 +182,7 @@ static int _pl_cmp(MPLS_PL *pl1, MPLS_PL *pl2)
*/
/* return 0 if duplicate playlist */
-static int _filter_dup(MPLS_PL *pl_list[], unsigned count, MPLS_PL *pl)
+static int _filter_dup(MPLS_PL *pl_list[], unsigned count, const MPLS_PL *pl)
{
unsigned ii;
@@ -195,12 +195,12 @@ static int _filter_dup(MPLS_PL *pl_list[], unsigned count, MPLS_PL *pl)
}
static unsigned int
-_find_repeats(MPLS_PL *pl, const char *m2ts, uint32_t in_time, uint32_t out_time)
+_find_repeats(const MPLS_PL *pl, const char *m2ts, uint32_t in_time, uint32_t out_time)
{
unsigned ii, count = 0;
for (ii = 0; ii < pl->list_count; ii++) {
- MPLS_PI *pi;
+ const MPLS_PI *pi;
pi = &pl->play_item[ii];
// Ignore titles with repeated segments
@@ -214,12 +214,12 @@ _find_repeats(MPLS_PL *pl, const char *m2ts, uint32_t in_time, uint32_t out_time
}
static int
-_filter_repeats(MPLS_PL *pl, unsigned repeats)
+_filter_repeats(const MPLS_PL *pl, unsigned repeats)
{
unsigned ii;
for (ii = 0; ii < pl->list_count; ii++) {
- MPLS_PI *pi;
+ const MPLS_PI *pi;
pi = &pl->play_item[ii];
// Ignore titles with repeated segments
@@ -236,7 +236,7 @@ _filter_repeats(MPLS_PL *pl, unsigned repeats)
#define DBG_MAIN_PL DBG_NAV
-static void _video_props(MPLS_STN *s, int *format, int *codec)
+static void _video_props(const MPLS_STN *s, int *format, int *codec)
{
unsigned ii;
*codec = 0;
@@ -261,7 +261,7 @@ static void _video_props(MPLS_STN *s, int *format, int *codec)
}
}
-static void _audio_props(MPLS_STN *s, int *hd_audio)
+static void _audio_props(const MPLS_STN *s, int *hd_audio)
{
unsigned ii;
*hd_audio = 0;
@@ -274,8 +274,8 @@ static void _audio_props(MPLS_STN *s, int *hd_audio)
static int _cmp_video_props(const MPLS_PL *p1, const MPLS_PL *p2)
{
- MPLS_STN *s1 = &p1->play_item[0].stn;
- MPLS_STN *s2 = &p2->play_item[0].stn;
+ const MPLS_STN *s1 = &p1->play_item[0].stn;
+ const MPLS_STN *s2 = &p2->play_item[0].stn;
int format1, format2, codec1, codec2;
_video_props(s1, &format1, &codec1);
@@ -291,8 +291,8 @@ static int _cmp_video_props(const MPLS_PL *p1, const MPLS_PL *p2)
static int _cmp_audio_props(const MPLS_PL *p1, const MPLS_PL *p2)
{
- MPLS_STN *s1 = &p1->play_item[0].stn;
- MPLS_STN *s2 = &p2->play_item[0].stn;
+ const MPLS_STN *s1 = &p1->play_item[0].stn;
+ const MPLS_STN *s2 = &p2->play_item[0].stn;
int hda1, hda2;
_audio_props(s1, &hda1);
@@ -302,7 +302,7 @@ static int _cmp_audio_props(const MPLS_PL *p1, const MPLS_PL *p2)
return hda2 - hda1;
}
-static int _pl_guess_main_title(MPLS_PL *p1, MPLS_PL *p2,
+static int _pl_guess_main_title(const MPLS_PL *p1, const MPLS_PL *p2,
const char *mpls_id1, const char *mpls_id2,
const char *known_mpls_ids)
{
@@ -512,12 +512,12 @@ uint8_t nav_lookup_aspect(NAV_CLIP *clip, int pid)
}
static void
-_fill_mark(NAV_TITLE *title, NAV_MARK *mark, int entry)
+_fill_mark(const NAV_TITLE *title, NAV_MARK *mark, int entry)
{
- MPLS_PL *pl = title->pl;
- MPLS_PLM *plm;
- MPLS_PI *pi;
- NAV_CLIP *clip;
+ const MPLS_PL *pl = title->pl;
+ const MPLS_PLM *plm;
+ const MPLS_PI *pi;
+ const NAV_CLIP *clip;
plm = &pl->play_mark[entry];
@@ -547,9 +547,9 @@ _extrapolate_title(NAV_TITLE *title)
uint32_t duration = 0;
uint32_t pkt = 0;
unsigned ii, jj;
- MPLS_PL *pl = title->pl;
- MPLS_PI *pi;
- MPLS_PLM *plm;
+ const MPLS_PL *pl = title->pl;
+ const MPLS_PI *pi;
+ const MPLS_PLM *plm;
NAV_MARK *mark, *prev = NULL;
NAV_CLIP *clip;
@@ -599,7 +599,7 @@ _extrapolate_title(NAV_TITLE *title)
}
static void _fill_clip(NAV_TITLE *title,
- MPLS_CLIP *mpls_clip,
+ const MPLS_CLIP *mpls_clip,
uint8_t connection_condition, uint32_t in_time, uint32_t out_time,
unsigned pi_angle_count,
NAV_CLIP *clip,
@@ -733,7 +733,7 @@ NAV_TITLE* nav_title_open(BD_DISC *disc, const char *playlist, unsigned angle)
}
title->packets = 0;
for (ii = 0; ii < title->pl->list_count; ii++) {
- MPLS_PI *pi;
+ const MPLS_PI *pi;
NAV_CLIP *clip;
pi = &title->pl->play_item[ii];
@@ -771,7 +771,7 @@ NAV_TITLE* nav_title_open(BD_DISC *disc, const char *playlist, unsigned angle)
pos = time = 0;
for (ii = 0; ii < sub_path->clip_list.count; ii++) {
- MPLS_SUB_PI *pi = &title->pl->sub_path[ss].sub_play_item[ii];
+ const MPLS_SUB_PI *pi = &title->pl->sub_path[ss].sub_play_item[ii];
NAV_CLIP *clip = &sub_path->clip_list.clip[ii];
_fill_clip(title, pi->clip, pi->connection_condition, pi->in_time, pi->out_time, 0,
@@ -944,7 +944,7 @@ uint32_t nav_angle_change_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *time)
NAV_CLIP* nav_time_search(NAV_TITLE *title, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt)
{
uint32_t pos, len;
- MPLS_PI *pi = NULL;
+ const MPLS_PI *pi = NULL;
NAV_CLIP *clip;
unsigned ii;
@@ -1040,7 +1040,7 @@ NAV_CLIP* nav_set_angle(NAV_TITLE *title, NAV_CLIP *clip, unsigned angle)
// Find length in packets and end_pkt for each clip
title->packets = 0;
for (ii = 0; ii < title->pl->list_count; ii++) {
- MPLS_PI *pi;
+ const MPLS_PI *pi;
NAV_CLIP *cl;
pi = &title->pl->play_item[ii];
=====================================
src/libbluray/bdnav/sound_parse.c
=====================================
@@ -1,6 +1,6 @@
/*
* This file is part of libbluray
- * Copyright (C) 2010 hpi1
+ * Copyright (C) 2010-2019 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
@@ -23,6 +23,8 @@
#include "sound_parse.h"
+#include "bdmv_parse.h"
+
#include "disc/disc.h"
#include "file/file.h"
@@ -33,26 +35,16 @@
#include <stdlib.h>
#define BCLK_SIG1 ('B' << 24 | 'C' << 16 | 'L' << 8 | 'K')
-#define BCLK_SIG2A ('0' << 24 | '2' << 16 | '0' << 8 | '0')
-#define BCLK_SIG2B ('0' << 24 | '1' << 16 | '0' << 8 | '0')
-
static int _bclk_parse_header(BITSTREAM *bs, uint32_t *data_start, uint32_t *extension_data_start)
{
- uint32_t sig1, sig2;
-
- if (bs_seek_byte(bs, 0) < 0) {
+ if (!bdmv_parse_header(bs, BCLK_SIG1, NULL)) {
return 0;
}
- sig1 = bs_read(bs, 32);
- sig2 = bs_read(bs, 32);
-
- if (sig1 != BCLK_SIG1 ||
- (sig2 != BCLK_SIG2A &&
- sig2 != BCLK_SIG2B)) {
- BD_DEBUG(DBG_NAV, "sound.bdmv failed signature match: expected BCLK0100 got %8.8s\n", bs->buf);
- return 0;
+ if (bs_avail(bs) < 2 * 32) {
+ BD_DEBUG(DBG_NAV | DBG_CRIT, "_parse_header: unexpected end of file\n");
+ return 0;
}
*data_start = bs_read(bs, 32);
=====================================
src/libbluray/bluray.c
=====================================
@@ -903,10 +903,13 @@ static void _check_bdj(BLURAY *bd)
/* Check if jvm + jar can be loaded ? */
switch (bdj_jvm_available(&bd->bdjstorage)) {
- case 2: bd->disc_info.bdj_handled = 1;
+ case BDJ_CHECK_OK:
+ bd->disc_info.bdj_handled = 1;
/* fall thru */
- case 1: bd->disc_info.libjvm_detected = 1;
- default:;
+ case BDJ_CHECK_NO_JAR:
+ bd->disc_info.libjvm_detected = 1;
+ /* fall thru */
+ default:;
}
}
}
@@ -1059,9 +1062,6 @@ static void _fill_disc_info(BLURAY *bd, BD_ENC_INFO *enc_info)
bd->disc_info.top_menu = titles[0];
}
- /* populate title names */
- bd_get_meta(bd);
-
/* no BD-J menu support for profile 6 */
if (bd->disc_info.num_bdj_titles) {
// XXX actually, should check from bdjo files ...
@@ -1072,6 +1072,9 @@ static void _fill_disc_info(BLURAY *bd, BD_ENC_INFO *enc_info)
}
indx_free(&index);
+
+ /* populate title names */
+ bd_get_meta(bd);
}
#if 0
@@ -1095,9 +1098,7 @@ static void _fill_disc_info(BLURAY *bd, BD_ENC_INFO *enc_info)
const BLURAY_DISC_INFO *bd_get_disc_info(BLURAY *bd)
{
if (!bd->disc) {
- BD_ENC_INFO enc_info;
- memset(&enc_info, 0, sizeof(enc_info));
- _fill_disc_info(bd, &enc_info);
+ _fill_disc_info(bd, NULL);
}
return &bd->disc_info;
}
View it on GitLab: https://code.videolan.org/videolan/libbluray/compare/66972eac0ec58d8f395205ae4246cc071bb9f266...37bac2f77d4afa6fdc746f3163e8260341934968
--
View it on GitLab: https://code.videolan.org/videolan/libbluray/compare/66972eac0ec58d8f395205ae4246cc071bb9f266...37bac2f77d4afa6fdc746f3163e8260341934968
You're receiving this email because of your account on code.videolan.org.
More information about the libbluray-devel
mailing list