Mercurial > mplayer.hg
diff mplayer.c @ 19342:4e68a3881201
Add matroska chapter seeking capability.
author | eugeni |
---|---|
date | Sun, 06 Aug 2006 18:55:34 +0000 |
parents | 79b3a37b3b98 |
children | ba95c4fa0684 |
line wrap: on
line diff
--- a/mplayer.c Sun Aug 06 18:02:42 2006 +0000 +++ b/mplayer.c Sun Aug 06 18:55:34 2006 +0000 @@ -4807,6 +4807,50 @@ case MP_CMD_KEYDOWN_EVENTS : { 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 total; + int current; + + if (!demuxer->num_chapters || !demuxer->chapters) { + if (seek > 0) { + abs_seek_pos = 0; + rel_seek_secs = 1000000000.; + } else + set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, MSGTR_OSDChapter, 0, MSGTR_Unknown); + break; + } + + total = demuxer->num_chapters; + + if (abs) { + current = seek; + } else { + uint64_t now; + now = (sh_video ? sh_video->pts : (sh_audio ? sh_audio->pts : 0.)) * 1000 + .5; + + for (current = total - 1; current >= 0; --current) { + demux_chapter_t* chapter = demuxer->chapters + current; + if (chapter->start <= now) + break; + } + current += seek; + } + + if (current < 0) current = 0; + if (current >= total) { + current = total - 1; + abs_seek_pos = 0; + rel_seek_secs = 1000000000.; + } else { + abs_seek_pos = 1; + rel_seek_secs = demuxer->chapters[current].start / 1000.; + } + + set_osd_msg(OSD_MSG_TEXT, 1, osd_duration, MSGTR_OSDChapter, + current, demuxer->chapters[current].name); + } break; default : { #ifdef HAVE_NEW_GUI if ( ( use_gui )&&( cmd->id > MP_CMD_GUI_EVENTS ) ) guiGetEvent( guiIEvent,(char *)cmd->id );