libbluray | branch: master | hpi1 <[email protected]> | Thu Nov 6 12:52:58 2014 +0200| [40a00c3f202a942de8427d40991b91ff7480ef26] | committer: hpi1
Synchronize BD-J overlay buffer/callback change and overlay draw > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=40a00c3f202a942de8427d40991b91ff7480ef26 --- src/libbluray/bdj/bdj.c | 2 -- src/libbluray/bdj/bdj.h | 2 -- src/libbluray/bdj/bdj_private.h | 3 -- src/libbluray/bdj/native/org_videolan_Libbluray.c | 6 +++- src/libbluray/bluray.c | 37 ++++++++++++++------- src/libbluray/bluray_internal.h | 4 +++ 6 files changed, 34 insertions(+), 20 deletions(-) diff --git a/src/libbluray/bdj/bdj.c b/src/libbluray/bdj/bdj.c index 1b147e4..6b23add 100644 --- a/src/libbluray/bdj/bdj.c +++ b/src/libbluray/bdj/bdj.c @@ -485,7 +485,6 @@ static int _create_jvm(void *jvm_lib, const char *java_home, JNIEnv **env, JavaV } BDJAVA* bdj_open(const char *path, struct bluray *bd, - struct bd_argb_buffer_s *buf, const char *bdj_disc_id, BDJ_STORAGE *storage) { BD_DEBUG(DBG_BDJ, "bdj_open()\n"); @@ -509,7 +508,6 @@ BDJAVA* bdj_open(const char *path, struct bluray *bd, BDJAVA* bdjava = calloc(1, sizeof(BDJAVA)); bdjava->bd = bd; bdjava->h_libjvm = jvm_lib; - bdjava->buf = buf; bdjava->jvm = jvm; if (debug_mask & DBG_JNI) { diff --git a/src/libbluray/bdj/bdj.h b/src/libbluray/bdj/bdj.h index 6a20808..7226932 100644 --- a/src/libbluray/bdj/bdj.h +++ b/src/libbluray/bdj/bdj.h @@ -54,10 +54,8 @@ typedef struct { typedef struct bdjava_s BDJAVA; struct bluray; -struct bd_argb_buffer_s; BD_PRIVATE BDJAVA* bdj_open(const char *path, struct bluray *bd, - struct bd_argb_buffer_s *buf, const char *bdj_disc_id, BDJ_STORAGE *storage); BD_PRIVATE void bdj_close(BDJAVA *bdjava); BD_PRIVATE int bdj_process_event(BDJAVA *bdjava, unsigned ev, unsigned param); diff --git a/src/libbluray/bdj/bdj_private.h b/src/libbluray/bdj/bdj_private.h index e8730c1..c48095b 100644 --- a/src/libbluray/bdj/bdj_private.h +++ b/src/libbluray/bdj/bdj_private.h @@ -25,13 +25,10 @@ #include <jni.h> struct bluray; -struct bd_argb_buffer_s; struct bdjava_s { struct bluray *bd; - struct bd_argb_buffer_s *buf; - // JVM library void *h_libjvm; diff --git a/src/libbluray/bdj/native/org_videolan_Libbluray.c b/src/libbluray/bdj/native/org_videolan_Libbluray.c index 7a62b19..c0ca8e5 100644 --- a/src/libbluray/bdj/native/org_videolan_Libbluray.c +++ b/src/libbluray/bdj/native/org_videolan_Libbluray.c @@ -520,7 +520,11 @@ JNIEXPORT void JNICALL Java_org_videolan_Libbluray_updateGraphicN(JNIEnv * env, return; } - _updateGraphic(env, bdj->bd, width, height, rgbArray, x0, y0, x1, y1, bdj->buf); + BD_ARGB_BUFFER *buf = bd_lock_osd_buffer(bdj->bd); + + _updateGraphic(env, bdj->bd, width, height, rgbArray, x0, y0, x1, y1, buf); + + bd_unlock_osd_buffer(bdj->bd); } #define CC (char*)(uintptr_t) /* cast a literal from (const char*) */ diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c index 6af9add..fed52f8 100644 --- a/src/libbluray/bluray.c +++ b/src/libbluray/bluray.c @@ -179,9 +179,12 @@ struct bluray { uint64_t gc_wakeup_pos; /* stream position of gc_wakeup_time */ /* ARGB overlay output */ +#ifdef USING_BDJAVA void *argb_overlay_proc_handle; bd_argb_overlay_proc_f argb_overlay_proc; BD_ARGB_BUFFER *argb_buffer; + BD_MUTEX argb_buffer_mutex; +#endif }; /* Stream Packet Number = byte offset / 192. Avoid 64-bit division. */ @@ -1178,6 +1181,17 @@ int bd_reg_write(BLURAY *bd, int psr, int reg, uint32_t value, uint32_t psr_valu #endif #ifdef USING_BDJAVA +BD_ARGB_BUFFER *bd_lock_osd_buffer(BLURAY *bd) +{ + bd_mutex_lock(&bd->argb_buffer_mutex); + return bd->argb_buffer; +} + +void bd_unlock_osd_buffer(BLURAY *bd) +{ + bd_mutex_unlock(&bd->argb_buffer_mutex); +} + /* * handle graphics updates from BD-J layer */ @@ -1258,7 +1272,7 @@ static int _start_bdj(BLURAY *bd, unsigned title) { #ifdef USING_BDJAVA if (bd->bdjava == NULL) { - bd->bdjava = bdj_open(bd->device_path, bd, bd->argb_buffer, bd->disc_info.bdj_disc_id, bd->bdjstorage); + bd->bdjava = bdj_open(bd->device_path, bd, bd->disc_info.bdj_disc_id, bd->bdjstorage); if (!bd->bdjava) { return 0; } @@ -1424,6 +1438,9 @@ BLURAY *bd_open(const char* device_path, const char* keyfile_path) _fill_disc_info(bd); bd_mutex_init(&bd->mutex); +#ifdef USING_BDJAVA + bd_mutex_init(&bd->argb_buffer_mutex); +#endif BD_DEBUG(DBG_BLURAY, "BLURAY initialized!\n"); @@ -1462,6 +1479,9 @@ void bd_close(BLURAY *bd) _storage_free(bd); bd_mutex_destroy(&bd->mutex); +#ifdef USING_BDJAVA + bd_mutex_destroy(&bd->argb_buffer_mutex); +#endif BD_DEBUG(DBG_BLURAY, "BLURAY destroyed!\n"); @@ -3425,26 +3445,19 @@ void bd_register_overlay_proc(BLURAY *bd, void *handle, bd_overlay_proc_f func) void bd_register_argb_overlay_proc(BLURAY *bd, void *handle, bd_argb_overlay_proc_f func, BD_ARGB_BUFFER *buf) { +#ifdef USING_BDJAVA if (!bd) { return; } - bd_mutex_lock(&bd->mutex); - - if (bd->argb_overlay_proc && bd->title_type == title_bdj) { - /* function can't be changed when BD-J is running */ - bd_mutex_unlock(&bd->mutex); - BD_DEBUG(DBG_BLURAY | DBG_CRIT, "bd_register_argb_overlay_proc(): ARGB handler already registered and BD-J running !\n"); - return; - } - - _close_bdj(bd); + bd_mutex_lock(&bd->argb_buffer_mutex); bd->argb_overlay_proc = func; bd->argb_overlay_proc_handle = handle; bd->argb_buffer = buf; - bd_mutex_unlock(&bd->mutex); + bd_mutex_unlock(&bd->argb_buffer_mutex); +#endif } int bd_get_sound_effect(BLURAY *bd, unsigned sound_id, BLURAY_SOUND_EFFECT *effect) diff --git a/src/libbluray/bluray_internal.h b/src/libbluray/bluray_internal.h index ca89031..d69650b 100644 --- a/src/libbluray/bluray_internal.h +++ b/src/libbluray/bluray_internal.h @@ -45,6 +45,10 @@ BD_PRIVATE int bd_play_playlist_at(BLURAY *bd, int playlist, int playitem, int p /* BD-J overlay */ +struct bd_argb_buffer_s; +BD_PRIVATE struct bd_argb_buffer_s *bd_lock_osd_buffer(struct bluray *bd); +BD_PRIVATE void bd_unlock_osd_buffer(struct bluray *bd); + BD_PRIVATE void bd_bdj_osd_cb(struct bluray *bd, const unsigned *img, int w, int h, int x0, int y0, int x1, int y1); _______________________________________________ libbluray-devel mailing list [email protected] https://mailman.videolan.org/listinfo/libbluray-devel
