summaryrefslogtreecommitdiffstats
path: root/player/command.c
diff options
context:
space:
mode:
Diffstat (limited to 'player/command.c')
-rw-r--r--player/command.c1105
1 files changed, 599 insertions, 506 deletions
diff --git a/player/command.c b/player/command.c
index 87c91f295e..85823371f3 100644
--- a/player/command.c
+++ b/player/command.c
@@ -129,11 +129,12 @@ static char *format_delay(double time)
return talloc_asprintf(NULL, "%d ms", ROUND(time * 1000));
}
-// Property-option bridge.
-static int mp_property_generic_option(struct m_option *prop, int action,
- void *arg, MPContext *mpctx)
+// Property-option bridge. (Maps the property to the option with the same name.)
+static int mp_property_generic_option(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
- char *optname = prop->priv;
+ MPContext *mpctx = ctx;
+ const char *optname = prop->name;
struct m_config_option *opt = m_config_get_co(mpctx->mconfig,
bstr0(optname));
void *valptr = opt->data;
@@ -153,9 +154,10 @@ static int mp_property_generic_option(struct m_option *prop, int action,
}
/// Playback speed (RW)
-static int mp_property_playback_speed(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_playback_speed(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct MPOpts *opts = mpctx->opts;
double orig_speed = opts->playback_speed;
switch (action) {
@@ -171,34 +173,36 @@ static int mp_property_playback_speed(m_option_t *prop, int action,
*(char **)arg = talloc_asprintf(NULL, "x %6.2f", orig_speed);
return M_PROPERTY_OK;
}
- return mp_property_generic_option(prop, action, arg, mpctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
/// filename with path (RO)
-static int mp_property_path(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_path(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->filename)
return M_PROPERTY_UNAVAILABLE;
- return m_property_strdup_ro(prop, action, arg, mpctx->filename);
+ return m_property_strdup_ro(action, arg, mpctx->filename);
}
-static int mp_property_filename(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_filename(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->filename)
return M_PROPERTY_UNAVAILABLE;
char *filename = talloc_strdup(NULL, mpctx->filename);
if (mp_is_url(bstr0(filename)))
mp_url_unescape_inplace(filename);
char *f = (char *)mp_basename(filename);
- int r = m_property_strdup_ro(prop, action, arg, f[0] ? f : filename);
+ int r = m_property_strdup_ro(action, arg, f[0] ? f : filename);
talloc_free(filename);
return r;
}
-static int mp_property_file_size(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_file_size(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
if (!mpctx->stream)
@@ -208,54 +212,51 @@ static int mp_property_file_size(m_option_t *prop, int action, void *arg,
if (stream_control(mpctx->stream, STREAM_CTRL_GET_SIZE, &size) != STREAM_OK)
return M_PROPERTY_UNAVAILABLE;
- switch (action) {
- case M_PROPERTY_GET: {
- *(int64_t *)arg = size;
- return M_PROPERTY_OK;
- }
- case M_PROPERTY_PRINT: {
+ if (action == M_PROPERTY_PRINT) {
*(char **)arg = format_file_size(size);
return M_PROPERTY_OK;
}
- }
- return M_PROPERTY_NOT_IMPLEMENTED;
+ return m_property_int64_ro(action, arg, size);
}
-static int mp_property_media_title(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_media_title(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
char *name = NULL;
if (mpctx->resolve_result)
name = mpctx->resolve_result->title;
if (name && name[0])
- return m_property_strdup_ro(prop, action, arg, name);
+ return m_property_strdup_ro(action, arg, name);
if (mpctx->master_demuxer) {
name = demux_info_get(mpctx->master_demuxer, "title");
if (name && name[0])
- return m_property_strdup_ro(prop, action, arg, name);
+ return m_property_strdup_ro(action, arg, name);
struct stream *stream = mpctx->master_demuxer->stream;
if (stream_control(stream, STREAM_CTRL_GET_DISC_NAME, &name) > 0
&& name) {
- int r = m_property_strdup_ro(prop, action, arg, name);
+ int r = m_property_strdup_ro(action, arg, name);
talloc_free(name);
return r;
}
}
- return mp_property_filename(prop, action, arg, mpctx);
+ return mp_property_filename(ctx, prop, action, arg);
}
-static int mp_property_stream_path(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_stream_path(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct stream *stream = mpctx->stream;
if (!stream || !stream->url)
return M_PROPERTY_UNAVAILABLE;
- return m_property_strdup_ro(prop, action, arg, stream->url);
+ return m_property_strdup_ro(action, arg, stream->url);
}
-static int mp_property_stream_capture(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_stream_capture(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->stream)
return M_PROPERTY_UNAVAILABLE;
@@ -264,52 +265,54 @@ static int mp_property_stream_capture(m_option_t *prop, int action,
stream_set_capture_file(mpctx->stream, filename);
// fall through to mp_property_generic_option
}
- return mp_property_generic_option(prop, action, arg, mpctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
/// Demuxer name (RO)
-static int mp_property_demuxer(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_demuxer(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer)
return M_PROPERTY_UNAVAILABLE;
- return m_property_strdup_ro(prop, action, arg, demuxer->desc->name);
+ return m_property_strdup_ro(action, arg, demuxer->desc->name);
}
/// Position in the stream (RW)
-static int mp_property_stream_pos(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_stream_pos(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct stream *stream = mpctx->stream;
if (!stream)
return M_PROPERTY_UNAVAILABLE;
- switch (action) {
- case M_PROPERTY_GET:
- *(int64_t *) arg = stream_tell(stream);
- return M_PROPERTY_OK;
- case M_PROPERTY_SET:
+ if (action == M_PROPERTY_SET) {
stream_seek(stream, *(int64_t *) arg);
return M_PROPERTY_OK;
}
- return M_PROPERTY_NOT_IMPLEMENTED;
+ return m_property_int64_ro(action, arg, stream_tell(stream));
}
/// Stream end offset (RO)
-static int mp_property_stream_end(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_stream_end(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
- return mp_property_file_size(prop, action, arg, mpctx);
+ return mp_property_file_size(ctx, prop, action, arg);
}
// Does some magic to handle "<name>/full" as time formatted with milliseconds.
// Assumes prop is the type of the actual property.
-static int property_time(m_option_t *prop, int action, void *arg, double time)
+static int property_time(int action, void *arg, double time)
{
+ const struct m_option time_type = {.type = CONF_TYPE_TIME};
switch (action) {
case M_PROPERTY_GET:
*(double *)arg = time;
return M_PROPERTY_OK;
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = time_type;
+ return M_PROPERTY_OK;
case M_PROPERTY_KEY_ACTION: {
struct m_property_action_arg *ka = arg;
@@ -324,7 +327,7 @@ static int property_time(m_option_t *prop, int action, void *arg, double time)
*(char **)ka->arg = mp_format_time(time, true);
return M_PROPERTY_OK;
case M_PROPERTY_GET_TYPE:
- *(struct m_option *)ka->arg = *prop;
+ *(struct m_option *)ka->arg = time_type;
return M_PROPERTY_OK;
}
}
@@ -333,9 +336,10 @@ static int property_time(m_option_t *prop, int action, void *arg, double time)
}
/// Current stream position in seconds (RO)
-static int mp_property_stream_time_pos(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_stream_time_pos(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->demuxer;
if (!demuxer)
return M_PROPERTY_UNAVAILABLE;
@@ -343,57 +347,62 @@ static int mp_property_stream_time_pos(m_option_t *prop, int action,
if (pts == MP_NOPTS_VALUE)
return M_PROPERTY_UNAVAILABLE;
- return property_time(prop, action, arg, pts);
+ return property_time(action, arg, pts);
}
/// Media length in seconds (RO)
-static int mp_property_length(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_length(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
double len;
if (!(int) (len = get_time_length(mpctx)))
return M_PROPERTY_UNAVAILABLE;
- return property_time(prop, action, arg, len);
+ return property_time(action, arg, len);
}
-static int mp_property_avsync(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_avsync(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->d_audio || !mpctx->d_video)
return M_PROPERTY_UNAVAILABLE;
if (mpctx->last_av_difference == MP_NOPTS_VALUE)
return M_PROPERTY_UNAVAILABLE;
- return m_property_double_ro(prop, action, arg, mpctx->last_av_difference);
+ return m_property_double_ro(action, arg, mpctx->last_av_difference);
}
-static int mp_property_total_avsync_change(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_total_avsync_change(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->d_audio || !mpctx->d_video)
return M_PROPERTY_UNAVAILABLE;
if (mpctx->total_avsync_change == MP_NOPTS_VALUE)
return M_PROPERTY_UNAVAILABLE;
- return m_property_double_ro(prop, action, arg, mpctx->total_avsync_change);
+ return m_property_double_ro(action, arg, mpctx->total_avsync_change);
}
/// Late frames
-static int mp_property_drop_frame_cnt(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_drop_frame_cnt(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->d_video)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, mpctx->drop_frame_cnt);
+ return m_property_int_ro(action, arg, mpctx->drop_frame_cnt);
}
/// Current position in percent (RW)
-static int mp_property_percent_pos(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_percent_pos(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->num_sources)
return M_PROPERTY_UNAVAILABLE;
@@ -410,6 +419,14 @@ static int mp_property_percent_pos(m_option_t *prop, int action,
*(double *)arg = pos;
return M_PROPERTY_OK;
}
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){
+ .type = CONF_TYPE_DOUBLE,
+ .flags = M_OPT_RANGE,
+ .min = 0,
+ .max = 100,
+ };
+ return M_PROPERTY_OK;
case M_PROPERTY_PRINT:
*(char **)arg = talloc_asprintf(NULL, "%d", get_percent_pos(mpctx));
return M_PROPERTY_OK;
@@ -417,19 +434,21 @@ static int mp_property_percent_pos(m_option_t *prop, int action,
return M_PROPERTY_NOT_IMPLEMENTED;
}
-static int mp_property_time_start(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_time_start(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
double start = get_start_time(mpctx);
if (start < 0)
return M_PROPERTY_UNAVAILABLE;
- return property_time(prop, action, arg, start);
+ return property_time(action, arg, start);
}
/// Current position in seconds (RW)
-static int mp_property_time_pos(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_time_pos(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->num_sources)
return M_PROPERTY_UNAVAILABLE;
@@ -437,7 +456,7 @@ static int mp_property_time_pos(m_option_t *prop, int action,
queue_seek(mpctx, MPSEEK_ABSOLUTE, *(double *)arg, 0, true);
return M_PROPERTY_OK;
}
- return property_time(prop, action, arg, get_current_time(mpctx));
+ return property_time(action, arg, get_current_time(mpctx));
}
static bool time_remaining(MPContext *mpctx, double *remaining)
@@ -451,31 +470,33 @@ static bool time_remaining(MPContext *mpctx, double *remaining)
return len > 0;
}
-static int mp_property_remaining(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_remaining(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
double remaining;
- if (!time_remaining(mpctx, &remaining))
+ if (!time_remaining(ctx, &remaining))
return M_PROPERTY_UNAVAILABLE;
- return property_time(prop, action, arg, remaining);
+ return property_time(action, arg, remaining);
}
-static int mp_property_playtime_remaining(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_playtime_remaining(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
double remaining;
if (!time_remaining(mpctx, &remaining))
return M_PROPERTY_UNAVAILABLE;
double speed = mpctx->opts->playback_speed;
- return property_time(prop, action, arg, remaining / speed);
+ return property_time(action, arg, remaining / speed);
}
/// Current BD/DVD title (RW)
-static int mp_property_disc_title(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_disc_title(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer || !demuxer->stream)
return M_PROPERTY_UNAVAILABLE;
@@ -487,29 +508,37 @@ static int mp_property_disc_title(m_option_t *prop, int action, void *arg,
return M_PROPERTY_UNAVAILABLE;
*(int*)arg = title;
return M_PROPERTY_OK;
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){
+ .type = CONF_TYPE_INT,
+ .flags = M_OPT_MIN,
+ .min = -1,
+ };
+ return M_PROPERTY_OK;
case M_PROPERTY_SET:
title = *(int*)arg;
if (stream_control(stream, STREAM_CTRL_SET_CURRENT_TITLE, &title) <= 0)
return M_PROPERTY_NOT_IMPLEMENTED;
return M_PROPERTY_OK;
- default:
- return M_PROPERTY_NOT_IMPLEMENTED;
}
+ return M_PROPERTY_NOT_IMPLEMENTED;
}
-static int mp_property_disc_menu(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_disc_menu(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
int state = mp_nav_in_menu(mpctx);
if (state < 0)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, !!state);
+ return m_property_flag_ro(action, arg, !!state);
}
/// Current chapter (RW)
-static int mp_property_chapter(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_chapter(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
int chapter = get_current_chapter(mpctx);
if (chapter < -1)
return M_PROPERTY_UNAVAILABLE;
@@ -518,6 +547,14 @@ static int mp_property_chapter(m_option_t *prop, int action, void *arg,
case M_PROPERTY_GET:
*(int *) arg = chapter;
return M_PROPERTY_OK;
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){
+ .type = CONF_TYPE_INT,
+ .flags = M_OPT_MIN | M_OPT_MAX,
+ .min = -1,
+ .max = get_chapter_count(mpctx) - 1,
+ };
+ return M_PROPERTY_OK;
case M_PROPERTY_PRINT: {
*(char **) arg = chapter_display_name(mpctx, chapter);
return M_PROPERTY_OK;
@@ -571,9 +608,10 @@ static int get_chapter_entry(int item, int action, void *arg, void *ctx)
return r;
}
-static int mp_property_list_chapters(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_list_chapters(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
int count = get_chapter_count(mpctx);
if (action == M_PROPERTY_PRINT) {
int cur = mpctx->num_sources ? get_current_chapter(mpctx) : -1;
@@ -603,9 +641,10 @@ static int mp_property_list_chapters(m_option_t *prop, int action, void *arg,
return m_property_read_list(action, arg, count, get_chapter_entry, mpctx);
}
-static int mp_property_edition(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_edition(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct MPOpts *opts = mpctx->opts;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer)
@@ -661,9 +700,10 @@ static int get_edition_entry(int item, int action, void *arg, void *ctx)
return m_property_read_sub(props, action, arg);
}
-static int property_list_editions(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int property_list_editions(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer)
return M_PROPERTY_UNAVAILABLE;
@@ -721,9 +761,10 @@ static struct mp_resolve_src *find_source(struct mp_resolve_result *res,
return res->srcs[src];
}
-static int mp_property_quvi_format(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_quvi_format(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct MPOpts *opts = mpctx->opts;
struct mp_resolve_result *res = mpctx->resolve_result;
if (!res || !res->num_srcs)
@@ -766,49 +807,53 @@ static int mp_property_quvi_format(m_option_t *prop, int action, void *arg,
}
}
char *fmt = res->srcs[pos]->encid;
- return mp_property_quvi_format(prop, M_PROPERTY_SET, &fmt, mpctx);
+ return mp_property_quvi_format(mpctx, prop, M_PROPERTY_SET, &fmt);
}
}
- return mp_property_generic_option(prop, action, arg, mpctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
/// Number of titles in BD/DVD
-static int mp_property_disc_titles(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_disc_titles(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
unsigned int num_titles;
if (!demuxer || stream_control(demuxer->stream, STREAM_CTRL_GET_NUM_TITLES,
&num_titles) < 1)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, num_titles);
+ return m_property_int_ro(action, arg, num_titles);
}
/// Number of chapters in file
-static int mp_property_chapters(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_chapters(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->num_sources)
return M_PROPERTY_UNAVAILABLE;
int count = get_chapter_count(mpctx);
- return m_property_int_ro(prop, action, arg, count);
+ return m_property_int_ro(action, arg, count);
}
-static int mp_property_editions(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_editions(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer)
return M_PROPERTY_UNAVAILABLE;
if (demuxer->num_editions <= 0)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, demuxer->num_editions);
+ return m_property_int_ro(action, arg, demuxer->num_editions);
}
/// Current dvd angle (RW)
-static int mp_property_angle(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_angle(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
int angle = -1;
int angles;
@@ -866,8 +911,7 @@ static int get_tag_entry(int item, int action, void *arg, void *ctx)
return m_property_read_sub(props, action, arg);
}
-static int tag_property(m_option_t *prop, int action, void *arg,
- struct mp_tags *tags)
+static int tag_property(int action, void *arg, struct mp_tags *tags)
{
switch (action) {
case M_PROPERTY_GET: {
@@ -935,30 +979,33 @@ static int tag_property(m_option_t *prop, int action, void *arg,
}
/// Demuxer meta data
-static int mp_property_metadata(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_metadata(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
if (!demuxer)
return M_PROPERTY_UNAVAILABLE;
- return tag_property(prop, action, arg, demuxer->metadata);
+ return tag_property(action, arg, demuxer->metadata);
}
-static int mp_property_chapter_metadata(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_chapter_metadata(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct demuxer *demuxer = mpctx->master_demuxer;
int chapter = get_current_chapter(mpctx);
if (!demuxer || chapter < 0 || chapter >= demuxer->num_chapters)
return M_PROPERTY_UNAVAILABLE;
- return tag_property(prop, action, arg, demuxer->chapters[chapter].metadata);
+ return tag_property(action, arg, demuxer->chapters[chapter].metadata);
}
-static int mp_property_vf_metadata(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_vf_metadata(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!(mpctx->d_video && mpctx->d_video->vfilter))
return M_PROPERTY_UNAVAILABLE;
struct vf_chain *vf = mpctx->d_video->vfilter;
@@ -983,10 +1030,9 @@ static int mp_property_vf_metadata(m_option_t *prop, int action, void *arg,
if (strlen(rem)) {
struct m_property_action_arg next_ka = *ka;
next_ka.key = rem;
- return tag_property(prop, M_PROPERTY_KEY_ACTION, &next_ka,
- &vf_metadata);
+ return tag_property(M_PROPERTY_KEY_ACTION, &next_ka, &vf_metadata);
} else {
- return tag_property(prop, ka->action, ka->arg, &vf_metadata);
+ return tag_property(ka->action, ka->arg, &vf_metadata);
}
return M_PROPERTY_OK;
default:
@@ -997,8 +1043,8 @@ static int mp_property_vf_metadata(m_option_t *prop, int action, void *arg,
return M_PROPERTY_NOT_IMPLEMENTED;
}
-static int mp_property_pause(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_pause(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
@@ -1010,35 +1056,35 @@ static int mp_property_pause(m_option_t *prop, int action, void *arg,
}
return M_PROPERTY_OK;
}
- return mp_property_generic_option(prop, action, arg, ctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
-static int mp_property_core_idle(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_core_idle(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
- return m_property_int_ro(prop, action, arg, mpctx->paused);
+ return m_property_flag_ro(action, arg, mpctx->paused);
}
-static int mp_property_eof_reached(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_eof_reached(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
- return m_property_int_ro(prop, action, arg, mpctx->eof_reached);
+ return m_property_flag_ro(action, arg, mpctx->eof_reached);
}
-static int mp_property_cache(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_cache(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
int cache = mp_get_cache_percent(mpctx);
if (cache < 0)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, cache);
+ return m_property_int_ro(action, arg, cache);
}
-static int mp_property_cache_size(m_option_t *prop, int action, void *arg,
- void *ctx)
+static int mp_property_cache_size(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
MPContext *mpctx = ctx;
if (!mpctx->stream)
@@ -1052,6 +1098,13 @@ static int mp_property_cache_size(m_option_t *prop, int action, void *arg,
*(int *)arg = size / 1024;
return M_PROPERTY_OK;
}
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){
+ .type = CONF_TYPE_INT,
+ .flags = M_OPT_MIN,
+ .min = 0,
+ };
+ return M_PROPERTY_OK;
case M_PROPERTY_SET: {
int64_t size = *(int *)arg * 1024LL;
int r = stream_control(mpctx->stream, STREAM_CTRL_SET_CACHE_SIZE, &size);
@@ -1065,40 +1118,51 @@ static int mp_property_cache_size(m_option_t *prop, int action, void *arg,
return M_PROPERTY_NOT_IMPLEMENTED;
}
-static int mp_property_paused_for_cache(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_paused_for_cache(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
- return m_property_int_ro(prop, action, arg, mpctx->paused_for_cache);
+ MPContext *mpctx = ctx;
+ return m_property_flag_ro(action, arg, mpctx->paused_for_cache);
}
-static int mp_property_clock(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_clock(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
char outstr[6];
time_t t = time(NULL);
struct tm *tmp = localtime(&t);
if ((tmp != NULL) && (strftime(outstr, sizeof(outstr), "%H:%M", tmp) == 5))
- return m_property_strdup_ro(prop, action, arg, outstr);
+ return m_property_strdup_ro(action, arg, outstr);
return M_PROPERTY_UNAVAILABLE;
}
-static int mp_property_seekable(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_seekable(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->demuxer)
return M_PROPERTY_UNAVAILABLE;
- return m_property_int_ro(prop, action, arg, !!mpctx->demuxer->seekable);
+ return m_property_flag_ro(action, arg, mpctx->demuxer->seekable);
}
/// Volume (RW)
-static int mp_property_volume(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_volume(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
switch (action) {
case M_PROPERTY_GET:
mixer_getbothvolume(mpctx->mixer, arg);
return M_PROPERTY_OK;
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){
+ .type = CONF_TYPE_FLOAT,
+ .flags = M_OPT_RANGE,
+ .min = 0,
+ .max = 100,
+ };
+ return M_PROPERTY_OK;
case M_PROPERTY_GET_NEUTRAL:
*(float *)arg = mixer_getneutralvolume(mpctx->mixer);
return M_PROPERTY_OK;
@@ -1125,9 +1189,10 @@ static int mp_property_volume(m_option_t *prop, int action, void *arg,
}
/// Mute (RW)
-static int mp_property_mute(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_mute(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
switch (action) {
case M_PROPERTY_SET:
if (!mixer_audio_initialized(mpctx->mixer))
@@ -1137,13 +1202,17 @@ static int mp_property_mute(m_option_t *prop, int action, void *arg,
case M_PROPERTY_GET:
*(int *)arg = mixer_getmute(mpctx->mixer);
return M_PROPERTY_OK;
+ case M_PROPERTY_GET_TYPE:
+ *(struct m_option *)arg = (struct m_option){.type = CONF_TYPE_FLAG};
+ return M_PROPERTY_OK;
}
return M_PROPERTY_NOT_IMPLEMENTED;
}
-static int mp_property_volrestore(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_volrestore(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
switch (action) {
case M_PROPERTY_GET: {
char *s = mixer_get_volume_restore_data(mpctx->mixer);
@@ -1153,13 +1222,14 @@ static int mp_property_volrestore(m_option_t *prop, int action,
case M_PROPERTY_SET:
return M_PROPERTY_NOT_IMPLEMENTED;
}
- return mp_property_generic_option(prop, action, arg, mpctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
/// Audio delay (RW)
-static int mp_property_audio_delay(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_audio_delay(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!(mpctx->d_audio && mpctx->d_video))
return M_PROPERTY_UNAVAILABLE;
float delay = mpctx->opts->audio_delay;
@@ -1172,66 +1242,63 @@ static int mp_property_audio_delay(m_option_t *prop, int action,
mpctx->delay += mpctx->audio_delay - delay;
return M_PROPERTY_OK;
}
- return mp_property_generic_option(prop, action, arg, mpctx);
+ return mp_property_generic_option(mpctx, prop, action, arg);
}
/// Audio codec tag (RO)
-static int mp_property_audio_format(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_audio_format(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
const char *c = mpctx->d_audio ? mpctx->d_audio->header->codec : NULL;
- return m_property_strdup_ro(prop, action, arg, c);
+ return m_property_strdup_ro(action, arg, c);
}
/// Audio codec name (RO)
-static int mp_property_audio_codec(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_audio_codec(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
const char *c = mpctx->d_audio ? mpctx->d_audio->decoder_desc : NULL;
- return m_property_strdup_ro(prop, action, arg, c);
+ return m_property_strdup_ro(action, arg, c);
}
/// Audio bitrate (RO)
-static int mp_property_audio_bitrate(m_option_t *prop, int action,
- void *arg, MPContext *mpctx)
+static int mp_property_audio_bitrate(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
if (!mpctx->d_audio)
return M_PROPERTY_UNAVAILABLE;
- switch (action) {
- case M_PROPERTY_PRINT:
+ if (action == M_PROPERTY_PRINT) {
*(char **)arg = format_bitrate(mpctx->d_audio->bitrate);
return M_PROPERTY_OK;
- case M_PROPERTY_GET:
- *(int *)arg = mpctx->d_audio->bitrate;
- return M_PROPERTY_OK;
}
- return M_PROPERTY_NOT_IMPLEMENTED;
+ return m_property_int_ro(action, arg, mpctx->d_audio->bitrate);
}
/// Samplerate (RO)
-static int mp_property_samplerate(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_samplerate(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx = ctx;
struct mp_audio fmt = {0};
if (mpctx->d_audio)
mp_audio_buffer_get_format(mpctx->d_audio->decode_buffer, &fmt);
if (!fmt.rate)
return M_PROPERTY_UNAVAILABLE;
- switch (action) {
- case M_PROPERTY_PRINT:
+ if (action == M_PROPERTY_PRINT) {
*(char **)arg = talloc_asprintf(NULL, "%d kHz", fmt.rate / 1000);
return M_PROPERTY_OK;
- case M_PROPERTY_GET:
- *(int *)arg = fmt.rate;
- return M_PROPERTY_OK;
}
- return M_PROPERTY_NOT_IMPLEMENTED;
+ return m_property_int_ro(action, arg, fmt.rate);
}
/// Number of channels (RO)
-static int mp_property_channels(m_option_t *prop, int action, void *arg,
- MPContext *mpctx)
+static int mp_property_channels(void *ctx, struct m_property *prop,
+ int action, void *arg)
{
+ MPContext *mpctx =