libbluray | branch: master | hpi1 <[email protected]> | Fri Apr 26 12:39:36 2013 +0300| [2fa7218a67f70eccddadcdb91223b3935db527f3] | committer: hpi1
Implement DeviceAttribute > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=2fa7218a67f70eccddadcdb91223b3935db527f3 --- .../com/aacsla/bluray/online/DeviceAttribute.java | 11 +++++----- src/libbluray/bdj/java/org/videolan/Libbluray.java | 5 +++++ src/libbluray/bdj/native/org_videolan_Libbluray.c | 21 ++++++++++++++++++++ src/libbluray/bdj/native/org_videolan_Libbluray.h | 8 ++++++++ src/libbluray/bluray.c | 17 ++++++++++++++++ src/libbluray/bluray_internal.h | 1 + 6 files changed, 58 insertions(+), 5 deletions(-) diff --git a/src/libbluray/bdj/java/com/aacsla/bluray/online/DeviceAttribute.java b/src/libbluray/bdj/java/com/aacsla/bluray/online/DeviceAttribute.java index 9f9c696..c9d2ef5 100644 --- a/src/libbluray/bdj/java/com/aacsla/bluray/online/DeviceAttribute.java +++ b/src/libbluray/bdj/java/com/aacsla/bluray/online/DeviceAttribute.java @@ -19,6 +19,7 @@ package com.aacsla.bluray.online; +import org.videolan.Libbluray; import org.videolan.Logger; public class DeviceAttribute { @@ -26,10 +27,10 @@ public class DeviceAttribute { } public byte[] getDeviceBindingID() { - // TODO - logger.unimplemented("getDeviceBindingID"); - return null; + byte bid[] = Libbluray.getDeviceBindingID(); + if (bid == null) { + Logger.getLogger(DeviceAttribute.class.getName()).warning("getDeviceBindingID() failed"); + } + return bid; } - - private static final Logger logger = Logger.getLogger(DeviceAttribute.class.getName()); } diff --git a/src/libbluray/bdj/java/org/videolan/Libbluray.java b/src/libbluray/bdj/java/org/videolan/Libbluray.java index 8ab3cb2..0afab9b 100644 --- a/src/libbluray/bdj/java/org/videolan/Libbluray.java +++ b/src/libbluray/bdj/java/org/videolan/Libbluray.java @@ -142,6 +142,10 @@ public class Libbluray { return getPMSNN(nativePointer); } + public static byte[] getDeviceBindingID() { + return getDeviceBindingIDN(nativePointer); + } + public static int getTitles() { return getTitlesN(nativePointer); } @@ -410,6 +414,7 @@ public class Libbluray { private static native byte[] getVolumeIDN(long np); private static native byte[] getPMSNN(long np); + private static native byte[] getDeviceBindingIDN(long np); private static native TitleInfo getTitleInfoN(long np, int title); private static native PlaylistInfo getPlaylistInfoN(long np, int playlist); private static native int getTitlesN(long np); diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.c b/src/libbluray/bdj/native/org_videolan_Libbluray.c index 5ff9477..7913834 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.c +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.c @@ -217,6 +217,22 @@ JNIEXPORT jbyteArray JNICALL Java_org_videolan_Libbluray_getPMSNN return array; } +JNIEXPORT jbyteArray JNICALL Java_org_videolan_Libbluray_getDeviceBindingIDN + (JNIEnv * env, jclass cls, jlong np) +{ + BDJAVA* bdj = (BDJAVA*)(intptr_t)np; + const uint8_t *bid = bd_get_device_binding_id(bdj->bd); + + static const uint8_t empty[16] = {0}; + if (!bid || !memcmp(bid, empty, sizeof(empty))) { + return NULL; + } + jbyteArray array = (*env)->NewByteArray(env, 16); + (*env)->SetByteArrayRegion(env, array, 0, 16, (const jbyte *)bid); + return array; +} + + JNIEXPORT jint JNICALL Java_org_videolan_Libbluray_getTitlesN(JNIEnv * env, jclass cls, jlong np) { BDJAVA* bdj = (BDJAVA*)(intptr_t)np; @@ -466,6 +482,11 @@ Java_org_videolan_Libbluray_methods[] = VC(Java_org_videolan_Libbluray_getPMSNN), }, { + CC("getDeviceBindingIDN"), + CC("(J)[B"), + VC(Java_org_videolan_Libbluray_getDeviceBindingIDN), + }, + { CC("getTitleInfoN"), CC("(JI)Lorg/videolan/TitleInfo;"), VC(Java_org_videolan_Libbluray_getTitleInfoN), diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.h b/src/libbluray/bdj/native/org_videolan_Libbluray.h index ab87c7a..dcf2496 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.h +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.h @@ -110,6 +110,14 @@ JNIEXPORT jbyteArray JNICALL Java_org_videolan_Libbluray_getPMSNN /* * Class: org_videolan_Libbluray + * Method: getDeviceBindingIDN + * Signature: (J)[B + */ +JNIEXPORT jbyteArray JNICALL Java_org_videolan_Libbluray_getDeviceBindingIDN + (JNIEnv *, jclass, jlong); + +/* + * Class: org_videolan_Libbluray * Method: getTitleInfoN * Signature: (JI)Lorg/videolan/TitleInfo; */ diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 7ed969b..7351c75 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -926,6 +926,23 @@ const uint8_t *bd_get_pmsn(BLURAY *bd) return NULL; } +const uint8_t *bd_get_device_binding_id(BLURAY *bd) +{ + /* internal function. Used by BD-J. */ + if (bd->aacs) { + fptr_p_void fptr; + *(void **)(&fptr) = dl_dlsym(bd->h_libaacs, "aacs_get_device_binding_id"); + if (fptr) { + return (const uint8_t*)fptr(bd->aacs); + } + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "aacs_get_device_binding_id() dlsym failed!"); + return NULL; + } + + BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bd_get_device_binding_id(): libaacs not initialized!"); + return NULL; +} + static void _libbdplus_close(BLURAY *bd) { if (bd->bdplus) { diff --git a/src/libbluray/bluray_internal.h b/src/libbluray/bluray_internal.h index 82c24d2..bfb2c12 100644 --- a/src/libbluray/bluray_internal.h +++ b/src/libbluray/bluray_internal.h @@ -28,5 +28,6 @@ BD_PRIVATE const uint8_t *bd_get_vid(BLURAY *bd); BD_PRIVATE const uint8_t *bd_get_pmsn(BLURAY *bd); +BD_PRIVATE const uint8_t *bd_get_device_binding_id(BLURAY *bd); #endif /* _BLURAY_INTERNAL_H_ */ _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
