stream: remove old chapter handling code

Stream-level chapters (like DVD etc.) did potentially not have
timestamps for each chapter, so STREAM_CTRL_SEEK_TO_CHAPTER and
STREAM_CTRL_GET_CURRENT_CHAPTER were needed to navigate chapters. We've
switched everything to use timestamps and that seems to work, so we can
simplify the code and remove this old mechanism.
This commit is contained in:
wm4 2014-03-25 01:38:18 +01:00
parent 7bd3f26481
commit 2c693a4732
7 changed files with 11 additions and 144 deletions

View File

@ -902,46 +902,23 @@ static void add_stream_chapters(struct demuxer *demuxer)
int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, double *seek_pts) int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, double *seek_pts)
{ {
int ris = STREAM_UNSUPPORTED; if (chapter >= demuxer->num_chapters)
return -1;
if (chapter < 0)
chapter = 0;
if (demuxer->num_chapters == 0) *seek_pts = demuxer->chapters[chapter].start / 1e9;
ris = stream_control(demuxer->stream, STREAM_CTRL_SEEK_TO_CHAPTER,
&chapter);
if (ris != STREAM_UNSUPPORTED) { return chapter;
demux_flush(demuxer);
demux_control(demuxer, DEMUXER_CTRL_RESYNC, NULL);
// exit status may be ok, but main() doesn't have to seek itself
// (because e.g. dvds depend on sectors, not on pts)
*seek_pts = -1.0;
return chapter;
} else {
if (chapter >= demuxer->num_chapters)
return -1;
if (chapter < 0)
chapter = 0;
*seek_pts = demuxer->chapters[chapter].start / 1e9;
return chapter;
}
} }
int demuxer_get_current_chapter(demuxer_t *demuxer, double time_now) int demuxer_get_current_chapter(demuxer_t *demuxer, double time_now)
{ {
int chapter = -2; int chapter = -2;
if (!demuxer->num_chapters || !demuxer->chapters) { uint64_t now = time_now * 1e9 + 0.5;
if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER, for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
&chapter) == STREAM_UNSUPPORTED) if (demuxer->chapters[chapter].start <= now)
chapter = -2; break;
} else {
uint64_t now = time_now * 1e9 + 0.5;
for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
if (demuxer->chapters[chapter].start <= now)
break;
}
} }
return chapter; return chapter;
} }

View File

