diff options
Diffstat (limited to 'player/command.c')
-rw-r--r-- | player/command.c | 155 |
1 files changed, 90 insertions, 65 deletions
diff --git a/player/command.c b/player/command.c index bcac0828e0..0673ecb032 100644 --- a/player/command.c +++ b/player/command.c @@ -114,6 +114,7 @@ struct command_ctx { char **script_props; mpv_node udata; + mpv_node mdata; double cached_window_scale; }; @@ -126,6 +127,10 @@ static const struct m_option udata_type = { .type = CONF_TYPE_NODE }; +static const struct m_option mdata_type = { + .type = CONF_TYPE_NODE +}; + struct overlay { struct mp_image *source; int x, y; @@ -154,12 +159,15 @@ struct load_action { bool play; }; -// U+279C HEAVY ROUND-TIPPED RIGHTWARDS ARROW +// U+25CB WHITE CIRCLE +// U+25CF BLACK CIRCLE // U+00A0 NO-BREAK SPACE -#define ARROW_SP "\342\236\234\302\240" +#define WHITECIRCLE "\xe2\x97\x8b" +#define BLACKCIRCLE "\xe2\x97\x8f" +#define NBSP "\xc2\xa0" -const char list_current[] = OSD_ASS_0 ARROW_SP OSD_ASS_1; -const char list_normal[] = OSD_ASS_0 "{\\alpha&HFF}" ARROW_SP "{\\r}" OSD_ASS_1; +const char list_current[] = BLACKCIRCLE NBSP; +const char list_normal[] = WHITECIRCLE NBSP; static int edit_filters(struct MPContext *mpctx, struct mp_log *log, enum stream_type mediatype, @@ -1821,28 +1829,6 @@ static int mp_property_audio_delay(void *ctx, struct m_property *prop, return mp_property_generic_option(mpctx, prop, action, arg); } -/// Audio codec tag (RO) -static int mp_property_audio_codec_name(void *ctx, struct m_property *prop, - int action, void *arg) -{ - MPContext *mpctx = ctx; - struct track *track = mpctx->current_track[0][STREAM_AUDIO]; - const char *c = track && track->stream ? track->stream->codec->codec : NULL; - return m_property_strdup_ro(action, arg, c); -} - -/// Audio codec name (RO) -static int mp_property_audio_codec(void *ctx, struct m_property *prop, - int action, void *arg) -{ - MPContext *mpctx = ctx; - struct track *track = mpctx->current_track[0][STREAM_AUDIO]; - char desc[256] = ""; - if (track && track->dec) - mp_decoder_wrapper_get_desc(track->dec, desc, sizeof(desc)); - return m_property_strdup_ro(action, arg, desc[0] ? desc : NULL); -} - static int property_audiofmt(struct mp_aframe *fmt, int action, void *arg) { if (!fmt || !mp_aframe_config_is_valid(fmt)) @@ -1991,10 +1977,6 @@ static int get_track_entry(int item, int action, void *arg, void *ctx) struct mp_codec_params p = track->stream ? *track->stream->codec : (struct mp_codec_params){0}; - char decoder_desc[256] = {0}; - if (track->dec) - mp_decoder_wrapper_get_desc(track->dec, decoder_desc, sizeof(decoder_desc)); - bool has_rg = track->stream && track->stream->codec->replaygain_data; struct replaygain_data rg = has_rg ? *track->stream->codec->replaygain_data : (struct replaygain_data){0}; @@ -2043,10 +2025,16 @@ static int get_track_entry(int item, int action, void *arg, void *ctx) .unavailable = !track->hls_bitrate}, {"program-id", SUB_PROP_INT(track->program_id), .unavailable = track->program_id < 0}, - {"decoder-desc", SUB_PROP_STR(decoder_desc), - .unavailable = !decoder_desc[0]}, + {"decoder", SUB_PROP_STR(p.decoder), + .unavailable = !p.decoder}, + {"decoder-desc", SUB_PROP_STR(p.decoder_desc), + .unavailable = !p.decoder_desc}, {"codec", SUB_PROP_STR(p.codec), .unavailable = !p.codec}, + {"codec-desc", SUB_PROP_STR(p.codec_desc), + .unavailable = !p.codec_desc}, + {"codec-profile", SUB_PROP_STR(p.codec_profile), + .unavailable = !p.codec_profile}, {"demux-w", SUB_PROP_INT(p.disp_w), .unavailable = !p.disp_w}, {"demux-h", SUB_PROP_INT(p.disp_h), .unavailable = !p.disp_h}, {"demux-crop-x",SUB_PROP_INT(p.crop.x0), .unavailable = !has_crop}, @@ -2256,28 +2244,6 @@ static int mp_property_frame_count(void *ctx, struct m_property *prop, return m_property_int_ro(action, arg, frames); } -/// Video codec tag (RO) -static int mp_property_video_format(void *ctx, struct m_property *prop, - int action, void *arg) -{ - MPContext *mpctx = ctx; - struct track *track = mpctx->current_track[0][STREAM_VIDEO]; - const char *c = track && track->stream ? track->stream->codec->codec : NULL; - return m_property_strdup_ro(action, arg, c); -} - -/// Video codec name (RO) -static int mp_property_video_codec(void *ctx, struct m_property *prop, - int action, void *arg) -{ - MPContext *mpctx = ctx; - struct track *track = mpctx->current_track[0][STREAM_VIDEO]; - char desc[256] = ""; - if (track && track->dec) - mp_decoder_wrapper_get_desc(track->dec, desc, sizeof(desc)); - return m_property_strdup_ro(action, arg, desc[0] ? desc : NULL); -} - static const char *get_aspect_ratio_name(double ratio) { // Depending on cropping/mastering exact ratio may differ. @@ -3055,6 +3021,20 @@ static int mp_property_sub_text(void *ctx, struct m_property *prop, int sub_index = def[0]; int type = def[1]; + if (action == M_PROPERTY_KEY_ACTION) { + struct m_property_action_arg *ka = arg; + + if (!strcmp(ka->key, "ass")) + type = SD_TEXT_TYPE_ASS; + else if (!strcmp(ka->key, "ass-full")) + type = SD_TEXT_TYPE_ASS_FULL; + else + return M_PROPERTY_UNKNOWN; + + action = ka->action; + arg = ka->arg; + } + struct track *track = mpctx->current_track[sub_index][STREAM_SUB]; struct dec_sub *sub = track ? track->d_sub : NULL; double pts = mpctx->playback_pts; @@ -3096,7 +3076,7 @@ static int mp_property_sub_start(void *ctx, struct m_property *prop, double start = get_times(ctx, prop, action, arg).start; if (start == MP_NOPTS_VALUE) return M_PROPERTY_UNAVAILABLE; - return m_property_double_ro(action, arg, start); + return property_time(action, arg, start); } @@ -3106,7 +3086,7 @@ static int mp_property_sub_end(void *ctx, struct m_property *prop, double end = get_times(ctx, prop, action, arg).end; if (end == MP_NOPTS_VALUE) return M_PROPERTY_UNAVAILABLE; - return m_property_double_ro(action, arg, end); + return property_time(action, arg, end); } static int mp_property_playlist_current_pos(void *ctx, struct m_property *prop, @@ -3730,6 +3710,35 @@ static int mp_property_bindings(void *ctx, struct m_property *prop, return M_PROPERTY_NOT_IMPLEMENTED; } +static int mp_property_mdata(void *ctx, struct m_property *prop, + int action, void *arg) +{ + MPContext *mpctx = ctx; + mpv_node *node = &mpctx->command_ctx->mdata; + + switch (action) { + case M_PROPERTY_GET_TYPE: + *(struct m_option *)arg = (struct m_option){.type = CONF_TYPE_NODE}; + return M_PROPERTY_OK; + case M_PROPERTY_GET: + case M_PROPERTY_GET_NODE: + m_option_copy(&mdata_type, arg, node); + return M_PROPERTY_OK; + case M_PROPERTY_SET: + case M_PROPERTY_SET_NODE: { + m_option_copy(&mdata_type, node, arg); + talloc_steal(mpctx->command_ctx, node_get_alloc(node)); + mp_notify_property(mpctx, prop->name); + + struct vo *vo = mpctx->video_out; + if (vo) + vo_control(vo, VOCTRL_UPDATE_MENU, arg); + return M_PROPERTY_OK; + } + } + return M_PROPERTY_NOT_IMPLEMENTED; +} + static int do_list_udata(int item, int action, void *arg, void *ctx); struct udata_ctx { @@ -3990,8 +3999,8 @@ static const struct m_property mp_properties_base[] = { {"ao-volume", mp_property_ao_volume}, {"ao-mute", mp_property_ao_mute}, {"audio-delay", mp_property_audio_delay}, - {"audio-codec-name", mp_property_audio_codec_name}, - {"audio-codec", mp_property_audio_codec}, + M_PROPERTY_ALIAS("audio-codec-name", "current-tracks/audio/codec"), + M_PROPERTY_ALIAS("audio-codec", "current-tracks/audio/codec-desc"), {"audio-params", mp_property_audio_params}, {"audio-out-params", mp_property_audio_out_params}, {"aid", property_switch_track, .priv = (void *)(const int[]){0, STREAM_AUDIO}}, @@ -4004,9 +4013,9 @@ static const struct m_property mp_properties_base[] = { {"video-out-params", mp_property_vo_imgparams}, {"video-dec-params", mp_property_dec_imgparams}, {"video-params", mp_property_vd_imgparams}, - {"video-format", mp_property_video_format}, {"video-frame-info", mp_property_video_frame_info}, - {"video-codec", mp_property_video_codec}, + M_PROPERTY_ALIAS("video-format", "current-tracks/video/codec"), + M_PROPERTY_ALIAS("video-codec", "current-tracks/video/codec-desc"), M_PROPERTY_ALIAS("dwidth", "video-out-params/dw"), M_PROPERTY_ALIAS("dheight", "video-out-params/dh"), M_PROPERTY_ALIAS("width", "video-params/w"), @@ -4053,8 +4062,7 @@ static const struct m_property mp_properties_base[] = { .priv = (void *)&(const int[]){0, SD_TEXT_TYPE_PLAIN}}, {"secondary-sub-text", mp_property_sub_text, .priv = (void *)&(const int[]){1, SD_TEXT_TYPE_PLAIN}}, - {"sub-text-ass", mp_property_sub_text, - .priv = (void *)&(const int[]){0, SD_TEXT_TYPE_ASS}}, + M_PROPERTY_DEPRECATED_ALIAS("sub-text-ass", "sub-text/ass"), {"sub-start", mp_property_sub_start, .priv = (void *)&(const int){0}}, {"secondary-sub-start", mp_property_sub_start, @@ -4109,6 +4117,8 @@ static const struct m_property mp_properties_base[] = { {"command-list", mp_property_commands}, {"input-bindings", mp_property_bindings}, + {"menu-data", mp_property_mdata}, + {"user-data", mp_property_udata}, {"term-size", mp_property_term_size}, @@ -4150,10 +4160,10 @@ static const char *const *const mp_event_property_change[] = { "video-format", "video-codec", "video-bitrate", "dwidth", "dheight", "width", "height", "container-fps", "aspect", "aspect-name", "vo-configured", "current-vo", "video-dec-params", "osd-dimensions", "hwdec", "hwdec-current", "hwdec-interop", - "window-id"), + "window-id", "track-list", "current-tracks"), E(MPV_EVENT_AUDIO_RECONFIG, "audio-format", "audio-codec", "audio-bitrate", "samplerate", "channels", "audio", "volume", "volume-gain", "mute", - "current-ao", "audio-codec-name", "audio-params", + "current-ao", "audio-codec-name", "audio-params", "track-list", "current-tracks", "audio-out-params", "volume-max", "volume-gain-min", "volume-gain-max", "mixer-active"), E(MPV_EVENT_SEEK, "seeking", "core-idle", "eof-reached"), E(MPV_EVENT_PLAYBACK_RESTART, "seeking", "core-idle", "eof-reached"), @@ -6567,6 +6577,16 @@ static void cmd_begin_vo_dragging(void *p) vo_control(vo, VOCTRL_BEGIN_DRAGGING, NULL); } +static void cmd_context_menu(void *p) +{ + struct mp_cmd_ctx *cmd = p; + struct MPContext *mpctx = cmd->mpctx; + struct vo *vo = mpctx->video_out; + + if (vo) + vo_control(vo, VOCTRL_SHOW_MENU, NULL); +} + /* This array defines all known commands. * The first field the command name used in libmpv and input.conf. * The second field is the handler function (see mp_cmd_def.handler and @@ -7039,6 +7059,8 @@ const struct mp_cmd_def mp_cmds[] = { { "begin-vo-dragging", cmd_begin_vo_dragging }, + { "context-menu", cmd_context_menu }, + {0} }; @@ -7123,6 +7145,9 @@ void command_init(struct MPContext *mpctx) ctx->properties[count++] = prop; } + node_init(&ctx->mdata, MPV_FORMAT_NODE_ARRAY, NULL); + talloc_steal(ctx, ctx->mdata.u.list); + node_init(&ctx->udata, MPV_FORMAT_NODE_MAP, NULL); talloc_steal(ctx, ctx->udata.u.list); talloc_free(prop_names); @@ -7294,7 +7319,7 @@ void mp_option_change_callback(void *ctx, struct m_config_option *co, int flags, } if (opt_ptr == &opts->vo->video_driver_list || - opt_ptr == &opts->ra_ctx_opts->context_name || + opt_ptr == &opts->ra_ctx_opts->context_list || opt_ptr == &opts->ra_ctx_opts->context_type) { struct track *track = mpctx->current_track[0][STREAM_VIDEO]; uninit_video_out(mpctx); |