[libbluray-devel] Added support for sound effects in HDMV menus
hpi1
git at videolan.org
Wed Dec 7 15:18:31 CET 2011
libbluray | branch: master | hpi1 <hpi1 at anonymous.org> | Wed Dec 7 16:17:26 2011 +0200| [5febceefba27fa084ff6b07c1d2f253b3533a222] | committer: hpi1
Added support for sound effects in HDMV menus
> http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=5febceefba27fa084ff6b07c1d2f253b3533a222
---
ChangeLog | 1 +
configure.ac | 6 +++---
src/libbluray/bluray.c | 36 ++++++++++++++++++++++++++++++++++++
src/libbluray/bluray.h | 18 ++++++++++++++++++
4 files changed, 58 insertions(+), 3 deletions(-)
diff --git a/ChangeLog b/ChangeLog
index 8807d24..006e4b9 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,4 +1,5 @@
????-??-??:
+ - Support for sound effects in HDMV menus
- Fixes to HDMV menu decoding
- Distribute BD-J code
diff --git a/configure.ac b/configure.ac
index 756032b..6005949 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1,7 +1,7 @@
# library version number
m4_define([bluray_major], 0)
m4_define([bluray_minor], 2)
-m4_define([bluray_micro], 1)
+m4_define([bluray_micro], 2)
m4_define([bluray_version],[bluray_major.bluray_minor.bluray_micro])
# shared library version (.so version)
@@ -12,9 +12,9 @@ m4_define([bluray_version],[bluray_major.bluray_minor.bluray_micro])
#
# Library file name will be libbluray.so.(current-age).age.revision
#
-m4_define([lt_current], 1)
+m4_define([lt_current], 2)
m4_define([lt_revision], 0)
-m4_define([lt_age], 0)
+m4_define([lt_age], 1)
# initilization
AC_INIT([libbluray], bluray_version, [http://www.videolan.org/developers/libbluray.html])
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index bd90184..1ad36d0 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -34,6 +34,7 @@
#include "bdnav/index_parse.h"
#include "bdnav/meta_parse.h"
#include "bdnav/clpi_parse.h"
+#include "bdnav/sound_parse.h"
#include "hdmv/hdmv_vm.h"
#include "decoders/graphics_controller.h"
#include "file/file.h"
@@ -141,6 +142,7 @@ struct bluray {
/* graphics */
GRAPHICS_CONTROLLER *graphics_controller;
+ SOUND_DATA *sound_effects;
};
#define DL_CALL(lib,func,param,...) \
@@ -557,6 +559,9 @@ static int _run_gc(BLURAY *bd, gc_ctrl_e msg, uint32_t param)
hdmv_vm_set_object(bd->hdmv_vm, cmds.num_nav_cmds, cmds.nav_cmds);
bd->hdmv_suspended = !hdmv_vm_running(bd->hdmv_vm);
}
+ if (cmds.sound_id_ref >= 0 && cmds.sound_id_ref < 0xff) {
+ _queue_event(bd, (BD_EVENT){BD_EVENT_SOUND_EFFECT, cmds.sound_id_ref});
+ }
}
return result;
@@ -933,6 +938,7 @@ void bd_close(BLURAY *bd)
gc_free(&bd->graphics_controller);
indx_free(&bd->index);
+ sound_free(&bd->sound_effects);
bd_registers_free(bd->regs);
_free_event_queue(bd);
@@ -2292,6 +2298,36 @@ void bd_register_overlay_proc(BLURAY *bd, void *handle, bd_overlay_proc_f func)
}
}
+int bd_get_sound_effect(BLURAY *bd, unsigned sound_id, BLURAY_SOUND_EFFECT *effect)
+{
+ if (!bd || !effect) {
+ return -1;
+ }
+
+ if (!bd->sound_effects) {
+
+ char *file = str_printf("%s/BDMV/AUXDATA/sound.bdmv", bd->device_path);
+ bd->sound_effects = sound_parse(file);
+ X_FREE(file);
+
+ if (!bd->sound_effects) {
+ return -1;
+ }
+ }
+
+ if (sound_id < bd->sound_effects->num_sounds) {
+ SOUND_OBJECT *o = &bd->sound_effects->sounds[sound_id];
+
+ effect->num_channels = o->num_channels;
+ effect->num_frames = o->num_frames;
+ effect->samples = (const int16_t *)o->samples;
+
+ return 1;
+ }
+
+ return 0;
+}
+
/*
*
*/
diff --git a/src/libbluray/bluray.h b/src/libbluray/bluray.h
index 7dddb58..2619860 100644
--- a/src/libbluray/bluray.h
+++ b/src/libbluray/bluray.h
@@ -168,6 +168,12 @@ typedef struct bd_title_info {
BLURAY_TITLE_CHAPTER *chapters;
} BLURAY_TITLE_INFO;
+typedef struct bd_sound_effect {
+ uint8_t num_channels; /* 1 - mono, 2 - stereo */
+ uint32_t num_frames;
+ const int16_t *samples; /* 48000 Hz, 16 bit LPCM. interleaved if stereo */
+} BLURAY_SOUND_EFFECT;
+
/**
* Get library version
*
@@ -507,6 +513,7 @@ typedef enum {
/* Still playback for n seconds (reached end of still mode play item) */
BD_EVENT_STILL_TIME, /* 0 = infinite ; 1...300 = seconds */
+ BD_EVENT_SOUND_EFFECT, /* effect ID */
} bd_event_e;
typedef struct {
@@ -624,6 +631,17 @@ int bd_user_input(BLURAY *bd, int64_t pts, uint32_t key);
*/
int bd_mouse_select(BLURAY *bd, int64_t pts, uint16_t x, uint16_t y);
+/**
+ *
+ * Get sound effect
+ *
+ * @param bd BLURAY object
+ * @param effect_id sound effect id (0...N)
+ * @param effect sound effect data
+ * @return <0 when no effects, 0 when id out of range, 1 on success
+ */
+int bd_get_sound_effect(BLURAY *bd, unsigned sound_id, struct bd_sound_effect *effect);
+
/*
*
*/
More information about the libbluray-devel
mailing list