libbluray | branch: master | hpi1 <[email protected]> | Wed Feb 9 18:17:39 2011 +0200| [14c75a4096e8d0c9c219010dbf0f8b17b4a5b991] | committer: hpi1
Added mutex to graphics controller. Only single thread at time can enter gc_run() and gc_decode_ts(). > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=14c75a4096e8d0c9c219010dbf0f8b17b4a5b991 --- src/libbluray/decoders/graphics_controller.c | 20 ++++++++++++++++++++ 1 files changed, 20 insertions(+), 0 deletions(-) diff --git a/src/libbluray/decoders/graphics_controller.c b/src/libbluray/decoders/graphics_controller.c index c9fbf80..fd41b61 100644 --- a/src/libbluray/decoders/graphics_controller.c +++ b/src/libbluray/decoders/graphics_controller.c @@ -25,6 +25,7 @@ #include "util/macro.h" #include "util/logging.h" +#include "util/mutex.h" #include "../register.h" #include "../keys.h" @@ -42,6 +43,8 @@ struct graphics_controller_s { BD_REGISTERS *regs; + BD_MUTEX mutex; + /* overlay output */ void *overlay_proc_handle; void (*overlay_proc)(void *, const struct bd_overlay_s * const); @@ -240,6 +243,8 @@ GRAPHICS_CONTROLLER *gc_init(BD_REGISTERS *regs, void *handle, gc_overlay_proc_f p->overlay_proc_handle = handle; p->overlay_proc = func; + bd_mutex_init(&p->mutex); + return p; } @@ -253,6 +258,8 @@ void gc_free(GRAPHICS_CONTROLLER **p) (*p)->overlay_proc((*p)->overlay_proc_handle, NULL); } + bd_mutex_destroy(&(*p)->mutex); + X_FREE(*p); } } @@ -269,10 +276,14 @@ void gc_decode_ts(GRAPHICS_CONTROLLER *gc, uint16_t pid, uint8_t *block, unsigne if (!gc->igp) { gc->igp = graphics_processor_init(); } + + bd_mutex_lock(&gc->mutex); + graphics_processor_decode_ts(gc->igp, &gc->igs, pid, block, num_blocks, stc); if (!gc->igs || !gc->igs->complete) { + bd_mutex_unlock(&gc->mutex); return; } @@ -283,6 +294,8 @@ void gc_decode_ts(GRAPHICS_CONTROLLER *gc, uint16_t pid, uint8_t *block, unsigne _gc_clear_osd(gc, 1); _reset_enabled_button(gc); + + bd_mutex_unlock(&gc->mutex); } else if (pid >= 0x1200 && pid < 0x1300) { @@ -761,10 +774,14 @@ int gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS cmds->sound_id_ref = -1; } + bd_mutex_lock(&gc->mutex); + /* always accept reset */ switch (ctrl) { case GC_CTRL_RESET: _gc_reset(gc); + + bd_mutex_unlock(&gc->mutex); return 0; default:; } @@ -772,6 +789,7 @@ int gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS /* other operations require complete display set */ if (!gc || !gc->igs || !gc->igs->ics || !gc->igs->complete) { TRACE("gc_run(): no interactive composition\n"); + bd_mutex_unlock(&gc->mutex); return result; } @@ -830,5 +848,7 @@ int gc_run(GRAPHICS_CONTROLLER *gc, gc_ctrl_e ctrl, uint32_t param, GC_NAV_CMDS break; } + bd_mutex_unlock(&gc->mutex); + return result; } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
