summaryrefslogtreecommitdiffstats
path: root/libmpdemux
diff options
context:
space:
mode:
authorulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-13 12:51:05 +0000
committerulion <ulion@b3059339-0415-0410-9bf9-f77b7e298cf2>2007-12-13 12:51:05 +0000
commite34efdf16796e30ae5b7a063d88d2709b4b81368 (patch)
treec495337aad0f178bd14c33608deb70896969a4f4 /libmpdemux
parent66abcc42af42d848725974c1a08fd43ce2053f78 (diff)
downloadmpv-e34efdf16796e30ae5b7a063d88d2709b4b81368.tar.bz2
mpv-e34efdf16796e30ae5b7a063d88d2709b4b81368.tar.xz
Add demuxer functions for chapter feature.
git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25386 b3059339-0415-0410-9bf9-f77b7e298cf2
Diffstat (limited to 'libmpdemux')
-rw-r--r--libmpdemux/demuxer.c71
-rw-r--r--libmpdemux/demuxer.h10
2 files changed, 81 insertions, 0 deletions
diff --git a/libmpdemux/demuxer.c b/libmpdemux/demuxer.c
index 697c8585a0..a666e3c9e3 100644
--- a/libmpdemux/demuxer.c
+++ b/libmpdemux/demuxer.c
@@ -1216,3 +1216,74 @@ int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_
return current;
}
}
+
+int demuxer_get_current_chapter(demuxer_t *demuxer) {
+ int chapter = -1;
+ if (!demuxer->num_chapters || !demuxer->chapters) {
+ if (stream_control(demuxer->stream, STREAM_CTRL_GET_CURRENT_CHAPTER,
+ &chapter) == STREAM_UNSUPPORTED)
+ chapter = -1;
+ }
+ else {
+ sh_video_t *sh_video = demuxer->video->sh;
+ sh_audio_t *sh_audio = demuxer->audio->sh;
+ uint64_t now;
+ now = (sh_video ? sh_video->pts : (sh_audio?sh_audio->pts:0))*1000+0.5;
+ for (chapter = demuxer->num_chapters - 1; chapter >= 0; --chapter) {
+ if (demuxer->chapters[chapter].start <= now)
+ break;
+ }
+ }
+ return chapter;
+}
+
+char *demuxer_chapter_name(demuxer_t *demuxer, int chapter) {
+ if (demuxer->num_chapters && demuxer->chapters) {
+ if (chapter >=0 && chapter < demuxer->num_chapters &&
+ demuxer->chapters[chapter].name)
+ return strdup(demuxer->chapters[chapter].name);
+ }
+ return NULL;
+}
+
+char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter) {
+ char *chapter_name = demuxer_chapter_name(demuxer, chapter);
+ if (chapter_name) {
+ char *tmp = malloc(strlen(chapter_name) + 14);
+ snprintf(tmp, 63, "(%d) %s", chapter + 1, chapter_name);
+ free(chapter_name);
+ return tmp;
+ }
+ else {
+ int chapter_num = demuxer_chapter_count(demuxer);
+ char tmp[30];
+ if (chapter_num <= 0)
+ sprintf(tmp, "(%d)", chapter + 1);
+ else
+ sprintf(tmp, "(%d) of %d", chapter + 1, chapter_num);
+ return strdup(tmp);
+ }
+}
+
+float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end) {
+ if (demuxer->num_chapters && demuxer->chapters && chapter >= 0
+ && chapter < demuxer->num_chapters) {
+ if (end)
+ *end = demuxer->chapters[chapter].end / 1000.0;
+ return demuxer->chapters[chapter].start / 1000.0;
+ }
+ return -1.0;
+}
+
+int demuxer_chapter_count(demuxer_t *demuxer) {
+ if (!demuxer->num_chapters || !demuxer->chapters) {
+ int num_chapters = 0;
+ if (stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_CHAPTERS,
+ &num_chapters) == STREAM_UNSUPPORTED)
+ num_chapters = 0;
+ return num_chapters;
+ }
+ else
+ return demuxer->num_chapters;
+}
+
diff --git a/libmpdemux/demuxer.h b/libmpdemux/demuxer.h
index fc6fa4df07..ef761b37e4 100644
--- a/libmpdemux/demuxer.h
+++ b/libmpdemux/demuxer.h
@@ -387,5 +387,15 @@ extern int get_demuxer_type_from_name(char *demuxer_name, int *force);
int demuxer_add_chapter(demuxer_t* demuxer, const char* name, uint64_t start, uint64_t end);
int demuxer_seek_chapter(demuxer_t *demuxer, int chapter, int mode, float *seek_pts, int *num_chapters, char **chapter_name);
+/// Get current chapter index if available.
+int demuxer_get_current_chapter(demuxer_t *demuxer);
+/// Get chapter name by index if available.
+char *demuxer_chapter_name(demuxer_t *demuxer, int chapter);
+/// Get chapter display name by index.
+char *demuxer_chapter_display_name(demuxer_t *demuxer, int chapter);
+/// Get chapter start time and end time by index if available.
+float demuxer_chapter_time(demuxer_t *demuxer, int chapter, float *end);
+/// Get total chapter number.
+int demuxer_chapter_count(demuxer_t *demuxer);
#endif /* DEMUXER_H */