[MPlayer-cvslog] r31893 - trunk/stream/stream_dvd.c
diego
subversion at mplayerhq.hu
Mon Aug 2 00:48:01 CEST 2010
Author: diego
Date: Mon Aug 2 00:48:01 2010
New Revision: 31893
Log:
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
Modified:
trunk/stream/stream_dvd.c
Modified: trunk/stream/stream_dvd.c
==============================================================================
--- trunk/stream/stream_dvd.c Sun Aug 1 23:06:51 2010 (r31892)
+++ trunk/stream/stream_dvd.c Mon Aug 2 00:48:01 2010 (r31893)
@@ -93,7 +93,7 @@ int dvd_parse_chapter_range(const m_opti
dvd_chapter = 1;
dvd_last_chapter = 0;
if(*range && isdigit(*range)) {
- dvd_chapter = strtol(range, &s, 10);
+ dvd_chapter = strtol(range, (char **) &s, 10);
if(range == s) {
mp_msg(MSGT_OPEN, MSGL_ERR, MSGTR_DVDinvalidChapterRange, range);
return M_OPT_INVALID;
@@ -488,6 +488,23 @@ static int mp_describe_titleset(dvd_read
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;
@@ -522,27 +539,36 @@ static int seek_to_chapter(stream_t *str
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; i<pgc->nr_of_programs; i++)
+ for(i=0; i<vts_file->vts_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].pgn<pgc->nr_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+1<pgc->nr_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");
}
@@ -642,8 +668,10 @@ static int control(stream_t *stream,int
}
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:
@@ -991,7 +1019,7 @@ static int open_s(stream_t *stream,int m
return STREAM_UNSUPPORTED;
for(k=0; k<d->cur_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;
More information about the MPlayer-cvslog
mailing list