summaryrefslogtreecommitdiffstats
path: root/libhb/dvd.c
diff options
context:
space:
mode:
authorjstebbins <[email protected]>2010-04-20 02:19:16 +0000
committerjstebbins <[email protected]>2010-04-20 02:19:16 +0000
commitc550723257a62601b8a9331140b9eecfbdca1b79 (patch)
tree0bc7faefe6f94a5b513ee978b3fb6e8d11a7f66a /libhb/dvd.c
parent78aaa0da6e4f331d0c9d97a67a15f5eb1aafb5fe (diff)
add dvd main feature title detection
scans the dvd menus and presses buttons to see where they might lead. when a button press leads to a title, i check to see if it is the longest seen thus far and save it's index. this only applies when dvdnav is enabled. when dvdread is in use, the longest title of all the titles is flagged as the "main feature" git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@3245 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/dvd.c')
-rw-r--r--libhb/dvd.c27
1 files changed, 26 insertions, 1 deletions
diff --git a/libhb/dvd.c b/libhb/dvd.c
index fbac84de4..e51fd95bf 100644
--- a/libhb/dvd.c
+++ b/libhb/dvd.c
@@ -24,6 +24,7 @@ static int hb_dvdread_read( hb_dvd_t * d, hb_buffer_t * b );
static int hb_dvdread_chapter( hb_dvd_t * d );
static int hb_dvdread_angle_count( hb_dvd_t * d );
static void hb_dvdread_set_angle( hb_dvd_t * d, int angle );
+static int hb_dvdread_main_feature( hb_dvd_t * d, hb_list_t * list_title );
hb_dvd_func_t hb_dvdread_func =
{
@@ -38,7 +39,8 @@ hb_dvd_func_t hb_dvdread_func =
hb_dvdread_read,
hb_dvdread_chapter,
hb_dvdread_angle_count,
- hb_dvdread_set_angle
+ hb_dvdread_set_angle,
+ hb_dvdread_main_feature
};
static hb_dvd_func_t *dvd_methods = &hb_dvdread_func;
@@ -55,6 +57,24 @@ hb_dvd_func_t * hb_dvdread_methods( void )
return &hb_dvdread_func;
}
+static int hb_dvdread_main_feature( hb_dvd_t * e, hb_list_t * list_title )
+{
+ int ii;
+ uint64_t longest_duration = 0;
+ int longest = -1;
+
+ for ( ii = 0; ii < hb_list_count( list_title ); ii++ )
+ {
+ hb_title_t * title = hb_list_item( list_title, ii );
+ if ( title->duration > longest_duration )
+ {
+ longest_duration = title->duration;
+ longest = title->index;
+ }
+ }
+ return longest;
+}
+
static char * hb_dvdread_name( char * path )
{
static char name[1024];
@@ -1293,6 +1313,11 @@ void hb_dvd_set_angle( hb_dvd_t * d, int angle )
dvd_methods->set_angle(d, angle);
}
+int hb_dvd_main_feature( hb_dvd_t * d, hb_list_t * list_title )
+{
+ return dvd_methods->main_feature(d, list_title);
+}
+
// hb_dvd_set_dvdnav must only be called when no dvd source is open
// it rips the rug out from under things so be careful
void hb_dvd_set_dvdnav( int enable )