From fdb6ce15df046e6e0117b978d0aa6b4748079fac Mon Sep 17 00:00:00 2001 From: diego Date: Sun, 1 Aug 2010 22:48:01 +0000 Subject: stream_dvd: fix incorrect assumption about chapter count Fix the incorrect assumption that the number of chapters of a DVD title is equal to the number of cells. patch by Olivier Rolland, billl users.sourceforge net git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@31893 b3059339-0415-0410-9bf9-f77b7e298cf2 --- stream/stream_dvd.c | 48 ++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 38 insertions(+), 10 deletions(-) (limited to 'stream') diff --git a/stream/stream_dvd.c b/stream/stream_dvd.c index 27c0350d22..939c20177a 100644 --- a/stream/stream_dvd.c +++ b/stream/stream_dvd.c @@ -449,6 +449,23 @@ static int mp_describe_titleset(dvd_reader_t *dvd, tt_srpt_t *tt_srpt, int vts_n return 1; } +static int get_num_chapter(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no) +{ + if(!vts_file || !tt_srpt) + return 0; + + if(title_no < 0 || title_no >= tt_srpt->nr_of_srpts) + return 0; + + // map global title to vts title + title_no = tt_srpt->title[title_no].vts_ttn - 1; + + if(title_no < 0 || title_no >= vts_file->vts_ptt_srpt->nr_of_srpts) + return 0; + + return vts_file->vts_ptt_srpt->title[title_no].nr_of_ptts; +} + static int seek_to_chapter(stream_t *stream, ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no, int chapter) { int cell; @@ -483,27 +500,36 @@ static int seek_to_chapter(stream_t *stream, ifo_handle_t *vts_file, tt_srpt_t * return chapter; } -static void list_chapters(pgc_t *pgc) +static void list_chapters(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no) { - unsigned int i, cell; + unsigned int i, cell, last_cell; unsigned int t=0, t2=0; + ptt_info_t *ptt; + pgc_t *pgc; - if(pgc->nr_of_programs < 2) + title_no = tt_srpt->title[title_no].vts_ttn - 1; + if(vts_file->vts_ptt_srpt->title[title_no].nr_of_ptts < 2) return; + ptt = vts_file->vts_ptt_srpt->title[title_no].ptt; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "CHAPTERS: "); - for(i=0; inr_of_programs; i++) + for(i=0; ivts_ptt_srpt->title[title_no].nr_of_ptts; i++) { - cell = pgc->program_map[i]; //here the cell is 1-based + pgc = vts_file->vts_pgcit->pgci_srp[ptt[i].pgcn-1].pgc; + cell = pgc->program_map[ptt[i].pgn-1]; //here the cell is 1-based + if(ptt[i].pgnnr_of_programs) + last_cell = pgc->program_map[ptt[i].pgn]; + else + last_cell = 0; t2 = t/1000; mp_msg(MSGT_IDENTIFY, MSGL_INFO, "%02d:%02d:%02d,", t2/3600, (t2/60)%60, t2%60); - while(i+1nr_of_programs && cell < pgc->program_map[i+1]) { + do { if(!(pgc->cell_playback[cell-1].block_type == BLOCK_TYPE_ANGLE_BLOCK && pgc->cell_playback[cell-1].block_mode != BLOCK_MODE_FIRST_CELL) ) t += mp_dvdtimetomsec(&pgc->cell_playback[cell-1].playback_time); cell++; - } + } while(cell < last_cell); } mp_msg(MSGT_IDENTIFY, MSGL_INFO, "\n"); } @@ -603,8 +629,10 @@ static int control(stream_t *stream,int cmd,void* arg) } case STREAM_CTRL_GET_NUM_CHAPTERS: { - if(! d->cur_pgc->nr_of_programs) return STREAM_UNSUPPORTED; - *((unsigned int *)arg) = d->cur_pgc->nr_of_programs; + int r; + r = get_num_chapter(d->vts_file, d->tt_srpt, d->cur_title-1); + if(! r) return STREAM_UNSUPPORTED; + *((unsigned int *)arg) = r; return 1; } case STREAM_CTRL_SEEK_TO_CHAPTER: @@ -952,7 +980,7 @@ static int open_s(stream_t *stream,int mode, void* opts, int* file_format) { return STREAM_UNSUPPORTED; for(k=0; kcur_pgc->nr_of_cells; k++) d->cell_times_table[k] = mp_dvdtimetomsec(&d->cur_pgc->cell_playback[k].playback_time); - list_chapters(d->cur_pgc); + list_chapters(vts_file,tt_srpt,dvd_title); // ... (unimplemented) // return NULL; -- cgit v1.2.3