+static int track_type_from_name(const char *psz_name)
+{
+ if( !strcmp( psz_name, "video-es" ) )
+ return libvlc_track_video;
+ else if( !strcmp( psz_name, "audio-es" ) )
+ return libvlc_track_audio;
+ else if( !strcmp( psz_name, "spu-es" ) )
+ return libvlc_track_text;
+ else
+ return libvlc_track_unknown;
+}
+
+static int input_es_changed( vlc_object_t *p_this,
+ char const *psz_cmd,
+ int action,
+ vlc_value_t *p_val,
+ void *p_userdata )
+{
+ VLC_UNUSED(p_this);
+ libvlc_media_player_t *mp = p_userdata;
+ libvlc_event_t event;
+
+ /* Ignore the "Disable" element */
+ if (p_val && p_val->i_int < 0)
+ return VLC_EGENERIC;
+
+ switch (action)
+ {
+ case VLC_VAR_ADDCHOICE:
+ event.type = libvlc_MediaPlayerESAdded;
+ break;
+ case VLC_VAR_DELCHOICE:
+ case VLC_VAR_CLEARCHOICES:
+ event.type = libvlc_MediaPlayerESDeleted;
+ break;
+ default:
+ return VLC_EGENERIC;
+ }
+
+ event.u.media_player_es_changed.i_type = track_type_from_name(psz_cmd);
+
+ int i_id;
+ if (action != VLC_VAR_CLEARCHOICES)
+ {
+ if (!p_val)
+ return VLC_EGENERIC;
+ i_id = p_val->i_int;
+ }
+ else
+ {
+ /* -1 means all ES tracks of this type were deleted. */
+ i_id = -1;
+ }
+ event.u.media_player_es_changed.i_id = i_id;
+
+ libvlc_event_send(mp->p_event_manager, &event);
+
+ return VLC_SUCCESS;
+}
+
+static int
+input_es_selected( vlc_object_t * p_this, char const * psz_cmd,
+ vlc_value_t oldval, vlc_value_t newval,
+ void * p_userdata )
+{
+ VLC_UNUSED(p_this);
+ VLC_UNUSED(oldval);
+ libvlc_media_player_t *mp = p_userdata;
+ libvlc_event_t event;
+
+ event.type = libvlc_MediaPlayerESSelected;
+ event.u.media_player_es_changed.i_type = track_type_from_name(psz_cmd);
+ event.u.media_player_es_changed.i_id = newval.i_int;
+
+ libvlc_event_send(mp->p_event_manager, &event);
+
+ return VLC_SUCCESS;
+}
+