changeset 34386:206264c532f5

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.
author ib
date Sat, 31 Dec 2011 12:20:08 +0000
parents cd6376c5cc94
children 0ba85cad4c7e
files DOCS/tech/slave.txt command.c libmpdemux/demuxer.h stream/stream.h stream/stream_cdda.c stream/stream_dvd.c stream/stream_vcd.c
diffstat 7 files changed, 28 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- 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
--- 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,
--- 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;
 
--- 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 {
--- 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);
--- 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;
--- 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);