[libbluray-devel] [PATCH 2/2] Fix current chapter lookup

John Stebbins stebbins at jetheaddev.com
Fri Apr 8 22:10:19 CEST 2016


...and simplify

If the current position is before the first chapter in the current clip,
chapter lookup fails.  This can be seen in US Star Wars IV release where
chapter events jump from chapter 3 back to 1.
---
 src/libbluray/bdnav/navigation.c | 18 ++++--------------
 src/libbluray/bdnav/navigation.h |  2 +-
 src/libbluray/bluray.c           |  2 +-
 3 files changed, 6 insertions(+), 16 deletions(-)

diff --git a/src/libbluray/bdnav/navigation.c b/src/libbluray/bdnav/navigation.c
index a263c16..e28eeb9 100644
--- a/src/libbluray/bdnav/navigation.c
+++ b/src/libbluray/bdnav/navigation.c
@@ -734,32 +734,22 @@ NAV_CLIP* nav_chapter_search(NAV_TITLE *title, unsigned chapter, uint32_t *clip_
     return clip;
 }
 
-uint32_t nav_chapter_get_current(NAV_CLIP *clip, uint32_t clip_pkt)
+uint32_t nav_chapter_get_current(NAV_TITLE * title, uint32_t title_pkt)
 {
     NAV_MARK * mark;
-    NAV_TITLE *title;
     uint32_t ii;
 
-    // Clip can be null if we haven't started the first clip yet
-    if (clip == NULL) {
+    if (title == NULL) {
         return 0;
     }
-    title = clip->title;
     for (ii = 0; ii < title->chap_list.count; ii++) {
         mark = &title->chap_list.mark[ii];
-        if (mark->clip_ref > clip->ref)
-        {
-            if (ii)
-                return ii-1;
-            else
-                return 0;
-        }
-        if (mark->clip_ref == clip->ref && mark->clip_pkt <= clip_pkt) {
+        if (mark->title_pkt <= title_pkt) {
             if ( ii == title->chap_list.count - 1 ) {
                 return ii;
             }
             mark = &title->chap_list.mark[ii+1];
-            if (mark->clip_ref != clip->ref || mark->clip_pkt > clip_pkt) {
+            if (mark->title_pkt > title_pkt) {
                 return ii;
             }
         }
diff --git a/src/libbluray/bdnav/navigation.h b/src/libbluray/bdnav/navigation.h
index 67a020a..113d813 100644
--- a/src/libbluray/bdnav/navigation.h
+++ b/src/libbluray/bdnav/navigation.h
@@ -146,7 +146,7 @@ BD_PRIVATE NAV_CLIP* nav_packet_search(NAV_TITLE *title, uint32_t pkt, uint32_t
 BD_PRIVATE NAV_CLIP* nav_time_search(NAV_TITLE *title, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt);
 BD_PRIVATE void nav_clip_time_search(NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uint32_t *out_pkt);
 BD_PRIVATE NAV_CLIP* nav_chapter_search(NAV_TITLE *title, unsigned chapter, uint32_t *clip_pkt, uint32_t *out_pkt);
-BD_PRIVATE uint32_t nav_chapter_get_current(NAV_CLIP *clip, uint32_t clip_pkt);
+BD_PRIVATE uint32_t nav_chapter_get_current(NAV_TITLE *title, uint32_t title_pkt);
 BD_PRIVATE NAV_CLIP* nav_mark_search(NAV_TITLE *title, unsigned mark, uint32_t *clip_pkt, uint32_t *out_pkt);
 BD_PRIVATE uint32_t nav_angle_change_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *time);
 BD_PRIVATE NAV_CLIP* nav_set_angle(NAV_TITLE *title, NAV_CLIP *clip, unsigned angle);
diff --git a/src/libbluray/bluray.c b/src/libbluray/bluray.c
index f9f2502..b760a49 100644
--- a/src/libbluray/bluray.c
+++ b/src/libbluray/bluray.c
@@ -1678,7 +1678,7 @@ uint32_t bd_get_current_chapter(BLURAY *bd)
     bd_mutex_lock(&bd->mutex);
 
     if (bd->title) {
-        ret = nav_chapter_get_current(bd->st0.clip, SPN(bd->st0.clip_pos));
+        ret = nav_chapter_get_current(bd->title, SPN(bd->s_pos));
     }
 
     bd_mutex_unlock(&bd->mutex);
-- 
2.5.5



More information about the libbluray-devel mailing list