1
0
mirror of https://github.com/mpv-player/mpv synced 2025-03-11 08:37:59 +00:00

Support chapter as a property.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@25391 b3059339-0415-0410-9bf9-f77b7e298cf2
This commit is contained in:
ulion 2007-12-14 08:33:11 +00:00
parent 00f27965e5
commit d5e868e7cb
2 changed files with 80 additions and 35 deletions

View File

@ -455,6 +455,7 @@ stream_pos pos 0 X X position in stream
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

114
command.c
View File

@ -369,6 +369,82 @@ static int mp_property_time_pos(m_option_t * prop, int action,
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 @@ static m_option_t mp_properties[] = {
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 @@ static struct {
} 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 @@ int run_command(MPContext * mpctx, mp_cmd_t * cmd)
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;