[vlc-devel] [PATCH V2 5/5] player: add vout<->es_id getters

Thomas Guillem thomas at gllm.fr
Fri May 31 09:59:39 CEST 2019


Events are not enough, specially when an interface pops in the middle of a
player playback.
---
 include/vlc_player.h | 34 ++++++++++++++++++++++++++++++++++
 src/input/player.c   | 44 ++++++++++++++++++++++++++++++++++++++++++++
 src/libvlccore.sym   |  2 ++
 3 files changed, 80 insertions(+)

diff --git a/include/vlc_player.h b/include/vlc_player.h
index 3d924e927d..90b8683dbe 100644
--- a/include/vlc_player.h
+++ b/include/vlc_player.h
@@ -1673,6 +1673,40 @@ vlc_player_GetSubtitleTrackAt(vlc_player_t *player, size_t index)
 VLC_API const struct vlc_player_track *
 vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *es_id);
 
+/**
+ * Get and the video output used by a ES identifier
+ *
+ * @warning A same vout can be associated with multiple ES during the lifetime
+ * of the player. The information returned by this function becomes invalid
+ * when the player is unlocked. The returned vout doesn't need to be released,
+ * but must be held with vout_Hold() if it is accessed after the player is
+ * unlocked.
+ *
+ * @param player locked player instance
+ * @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
+ * vlc_player_GetTrackAt())
+ * @return a valid vout or NULL (if the track is disabled, it it's not a video
+ * track, or if the vout failed to start)
+ */
+VLC_API vout_thread_t *
+vlc_player_GetVoutFromEsId(vlc_player_t *player, vlc_es_id_t *es_id);
+
+/**
+ * Get the ES identifier of a video output
+ *
+ * @warning A same vout can be associated with multiple ES during the lifetime
+ * of the player. The information returned by this function becomes invalid
+ * when the player is unlocked. The returned es_id doesn't need to be released,
+ * but must be held with vlc_es_id_Hold() if it accessed after the player is
+ * unlocked.
+ *
+ * @param player locked player instance
+ * @param vout vout (can't be NULL)
+ * @return a valid ES identifier or NULL (if the vout is stopped)
+ */
+VLC_API vlc_es_id_t *
+vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout);
+
 /**
  * Helper to get the selected track from an ES category
  *
diff --git a/src/input/player.c b/src/input/player.c
index 874490e115..3162b042ee 100644
--- a/src/input/player.c
+++ b/src/input/player.c
@@ -53,6 +53,7 @@ static_assert(VLC_PLAYER_TITLE_MENU == INPUT_TITLE_MENU &&
 struct vlc_player_track_priv
 {
     struct vlc_player_track t;
+    vout_thread_t *vout; /* weak reference */
 };
 
 typedef struct VLC_VECTOR(struct vlc_player_program *)
@@ -1301,6 +1302,39 @@ vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *id)
     return trackpriv ? &trackpriv->t : NULL;
 }
 
+vout_thread_t *
+vlc_player_GetVoutFromEsId(vlc_player_t *player, vlc_es_id_t *es_id)
+{
+    struct vlc_player_track_priv *trackpriv =
+        vlc_player_GetPrivTrack(player, es_id);
+    return trackpriv ? trackpriv->vout : NULL;
+}
+
+vlc_es_id_t *
+vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout)
+{
+    struct vlc_player_input *input = vlc_player_get_input_locked(player);
+
+    if (!input)
+        return NULL;
+
+    static const enum es_format_category_e cats[] = {
+        VIDEO_ES, AUDIO_ES /* for visualisation filters */
+    };
+    for (size_t i = 0; i < ARRAY_SIZE(cats); ++i)
+    {
+        enum es_format_category_e cat = cats[i];
+        vlc_player_track_vector *vec =
+            vlc_player_input_GetTrackVector(input, cat);
+        for (size_t j = 0; j < vec->size; ++j)
+        {
+            struct vlc_player_track_priv *trackpriv = vec->data[j];
+            if (trackpriv->vout == vout)
+                return trackpriv->t.es_id;
+        }
+    }
+    return NULL;
+}
 
 static inline const char *
 es_format_category_to_string(enum es_format_category_e cat)
@@ -1828,9 +1862,18 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
     };
 
     vlc_player_t *player = input->player;
+
+    vlc_player_track_vector *vec =
+        vlc_player_input_GetTrackVector(input, vlc_es_id_GetCat(ev->id));
+    struct vlc_player_track_priv *trackpriv =
+        vec ? vlc_player_track_vector_FindById(vec, ev->id, NULL) : NULL;
+    if (!trackpriv)
+        return;
+
     switch (ev->action)
     {
         case VLC_INPUT_EVENT_VOUT_ADDED:
+            trackpriv->vout = ev->vout;
             vlc_player_SendEvent(player, on_vout_changed,
                                  VLC_PLAYER_VOUT_STARTED, ev->vout, ev->id);
 
@@ -1853,6 +1896,7 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
                 var_DelCallback(ev->vout, osd_vars[i],
                                 vlc_player_VoutOSDCallback, player);
 
+            trackpriv->vout = NULL;
             vlc_player_SendEvent(player, on_vout_changed,
                                  VLC_PLAYER_VOUT_STOPPED, ev->vout, ev->id);
             break;
diff --git a/src/libvlccore.sym b/src/libvlccore.sym
index 083ddef896..87190a3573 100644
--- a/src/libvlccore.sym
+++ b/src/libvlccore.sym
@@ -795,6 +795,7 @@ vlc_player_GetAudioDelay
 vlc_player_GetCapabilities
 vlc_player_GetCurrentMedia
 vlc_player_GetError
+vlc_player_GetEsIdFromVout
 vlc_player_GetLength
 vlc_player_GetPosition
 vlc_player_GetProgram
@@ -816,6 +817,7 @@ vlc_player_GetTrack
 vlc_player_GetTrackAt
 vlc_player_GetTrackCount
 vlc_player_GetV4l2Object
+vlc_player_GetVoutFromEsId
 vlc_player_HasTeletextMenu
 vlc_player_IncrementRate
 vlc_player_InvalidateNextMedia
-- 
2.20.1



More information about the vlc-devel mailing list