OSDN Git Service

avplay: add support for seeking to chapter marks
authorAnton Khirnov <anton@khirnov.net>
Wed, 4 Sep 2013 18:30:28 +0000 (20:30 +0200)
committerAnton Khirnov <anton@khirnov.net>
Mon, 10 Feb 2014 10:23:01 +0000 (11:23 +0100)
avplay.c
doc/avplay.texi

index 432db97..b70ee54 100644 (file)
--- a/avplay.c
+++ b/avplay.c
@@ -2601,6 +2601,33 @@ static void toggle_audio_display(void)
     }
 }
 
+static void seek_chapter(VideoState *is, int incr)
+{
+    int64_t pos = get_master_clock(is) * AV_TIME_BASE;
+    int i;
+
+    if (!is->ic->nb_chapters)
+        return;
+
+    /* find the current chapter */
+    for (i = 0; i < is->ic->nb_chapters; i++) {
+        AVChapter *ch = is->ic->chapters[i];
+        if (av_compare_ts(pos, AV_TIME_BASE_Q, ch->start, ch->time_base) < 0) {
+            i--;
+            break;
+        }
+    }
+
+    i += incr;
+    i = FFMAX(i, 0);
+    if (i >= is->ic->nb_chapters)
+        return;
+
+    av_log(NULL, AV_LOG_VERBOSE, "Seeking to chapter %d.\n", i);
+    stream_seek(is, av_rescale_q(is->ic->chapters[i]->start, is->ic->chapters[i]->time_base,
+                                 AV_TIME_BASE_Q), 0, 0);
+}
+
 /* handle an event sent by the GUI */
 static void event_loop(void)
 {
@@ -2646,6 +2673,12 @@ static void event_loop(void)
             case SDLK_w:
                 toggle_audio_display();
                 break;
+            case SDLK_PAGEUP:
+                seek_chapter(cur_stream, 1);
+                break;
+            case SDLK_PAGEDOWN:
+                seek_chapter(cur_stream, -1);
+                break;
             case SDLK_LEFT:
                 incr = -10.0;
                 goto do_seek;
index 4d9af5f..71981f6 100644 (file)
@@ -147,6 +147,9 @@ Seek backward/forward 10 seconds.
 @item down/up
 Seek backward/forward 1 minute.
 
+@item PGDOWN/PGUP
+Seek to the previous/next chapter.
+
 @item mouse click
 Seek to percentage in file corresponding to fraction of width.