# HG changeset patch # User ib # Date 1325334008 0 # Node ID 206264c532f51acec887a504267aaf8304dcbfda # Parent cd6376c5cc943e4e2353c287c9b53c98c0d6575c Add new stream control command STREAM_CTRL_GET_NUM_TITLES. This provides the total number of titles (aka tracks) of CDs / VCDs / DVDs. Additionally, add a titles property to the get_property slave command. diff -r cd6376c5cc94 -r 206264c532f5 DOCS/tech/slave.txt --- a/DOCS/tech/slave.txt Thu Dec 29 19:42:58 2011 +0000 +++ b/DOCS/tech/slave.txt Sat Dec 31 12:20:08 2011 +0000 @@ -530,6 +530,7 @@ stream_end pos 0 X end pos in stream stream_length pos 0 X (end - start) stream_time_pos time 0 X present position in stream (in seconds) +titles int X number of titles chapter int 0 X X X select chapter chapters int X number of chapters angle int 0 X X X select angle diff -r cd6376c5cc94 -r 206264c532f5 command.c --- a/command.c Thu Dec 29 19:42:58 2011 +0000 +++ b/command.c Sat Dec 31 12:20:08 2011 +0000 @@ -515,6 +515,17 @@ return M_PROPERTY_OK; } +/// Number of titles in file +static int mp_property_titles(m_option_t *prop, int action, void *arg, + MPContext *mpctx) +{ + if (!mpctx->demuxer) + return M_PROPERTY_UNAVAILABLE; + if (mpctx->demuxer->num_titles == 0) + stream_control(mpctx->demuxer->stream, STREAM_CTRL_GET_NUM_TITLES, &mpctx->demuxer->num_titles); + return m_property_int_ro(prop, action, arg, mpctx->demuxer->num_titles); +} + /// Number of chapters in file static int mp_property_chapters(m_option_t *prop, int action, void *arg, MPContext *mpctx) @@ -2142,6 +2153,8 @@ M_OPT_MIN, 0, 0, NULL }, { "chapter", mp_property_chapter, CONF_TYPE_INT, M_OPT_MIN, 0, 0, NULL }, + { "titles", mp_property_titles, CONF_TYPE_INT, + 0, 0, 0, NULL }, { "chapters", mp_property_chapters, CONF_TYPE_INT, 0, 0, 0, NULL }, { "angle", mp_property_angle, CONF_TYPE_INT, diff -r cd6376c5cc94 -r 206264c532f5 libmpdemux/demuxer.h --- a/libmpdemux/demuxer.h Thu Dec 29 19:42:58 2011 +0000 +++ b/libmpdemux/demuxer.h Sat Dec 31 12:20:08 2011 +0000 @@ -263,6 +263,8 @@ // pointer to teletext decoder private data, if demuxer stream contains teletext void *teletext; + int num_titles; + demux_chapter_t* chapters; int num_chapters; diff -r cd6376c5cc94 -r 206264c532f5 stream/stream.h --- a/stream/stream.h Thu Dec 29 19:42:58 2011 +0000 +++ b/stream/stream.h Sat Dec 31 12:20:08 2011 +0000 @@ -98,6 +98,7 @@ #define STREAM_CTRL_GET_NUM_ANGLES 9 #define STREAM_CTRL_GET_ANGLE 10 #define STREAM_CTRL_SET_ANGLE 11 +#define STREAM_CTRL_GET_NUM_TITLES 12 typedef enum { diff -r cd6376c5cc94 -r 206264c532f5 stream/stream_cdda.c --- a/stream/stream_cdda.c Thu Dec 29 19:42:58 2011 +0000 +++ b/stream/stream_cdda.c Sat Dec 31 12:20:08 2011 +0000 @@ -243,6 +243,11 @@ static int control(stream_t *stream, int cmd, void *arg) { cdda_priv* p = stream->priv; switch(cmd) { + case STREAM_CTRL_GET_NUM_TITLES: + { + *(unsigned int *)arg = p->cd->tracks; + return STREAM_OK; + } case STREAM_CTRL_GET_NUM_CHAPTERS: { int start_track = get_track_by_sector(p, p->start_sector); diff -r cd6376c5cc94 -r 206264c532f5 stream/stream_dvd.c --- a/stream/stream_dvd.c Thu Dec 29 19:42:58 2011 +0000 +++ b/stream/stream_dvd.c Sat Dec 31 12:20:08 2011 +0000 @@ -665,6 +665,11 @@ *((double *)arg) = (double) mp_get_titleset_length(d->vts_file, d->tt_srpt, d->cur_title-1)/1000.0; return 1; } + case STREAM_CTRL_GET_NUM_TITLES: + { + *((unsigned int *)arg) = d->vmg_file->tt_srpt->nr_of_srpts; + return 1; + } case STREAM_CTRL_GET_NUM_CHAPTERS: { int r; diff -r cd6376c5cc94 -r 206264c532f5 stream/stream_vcd.c --- a/stream/stream_vcd.c Thu Dec 29 19:42:58 2011 +0000 +++ b/stream/stream_vcd.c Sat Dec 31 12:20:08 2011 +0000 @@ -92,6 +92,7 @@ static int control(stream_t *stream, int cmd, void *arg) { struct stream_priv_s *p = stream->priv; switch(cmd) { + case STREAM_CTRL_GET_NUM_TITLES: case STREAM_CTRL_GET_NUM_CHAPTERS: { mp_vcd_priv_t *vcd = vcd_read_toc(stream->fd);