diff options
author | jstebbins <[email protected]> | 2011-06-07 18:33:00 +0000 |
---|---|---|
committer | jstebbins <[email protected]> | 2011-06-07 18:33:00 +0000 |
commit | 67ea7b336383310f92188257a71665fc50cb115c (patch) | |
tree | 7a2415a5f7aab768fb927fd1fb50763f04e45453 /libhb/bd.c | |
parent | 87e093a0582acfd32b9d59cd3eda94fb9129b4a2 (diff) |
libhb: Sort BD titles by playlist id
This makes the logs of different rips more consistent. Previously, the
order of titles was determined by the order the mpls files were written
in the PLAYLIST directory which could vary from rip to rip.
git-svn-id: svn://svn.handbrake.fr/HandBrake/trunk@4027 b64f7644-9d1e-0410-96f1-a4d463321fa5
Diffstat (limited to 'libhb/bd.c')
-rw-r--r-- | libhb/bd.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/libhb/bd.c b/libhb/bd.c index 07d31f767..536769307 100644 --- a/libhb/bd.c +++ b/libhb/bd.c @@ -15,6 +15,7 @@ struct hb_bd_s char * path; BLURAY * bd; int title_count; + BLURAY_TITLE_INFO ** title_info; uint64_t pkt_count; hb_stream_t * stream; int chapter; @@ -25,6 +26,7 @@ struct hb_bd_s * Local prototypes **********************************************************************/ static int next_packet( BLURAY *bd, uint8_t *pkt ); +static int title_info_compare_mpls(const void *, const void *); /*********************************************************************** * hb_bd_init @@ -34,6 +36,7 @@ static int next_packet( BLURAY *bd, uint8_t *pkt ); hb_bd_t * hb_bd_init( char * path ) { hb_bd_t * d; + int ii; d = calloc( sizeof( hb_bd_t ), 1 ); @@ -54,6 +57,12 @@ hb_bd_t * hb_bd_init( char * path ) hb_log( "bd: not a bd - trying as a stream/file instead" ); goto fail; } + d->title_info = calloc( sizeof( BLURAY_TITLE_INFO* ) , d->title_count ); + for ( ii = 0; ii < d->title_count; ii++ ) + { + d->title_info[ii] = bd_get_title_info( d->bd, ii ); + } + qsort(d->title_info, d->title_count, sizeof( BLURAY_TITLE_INFO* ), title_info_compare_mpls ); d->path = strdup( path ); return d; @@ -181,7 +190,7 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration ) title->vts = 0; title->ttn = 0; - ti = bd_get_title_info( d->bd, tt - 1 ); + ti = d->title_info[tt - 1]; if ( ti == NULL ) { hb_log( "bd: invalid title" ); @@ -198,7 +207,7 @@ hb_title_t * hb_bd_title_scan( hb_bd_t * d, int tt, uint64_t min_duration ) goto fail; } - hb_deep_log( 2, "bd: Playlist %05d", ti->playlist); + hb_deep_log( 2, "bd: playlist %05d.MPLS", ti->playlist); uint64_t pkt_count = 0; for ( ii = 0; ii < ti->clip_count; ii++ ) @@ -422,7 +431,6 @@ fail: title = NULL; cleanup: - if ( ti ) bd_free_title_info( ti ); return title; } @@ -443,7 +451,7 @@ int hb_bd_main_feature( hb_bd_t * d, hb_list_t * list_title ) for ( ii = 0; ii < hb_list_count( list_title ); ii++ ) { hb_title_t * title = hb_list_item( list_title, ii ); - ti = bd_get_title_info( d->bd, title->index - 1 ); + ti = d->title_info[title->index - 1]; if ( ti ) { BLURAY_STREAM_INFO * bdvideo = &ti->clips[0].video_streams[0]; @@ -466,7 +474,6 @@ int hb_bd_main_feature( hb_bd_t * d, hb_list_t * list_title ) most_chapters = ti->chapter_count; } } - bd_free_title_info( ti ); } else if ( title->duration > longest_duration ) { @@ -489,7 +496,7 @@ int hb_bd_start( hb_bd_t * d, hb_title_t *title ) d->pkt_count = title->block_count; // Calling bd_get_event initializes libbluray event queue. - bd_select_title( d->bd, title->index - 1 ); + bd_select_title( d->bd, d->title_info[title->index - 1]->idx ); bd_get_event( d->bd, &event ); d->chapter = 1; d->stream = hb_bd_stream_open( title ); @@ -636,7 +643,14 @@ int hb_bd_chapter( hb_bd_t * d ) void hb_bd_close( hb_bd_t ** _d ) { hb_bd_t * d = *_d; + int ii; + if ( d->title_info ) + { + for ( ii = 0; ii < d->title_count; ii++ ) + bd_free_title_info( d->title_info[ii] ); + free( d->title_info ); + } if( d->stream ) hb_stream_close( &d->stream ); if( d->bd ) bd_close( d->bd ); @@ -764,3 +778,12 @@ static int next_packet( BLURAY *bd, uint8_t *pkt ) } } +static int title_info_compare_mpls(const void *va, const void *vb) +{ + BLURAY_TITLE_INFO *a, *b; + + a = *(BLURAY_TITLE_INFO**)va; + b = *(BLURAY_TITLE_INFO**)vb; + + return a->playlist - b->playlist; +} |