[vlc-commits] commit: Bluray access: support for Titles (Jean-Baptiste Kempf )
git at videolan.org
git at videolan.org
Mon Nov 1 15:11:51 CET 2010
vlc | branch: master | Jean-Baptiste Kempf <jb at elayne.jbkempf.com> | Wed Oct 20 01:48:01 2010 +0200| [78851abfa731eb4511ccb6b41a9123cd43605ac1] | committer: Jean-Baptiste Kempf
Bluray access: support for Titles
Signed-off-by: Jean-Baptiste Kempf <jb at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=78851abfa731eb4511ccb6b41a9123cd43605ac1
---
modules/access/bluray.c | 109 ++++++++++++++++++++++++++++++++++++++---------
1 files changed, 89 insertions(+), 20 deletions(-)
diff --git a/modules/access/bluray.c b/modules/access/bluray.c
index b2b9cc9..427c41b 100644
--- a/modules/access/bluray.c
+++ b/modules/access/bluray.c
@@ -33,6 +33,7 @@
#include <vlc_plugin.h>
#include <vlc_access.h>
#include <vlc_messages.h>
+#include <vlc_input.h>
#include <libbluray/bluray.h>
@@ -71,13 +72,20 @@ vlc_module_end ()
struct access_sys_t
{
BLURAY *bluray; /* */
+
+ /* Titles */
+ unsigned int i_title;
+ unsigned int i_longest_title;
+ input_title_t **pp_title;
+
int i_bd_delay;
};
static ssize_t blurayRead (access_t *, uint8_t *, size_t);
static int bluraySeek (access_t *, uint64_t);
static int blurayControl(access_t *, int, va_list);
-static int bluraySetTitle(access_t *p_access, int i_tile);
+static int blurayInitTitles(access_t *p_access );
+static int bluraySetTitle(access_t *p_access, int i_title);
/*****************************************************************************
* blurayOpen: module init function
@@ -107,24 +115,33 @@ static int blurayOpen( vlc_object_t *object )
return VLC_ENOMEM;
}
+ TAB_INIT( p_sys->i_title, p_sys->pp_title );
+
/* store current bd_path */
strncpy(bd_path, p_access->psz_location, sizeof(bd_path));
bd_path[PATH_MAX - 1] = '\0';
- if ( (pos_title = strrchr(bd_path, ':')) ) {
- /* found character ':' for title information */
- *(pos_title++) = '\0';
- i_title = atoi(pos_title);
- }
-
p_sys->bluray = bd_open(bd_path, NULL);
if ( !p_sys->bluray ) {
free(p_sys);
return VLC_EGENERIC;
}
+ if (blurayInitTitles(p_access) != VLC_SUCCESS) {
+ blurayClose(object);
+ return VLC_EGENERIC;
+ }
+
+ /* get title request */
+ if ( (pos_title = strrchr(bd_path, ':')) ) {
+ /* found character ':' for title information */
+ *(pos_title++) = '\0';
+ i_title = atoi(pos_title);
+ }
+
/* set start title number */
if ( bluraySetTitle(p_access, i_title) != VLC_SUCCESS ) {
+ msg_Err( p_access, "Could not set the title %d", i_title );
blurayClose(object);
return VLC_EGENERIC;
}
@@ -143,12 +160,53 @@ static void blurayClose( vlc_object_t *object )
access_t *p_access = (access_t*)object;
access_sys_t *p_sys = p_access->p_sys;
+ /* Titles */
+ for (unsigned int i = 0; i < p_sys->i_title; i++)
+ vlc_input_title_Delete(p_sys->pp_title[i]);
+ TAB_CLEAN( p_sys->i_title, p_sys->pp_title );
+
/* bd_close( NULL ) can crash */
assert(p_sys->bluray);
bd_close(p_sys->bluray);
free(p_sys);
}
+static int blurayInitTitles(access_t *p_access )
+{
+ access_sys_t *p_sys = p_access->p_sys;
+
+ /* get and set the titles */
+ unsigned i_title = bd_get_titles(p_sys->bluray, TITLES_RELEVANT);
+ int64_t duration = 0;
+
+ for (unsigned int i = 0; i < i_title; i++) {
+ input_title_t *t = vlc_input_title_New();
+ if (!t)
+ break;
+
+ BLURAY_TITLE_INFO *title_info = bd_get_title_info(p_sys->bluray,i);
+ if (!title_info)
+ break;
+ t->i_length = title_info->duration * CLOCK_FREQ / INT64_C(90000);
+
+ if (t->i_length > duration) {
+ duration = t->i_length;
+ p_sys->i_longest_title = i;
+ }
+
+ for ( unsigned int j = 0; j < title_info->chapter_count; j++) {
+ seekpoint_t *s = vlc_seekpoint_New();
+ if( !s )
+ break;
+ s->i_time_offset = title_info->chapters[j].offset;
+
+ TAB_APPEND( t->i_seekpoint, t->seekpoint, s );
+ }
+ TAB_APPEND( p_sys->i_title, p_sys->pp_title, t );
+ bd_free_title_info(title_info);
+ }
+ return VLC_SUCCESS;
+}
/*****************************************************************************
* bluraySetTitle: select new BD title
@@ -157,19 +215,11 @@ static int bluraySetTitle(access_t *p_access, int i_title)
{
access_sys_t *p_sys = p_access->p_sys;
- unsigned int i_nb_titles = bd_get_titles(p_sys->bluray, TITLES_RELEVANT);
-
/* Looking for the main title, ie the longest duration */
- if (i_title == -1) {
- uint64_t duration=0;
- for (unsigned int i = 0; i < i_nb_titles; i++) {
- BLURAY_TITLE_INFO *info = bd_get_title_info(p_sys->bluray, i);
- if (info->duration > duration) {
- i_title = i;
- duration = info->duration;
- }
- }
- }
+ if (i_title == -1)
+ i_title = p_sys->i_longest_title;
+
+ msg_Dbg( p_access, "Selecting Title %i", i_title);
/* Select Blu-Ray title */
if ( bd_select_title(p_access->p_sys->bluray, i_title) == 0 ) {
@@ -228,10 +278,29 @@ static int blurayControl(access_t *p_access, int query, va_list args)
bd_seek_chapter( p_sys->bluray, i_chapter );
break;
}
- case ACCESS_GET_META:
+
case ACCESS_GET_TITLE_INFO:
+ {
+ input_title_t ***ppp_title = (input_title_t***)va_arg( args, input_title_t*** );
+ int *pi_int = (int*)va_arg( args, int* );
+ int *pi_title_offset = (int*)va_arg( args, int* );
+ int *pi_chapter_offset = (int*)va_arg( args, int* );
+
+ /* */
+ *pi_title_offset = 0;
+ *pi_chapter_offset = 0;
+
+ /* Duplicate local title infos */
+ *pi_int = p_sys->i_title;
+ *ppp_title = calloc( p_sys->i_title, sizeof(input_title_t **) );
+ for( unsigned int i = 0; i < p_sys->i_title; i++ )
+ (*ppp_title)[i] = vlc_input_title_Duplicate( p_sys->pp_title[i]);
+
+ return VLC_SUCCESS;
+ }
case ACCESS_SET_PRIVATE_ID_STATE:
case ACCESS_GET_CONTENT_TYPE:
+ case ACCESS_GET_META:
return VLC_EGENERIC;
default:
More information about the vlc-commits
mailing list