libbluray | branch: master | john <[email protected]> | Fri Dec 17 11:09:53 2010 -0800| [07cd746a3bd0ce134231d79157d4e44811cd550a] | committer: john
Add protection against corrupt clpi files. clpi_parse can return null when the clpi file is corrupt. so check for NULL clip info before using it. > http://git.videolan.org/gitweb.cgi/libbluray.git/?a=commit;h=07cd746a3bd0ce134231d79157d4e44811cd550a --- src/libbluray/bdnav/navigation.c | 33 ++++++++++++++++++++++++++++----- 1 files changed, 28 insertions(+), 5 deletions(-) diff --git a/src/libbluray/bdnav/navigation.c b/src/libbluray/bdnav/navigation.c index 455bb29..19ae48e 100644 --- a/src/libbluray/bdnav/navigation.c +++ b/src/libbluray/bdnav/navigation.c @@ -280,6 +280,10 @@ uint8_t nav_lookup_aspect(NAV_CLIP *clip, int pid) CLPI_PROG *progs; int ii, jj; + if (clip->cl == NULL) { + return 0; + } + progs = clip->cl->program.progs; for (ii = 0; ii < clip->cl->program.num_prog; ii++) { CLPI_PROG_STREAM *ps = progs[ii].streams; @@ -307,8 +311,12 @@ _fill_mark(NAV_TITLE *title, NAV_MARK *mark, int entry) mark->mark_type = plm->mark_type; mark->clip_ref = plm->play_item_ref; clip = &title->clip_list.clip[mark->clip_ref]; - mark->clip_pkt = clpi_lookup_spn(clip->cl, plm->time, 1, - title->pl->play_item[mark->clip_ref].clip[title->angle].stc_id); + if (clip->cl != NULL) { + mark->clip_pkt = clpi_lookup_spn(clip->cl, plm->time, 1, + title->pl->play_item[mark->clip_ref].clip[title->angle].stc_id); + } else { + mark->clip_pkt = clip->start_pkt; + } mark->title_pkt = clip->title_pkt + mark->clip_pkt; mark->clip_time = plm->time; @@ -622,7 +630,11 @@ NAV_CLIP* nav_packet_search(NAV_TITLE *title, uint32_t pkt, uint32_t *clip_pkt, *clip_pkt = clip->end_pkt; } else { clip = &title->clip_list.clip[ii]; - *clip_pkt = clpi_access_point(clip->cl, pkt - pos + clip->start_pkt, 0, 0, out_time); + if (clip->cl != NULL) { + *clip_pkt = clpi_access_point(clip->cl, pkt - pos + clip->start_pkt, 0, 0, out_time); + } else { + *clip_pkt = clip->start_pkt; + } } if(*out_time < clip->in_time) *out_time = 0; @@ -655,6 +667,9 @@ NAV_CLIP* nav_packet_search(NAV_TITLE *title, uint32_t pkt, uint32_t *clip_pkt, // by the clip. uint32_t nav_angle_change_search(NAV_CLIP *clip, uint32_t pkt, uint32_t *time) { + if (clip->cl == NULL) { + return pkt; + } return clpi_access_point(clip->cl, pkt, 1, 1, time); } @@ -680,8 +695,12 @@ NAV_CLIP* nav_time_search(NAV_TITLE *title, uint32_t tick, uint32_t *clip_pkt, u *clip_pkt = clip->end_pkt; } else { clip = &title->clip_list.clip[ii]; - *clip_pkt = clpi_lookup_spn(clip->cl, tick - pos + pi->in_time, 1, + if (clip->cl != NULL) { + *clip_pkt = clpi_lookup_spn(clip->cl, tick - pos + pi->in_time, 1, title->pl->play_item[clip->ref].clip[clip->angle].stc_id); + } else { + *clip_pkt = clip->start_pkt; + } } *out_pkt = clip->pos + *clip_pkt - clip->start_pkt; return clip; @@ -694,8 +713,12 @@ void nav_clip_time_search(NAV_CLIP *clip, uint32_t tick, uint32_t *clip_pkt, uin if (tick >= clip->out_time) { *clip_pkt = clip->end_pkt; } else { - *clip_pkt = clpi_lookup_spn(clip->cl, tick, 1, + if (clip->cl != NULL) { + *clip_pkt = clpi_lookup_spn(clip->cl, tick, 1, clip->title->pl->play_item[clip->ref].clip[clip->angle].stc_id); + } else { + *clip_pkt = clip->start_pkt; + } } *out_pkt = clip->pos + *clip_pkt - clip->start_pkt; } _______________________________________________ libbluray-devel mailing list [email protected] http://mailman.videolan.org/listinfo/libbluray-devel