@ -570,8 +570,7 @@ int get_chapter_count(struct MPContext *mpctx)
return 0; return 0;
} }
// Seek to a given chapter. Tries to queue the seek, but might seek immediately // Seek to a given chapter. Queues the seek.
// in some cases. Returns success, no matter if seek is queued or immediate.
bool mp_seek_chapter(struct MPContext *mpctx, int chapter) bool mp_seek_chapter(struct MPContext *mpctx, int chapter)
{ {
int num = get_chapter_count(mpctx); int num = get_chapter_count(mpctx);
@ -592,12 +591,6 @@ bool mp_seek_chapter(struct MPContext *mpctx, int chapter)
} else if (mpctx->master_demuxer) { } else if (mpctx->master_demuxer) {
int res = demuxer_seek_chapter(mpctx->master_demuxer, chapter, &pts); int res = demuxer_seek_chapter(mpctx->master_demuxer, chapter, &pts);
if (res >= 0) { if (res >= 0) {
if (pts == -1) {
// for DVD/BD - seek happened via stream layer
seek_reset(mpctx, true, true);
mpctx->seek = (struct seek_params){0};
return true;
}
chapter = res; chapter = res;
goto do_seek; goto do_seek;
} }

View File

@ -407,7 +407,6 @@ static bool control_needs_flush(int stream_ctrl)
{ {
switch (stream_ctrl) { switch (stream_ctrl) {
case STREAM_CTRL_SEEK_TO_TIME: case STREAM_CTRL_SEEK_TO_TIME:
case STREAM_CTRL_SEEK_TO_CHAPTER:
case STREAM_CTRL_SET_ANGLE: case STREAM_CTRL_SET_ANGLE:
case STREAM_CTRL_SET_CURRENT_TITLE: case STREAM_CTRL_SET_CURRENT_TITLE:
return true; return true;

View File

@ -70,8 +70,6 @@ enum streamtype {
enum stream_ctrl { enum stream_ctrl {
STREAM_CTRL_GET_TIME_LENGTH = 1, STREAM_CTRL_GET_TIME_LENGTH = 1,
STREAM_CTRL_SEEK_TO_CHAPTER,
STREAM_CTRL_GET_CURRENT_CHAPTER,
STREAM_CTRL_GET_NUM_CHAPTERS, STREAM_CTRL_GET_NUM_CHAPTERS,
STREAM_CTRL_GET_CURRENT_TIME, STREAM_CTRL_GET_CURRENT_TIME,
STREAM_CTRL_SEEK_TO_TIME, STREAM_CTRL_SEEK_TO_TIME,

View File

@ -161,33 +161,6 @@ static int bluray_stream_control(stream_t *s, int cmd, void *arg)
return 1; return 1;
} }
case STREAM_CTRL_GET_CURRENT_CHAPTER: {
*((unsigned int *) arg) = bd_get_current_chapter(b->bd);
return 1;
}
case STREAM_CTRL_SEEK_TO_CHAPTER: {
BLURAY_TITLE_INFO *ti;
int chapter = *((unsigned int *) arg);
int64_t pos;
int r;
ti = bd_get_title_info(b->bd, b->current_title, b->current_angle);
if (!ti)
return STREAM_UNSUPPORTED;
if (chapter < 0 || chapter > ti->chapter_count) {
bd_free_title_info(ti);
return STREAM_UNSUPPORTED;
}
pos = bd_chapter_pos(b->bd, chapter);
r = bluray_stream_seek(s, pos);
bd_free_title_info(ti);
return r ? 1 : STREAM_UNSUPPORTED;
}
case STREAM_CTRL_GET_TIME_LENGTH: { case STREAM_CTRL_GET_TIME_LENGTH: {
BLURAY_TITLE_INFO *ti; BLURAY_TITLE_INFO *ti;

View File

@ -427,49 +427,6 @@ static int get_num_chapter(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title
return vts_file->vts_ptt_srpt->title[title_no].nr_of_ptts; 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)
{
dvd_priv_t *d = stream->priv;
ptt_info_t ptt;
pgc_t *pgc;
int64_t pos;
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;
if(chapter < 0 || chapter > vts_file->vts_ptt_srpt->title[title_no].nr_of_ptts-1) //no such chapter
return 0;
ptt = vts_file->vts_ptt_srpt->title[title_no].ptt[chapter];
pgc = vts_file->vts_pgcit->pgci_srp[ptt.pgcn-1].pgc;
d->cur_cell = pgc->program_map[ptt.pgn - 1] - 1;
if(pgc->cell_playback[d->cur_cell].block_type == BLOCK_TYPE_ANGLE_BLOCK)
d->cur_cell += dvd_angle-1;
d->cur_pack = pgc->cell_playback[d->cur_cell].first_sector;
d->cell_last_pack = pgc->cell_playback[d->cur_cell].last_sector;
d->packs_left = -1;
d->angle_seek = 0;
pos = (int64_t) d->cur_pack * 2048;
stream_seek(stream, pos);
MP_VERBOSE(stream, "\r\nSTREAM_DVD, seeked to chapter: %d, cell: %u, pos: %"PRIu64"\n",
chapter, d->cur_pack, pos);
return chapter;
}
// p: in=chapter number, out=PTS // p: in=chapter number, out=PTS
static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no, double *p) static int get_chapter_time(ifo_handle_t *vts_file, tt_srpt_t *tt_srpt, int title_no, double *p)
{ {
@ -642,24 +599,11 @@ static int control(stream_t *stream,int cmd,void* arg)
if(! r) return STREAM_UNSUPPORTED; if(! r) return STREAM_UNSUPPORTED;
return 1; return 1;
} }
case STREAM_CTRL_SEEK_TO_CHAPTER:
{
int r;
r = seek_to_chapter(stream, d->vts_file, d->tt_srpt, d->cur_title, *((unsigned int *)arg));
if(! r) return STREAM_UNSUPPORTED;
return 1;
}
case STREAM_CTRL_GET_CURRENT_TITLE: case STREAM_CTRL_GET_CURRENT_TITLE:
{ {
*((unsigned int *)arg) = d->cur_title; *((unsigned int *)arg) = d->cur_title;
return 1; return 1;
} }
case STREAM_CTRL_GET_CURRENT_CHAPTER:
{
*((unsigned int *)arg) = dvd_chapter_from_cell(d, d->cur_title, d->cur_cell);
return 1;
}
case STREAM_CTRL_GET_CURRENT_TIME: case STREAM_CTRL_GET_CURRENT_TIME:
{ {
double tm; double tm;

View File

@ -466,17 +466,6 @@ static int control(stream_t *stream, int cmd, void *arg)
int tit, part; int tit, part;
switch (cmd) { switch (cmd) {
case STREAM_CTRL_SEEK_TO_CHAPTER: {
int chap = *(unsigned int *)arg + 1;
if (chap < 1)
break;
if (dvdnav_current_title_info(dvdnav, &tit, &part) != DVDNAV_STATUS_OK)
break;
if (dvdnav_part_play(dvdnav, tit, chap) != DVDNAV_STATUS_OK)
break;
return 1;
}
case STREAM_CTRL_GET_NUM_CHAPTERS: { case STREAM_CTRL_GET_NUM_CHAPTERS: {
if (dvdnav_current_title_info(dvdnav, &tit, &part) != DVDNAV_STATUS_OK) if (dvdnav_current_title_info(dvdnav, &tit, &part) != DVDNAV_STATUS_OK)
break; break;
@ -502,12 +491,6 @@ static int control(stream_t *stream, int cmd, void *arg)
free(parts); free(parts);
return 1; return 1;
} }
case STREAM_CTRL_GET_CURRENT_CHAPTER: {
if (dvdnav_current_title_info(dvdnav, &tit, &part) != DVDNAV_STATUS_OK)
break;
*(unsigned int *)arg = part - 1;
return 1;
}
case STREAM_CTRL_GET_TIME_LENGTH: { case STREAM_CTRL_GET_TIME_LENGTH: {
if (priv->duration) { if (priv->duration) {
*(double *)arg = (double)priv->duration / 1000.0; *(double *)arg = (double)priv->duration / 1000.0;