changeset 25363:fa776bd7ebc4

Support chapter as a property.
author ulion
date Fri, 14 Dec 2007 08:33:11 +0000
parents 74fbb5173956
children fec8936c8079
files DOCS/tech/slave.txt command.c
diffstat 2 files changed, 80 insertions(+), 35 deletions(-) [+]
line wrap: on
line diff
--- a/DOCS/tech/slave.txt	Fri Dec 14 08:26:06 2007 +0000
+++ b/DOCS/tech/slave.txt	Fri Dec 14 08:33:11 2007 +0000
@@ -455,6 +455,7 @@
 stream_start       pos       0               X            start pos in stream
 stream_end         pos       0               X            end pos in stream
 stream_length      pos       0               X            (end - start)
+chapter            int       0               X   X   X    select chapter
 length             time                      X            length of file in seconds
 percent_pos        int       0       100     X   X   X    position in percent
 time_pos           time      0               X   X   X    position in seconds
--- a/command.c	Fri Dec 14 08:26:06 2007 +0000
+++ b/command.c	Fri Dec 14 08:33:11 2007 +0000
@@ -369,6 +369,82 @@
                                                 mpctx->audio_out));
 }
 
+/// Current chapter (RW)
+static int mp_property_chapter(m_option_t *prop, int action, void *arg,
+                               MPContext *mpctx)
+{
+    int chapter;
+    float next_pts = 0;
+    int chapter_num;
+    int step_all;
+    char *chapter_name = NULL;
+
+    switch (action) {
+    case M_PROPERTY_GET:
+        if (!arg)
+            return M_PROPERTY_ERROR;
+        *(int *) arg = demuxer_get_current_chapter(mpctx->demuxer);
+        return M_PROPERTY_OK;
+    case M_PROPERTY_PRINT: {
+        if (!arg)
+            return M_PROPERTY_ERROR;
+        chapter = demuxer_get_current_chapter(mpctx->demuxer);
+        if (chapter < 0)
+            return M_PROPERTY_UNAVAILABLE;
+        chapter_name = demuxer_chapter_display_name(mpctx->demuxer, chapter);
+        if (!chapter_name)
+            return M_PROPERTY_UNAVAILABLE;
+        *(char **) arg = chapter_name;
+        return M_PROPERTY_OK;
+    }
+    case M_PROPERTY_SET:
+        if (!arg)
+            return M_PROPERTY_ERROR;
+        M_PROPERTY_CLAMP(prop, *(int*)arg);
+        chapter = demuxer_get_current_chapter(mpctx->demuxer);
+        if (chapter < 0)
+            return M_PROPERTY_UNAVAILABLE;
+        step_all = *(int *)arg - (chapter + 1);
+        chapter += step_all;
+        break;
+    case M_PROPERTY_STEP_UP:
+    case M_PROPERTY_STEP_DOWN: {
+        step_all = (arg && *(int*)arg != 0 ? *(int*)arg : 1)
+                   * (action == M_PROPERTY_STEP_UP ? 1 : -1);
+        chapter = demuxer_get_current_chapter(mpctx->demuxer);
+        if (chapter < 0)
+            return M_PROPERTY_UNAVAILABLE;
+        chapter += step_all;
+        if (chapter < 0)
+            chapter = 0;
+        break;
+    }
+    default:
+        return M_PROPERTY_NOT_IMPLEMENTED;
+    }
+    rel_seek_secs = 0;
+    abs_seek_pos = 0;
+    chapter = demuxer_seek_chapter(mpctx->demuxer, chapter, 1,
+                                   &next_pts, &chapter_num, &chapter_name);
+    if (chapter >= 0) {
+        if (next_pts > -1.0) {
+            abs_seek_pos = 1;
+            rel_seek_secs = next_pts;
+        }
+        if (chapter_name)
+            set_osd_msg(OSD_MSG_TEXT, 1, osd_duration,
+                        MSGTR_OSDChapter, chapter + 1, chapter_name);
+    }
+    else if (step_all > 0)
+        rel_seek_secs = 1000000000.;
+    else
+        set_osd_msg(OSD_MSG_TEXT, 1, osd_duration,
+                    MSGTR_OSDChapter, 0, MSGTR_Unknown);
+    if (chapter_name)
+        free(chapter_name);
+    return M_PROPERTY_OK;
+}
+
 /// Demuxer meta data
 static int mp_property_metadata(m_option_t * prop, int action, void *arg,
                                 MPContext * mpctx) {
@@ -1809,6 +1885,8 @@
      M_OPT_RANGE, 0, 100, NULL },
     { "time_pos", mp_property_time_pos, CONF_TYPE_TIME,
      M_OPT_MIN, 0, 0, NULL },
+    { "chapter", mp_property_chapter, CONF_TYPE_INT,
+     M_OPT_MIN, 1, 0, NULL },
     { "metadata", mp_property_metadata, CONF_TYPE_STRING_LIST,
      0, 0, 0, NULL },
 
@@ -1998,6 +2076,7 @@
 } set_prop_cmd[] = {
     // general
     { "loop", MP_CMD_LOOP, 0, 0, -1, MSGTR_LoopStatus },
+    { "chapter", MP_CMD_SEEK_CHAPTER, 0, 0, -1, NULL },
     // audio
     { "volume", MP_CMD_VOLUME, 0, OSD_VOLUME, -1, MSGTR_Volume },
     { "mute", MP_CMD_MUTE, 1, 0, -1, MSGTR_MuteStatus },
@@ -2902,41 +2981,6 @@
 	    mplayer_put_key(cmd->args[0].v.i);
 	    break;
 
-	case MP_CMD_SEEK_CHAPTER:{
-		int seek = cmd->args[0].v.i;
-		int abs = (cmd->nargs > 1) ? cmd->args[1].v.i : 0;
-		int chap;
-		float next_pts = 0;
-		int num_chapters;
-		char *chapter_name;
-
-		rel_seek_secs = 0;
-		abs_seek_pos = 0;
-		chap =
-		    demuxer_seek_chapter(mpctx->demuxer, seek, abs,
-					 &next_pts, &num_chapters,
-					 &chapter_name);
-		if (chap != -1) {
-		    if (next_pts > -1.0) {
-			abs_seek_pos = 1;
-			rel_seek_secs = next_pts;
-		    }
-		    if (chapter_name) {
-			set_osd_msg(OSD_MSG_TEXT, 1, osd_duration,
-				    MSGTR_OSDChapter, chap + 1, chapter_name);
-			free(chapter_name);
-		    }
-		} else {
-		    if (seek > 0)
-			rel_seek_secs = 1000000000.;
-		    else
-			set_osd_msg(OSD_MSG_TEXT, 1, osd_duration,
-				    MSGTR_OSDChapter, 0, MSGTR_Unknown);
-		}
-		break;
-	    }
-	    break;
-
 	case MP_CMD_SET_MOUSE_POS:{
 		int pointer_x, pointer_y;
 		double dx, dy;