mirror of https://code.videolan.org/videolan/vlc
player: get vout and vout_order from VIDEO/SPU es_ids
vlc_player_GetVoutFromEsId() can now return the vout used by an SPU es_id. It also returns the vout order. The on_vout_changed callback is also used for SPU es_ids. Users could check the category of the es_id to know if the vout is attached to a VIDEO es or an SPU one.
This commit is contained in:
parent
8aecdf1835
commit
c896210b00
|
@ -850,12 +850,13 @@ struct vlc_player_cbs
|
|||
* @param player locked player instance
|
||||
* @param action started or stopped
|
||||
* @param vout vout (can't be NULL)
|
||||
* @param order vout order
|
||||
* @param es_id the ES id associated with this vout
|
||||
* @param data opaque pointer set by vlc_player_AddListener()
|
||||
*/
|
||||
void (*on_vout_changed)(vlc_player_t *player,
|
||||
enum vlc_player_vout_action action, vout_thread_t *vout,
|
||||
vlc_es_id_t *es_id, void *data);
|
||||
enum vlc_vout_order order, vlc_es_id_t *es_id, void *data);
|
||||
|
||||
/**
|
||||
* Called when the player is corked
|
||||
|
@ -1703,11 +1704,13 @@ vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *es_id);
|
|||
* @param player locked player instance
|
||||
* @param id an ES ID (retrieved from vlc_player_cbs.on_track_list_changed or
|
||||
* vlc_player_GetTrackAt())
|
||||
* @param order if not null, the order of the vout
|
||||
* @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)
|
||||
* or spu track, or if the vout failed to start)
|
||||
*/
|
||||
VLC_API vout_thread_t *
|
||||
vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id);
|
||||
vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id,
|
||||
enum vlc_vout_order *order);
|
||||
|
||||
/**
|
||||
* Get the ES identifier of a video output
|
||||
|
|
|
@ -400,12 +400,15 @@ on_cork_changed(vlc_player_t *player, unsigned cork_count, void *data)
|
|||
|
||||
static void
|
||||
on_vout_changed(vlc_player_t *player, enum vlc_player_vout_action action,
|
||||
vout_thread_t *vout, vlc_es_id_t *es_id,
|
||||
void *data)
|
||||
vout_thread_t *vout, enum vlc_vout_order order,
|
||||
vlc_es_id_t *es_id, void *data)
|
||||
{
|
||||
(void) action;
|
||||
(void) vout;
|
||||
(void) es_id;
|
||||
(void) order;
|
||||
|
||||
if (vlc_es_id_GetCat(es_id) != VIDEO_ES)
|
||||
return;
|
||||
|
||||
libvlc_media_player_t *mp = data;
|
||||
|
||||
|
|
|
@ -105,6 +105,7 @@ vlc_module_end ()
|
|||
static void player_on_vout_changed(vlc_player_t *player,
|
||||
enum vlc_player_vout_action action,
|
||||
vout_thread_t *vout,
|
||||
enum vlc_vout_order order,
|
||||
vlc_es_id_t *es_id,
|
||||
void *data);
|
||||
static int MovedEvent( vlc_object_t *, char const *,
|
||||
|
@ -392,11 +393,16 @@ static void
|
|||
player_on_vout_changed(vlc_player_t *player,
|
||||
enum vlc_player_vout_action action,
|
||||
vout_thread_t *vout,
|
||||
enum vlc_vout_order order,
|
||||
vlc_es_id_t *es_id, void *data)
|
||||
{
|
||||
VLC_UNUSED(player); VLC_UNUSED(es_id);
|
||||
VLC_UNUSED(player); VLC_UNUSED(order);
|
||||
intf_thread_t *intf = data;
|
||||
intf_sys_t *sys = intf->p_sys;
|
||||
|
||||
if (vlc_es_id_GetCat(es_id) != VIDEO_ES)
|
||||
return;
|
||||
|
||||
switch (action)
|
||||
{
|
||||
case VLC_PLAYER_VOUT_STARTED:
|
||||
|
|
|
@ -1053,11 +1053,15 @@ ViewpointMovedCallback(vlc_object_t *obj, char const *var,
|
|||
static void
|
||||
player_on_vout_changed(vlc_player_t *player,
|
||||
enum vlc_player_vout_action action, vout_thread_t *vout,
|
||||
vlc_es_id_t *es_id,
|
||||
enum vlc_vout_order order, vlc_es_id_t *es_id,
|
||||
void *data)
|
||||
{
|
||||
VLC_UNUSED(es_id);
|
||||
VLC_UNUSED(order);
|
||||
intf_thread_t *intf = data;
|
||||
|
||||
if (vlc_es_id_GetCat(es_id) != VIDEO_ES)
|
||||
return;
|
||||
|
||||
bool vrnav = var_GetBool(vout, "viewpoint-changeable");
|
||||
switch (action)
|
||||
{
|
||||
|
|
|
@ -434,12 +434,17 @@ static void cb_player_item_meta_changed(vlc_player_t *p_player,
|
|||
static void cb_player_vout_changed(vlc_player_t *p_player,
|
||||
enum vlc_player_vout_action action,
|
||||
vout_thread_t *p_vout,
|
||||
enum vlc_vout_order order,
|
||||
vlc_es_id_t *es_id,
|
||||
void *p_data)
|
||||
{
|
||||
VLC_UNUSED(p_player);
|
||||
VLC_UNUSED(p_vout);
|
||||
VLC_UNUSED(es_id);
|
||||
VLC_UNUSED(order);
|
||||
|
||||
if (vlc_es_id_GetCat(es_id) != VIDEO_ES)
|
||||
return;
|
||||
|
||||
dispatch_async(dispatch_get_main_queue(), ^{
|
||||
VLCPlayerController *playerController = (__bridge VLCPlayerController *)p_data;
|
||||
[playerController voutListUpdated];
|
||||
|
|
|
@ -710,11 +710,16 @@ static void on_player_subitems_changed(vlc_player_t *, input_item_t *, input_ite
|
|||
}
|
||||
|
||||
|
||||
static void on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_action, vout_thread_t *, vlc_es_id_t *, void *data)
|
||||
static void on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_action,
|
||||
vout_thread_t *, enum vlc_vout_order, vlc_es_id_t *es_id, void *data)
|
||||
{
|
||||
PlayerControllerPrivate* that = static_cast<PlayerControllerPrivate*>(data);
|
||||
msg_Dbg( that->p_intf, "on_player_vout_list_changed");
|
||||
|
||||
switch (vlc_es_id_GetCat(es_id))
|
||||
{
|
||||
case VIDEO_ES:
|
||||
{
|
||||
//player is locked within callbacks*
|
||||
size_t i_vout = 0;
|
||||
vout_thread_t **vouts = vlc_player_vout_HoldAll(player, &i_vout);
|
||||
|
@ -729,6 +734,11 @@ static void on_player_vout_changed(vlc_player_t *player, enum vlc_player_vout_ac
|
|||
that->callAsync([that,voutsPtr,i_vout] () {
|
||||
that->UpdateVouts(voutsPtr.get(), i_vout);
|
||||
});
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//player vout callbacks
|
||||
|
|
|
@ -59,6 +59,8 @@ struct vlc_player_track_priv
|
|||
struct vlc_player_track t;
|
||||
vout_thread_t *vout; /* weak reference */
|
||||
vlc_tick_t delay;
|
||||
/* only valid if selected and if category is VIDEO_ES or SPU_ES */
|
||||
enum vlc_vout_order vout_order;
|
||||
};
|
||||
|
||||
typedef struct VLC_VECTOR(struct vlc_player_program *)
|
||||
|
@ -423,6 +425,8 @@ vlc_player_track_New(vlc_es_id_t *id, const char *name, const es_format_t *fmt)
|
|||
struct vlc_player_track *track = &trackpriv->t;
|
||||
|
||||
trackpriv->delay = INT64_MAX;
|
||||
trackpriv->vout = NULL;
|
||||
trackpriv->vout_order = VLC_VOUT_ORDER_NONE;
|
||||
|
||||
track->name = strdup(name);
|
||||
if (!track->name)
|
||||
|
@ -1327,11 +1331,18 @@ vlc_player_GetTrack(vlc_player_t *player, vlc_es_id_t *id)
|
|||
}
|
||||
|
||||
vout_thread_t *
|
||||
vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id)
|
||||
vlc_player_GetEsIdVout(vlc_player_t *player, vlc_es_id_t *es_id,
|
||||
enum vlc_vout_order *order)
|
||||
{
|
||||
struct vlc_player_track_priv *trackpriv =
|
||||
vlc_player_GetPrivTrack(player, es_id);
|
||||
return trackpriv ? trackpriv->vout : NULL;
|
||||
if (trackpriv)
|
||||
{
|
||||
if (order)
|
||||
*order = trackpriv->vout_order;
|
||||
return trackpriv->vout;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
vlc_es_id_t *
|
||||
|
@ -1343,7 +1354,7 @@ vlc_player_GetEsIdFromVout(vlc_player_t *player, vout_thread_t *vout)
|
|||
return NULL;
|
||||
|
||||
static const enum es_format_category_e cats[] = {
|
||||
VIDEO_ES, AUDIO_ES /* for visualisation filters */
|
||||
VIDEO_ES, SPU_ES, AUDIO_ES /* for visualisation filters */
|
||||
};
|
||||
for (size_t i = 0; i < ARRAY_SIZE(cats); ++i)
|
||||
{
|
||||
|
@ -2060,16 +2071,17 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
|
|||
return;
|
||||
|
||||
const bool is_video_es = trackpriv->t.fmt.i_cat == VIDEO_ES;
|
||||
if (!is_video_es) /* XXX: will be removed on next commits */
|
||||
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);
|
||||
VLC_PLAYER_VOUT_STARTED, ev->vout,
|
||||
ev->order, ev->id);
|
||||
|
||||
if (is_video_es)
|
||||
{
|
||||
/* Register vout callbacks after the vout list event */
|
||||
var_AddCallback(ev->vout, "fullscreen",
|
||||
vlc_player_VoutCallback, player);
|
||||
|
@ -2078,8 +2090,11 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
|
|||
for (size_t i = 0; i < ARRAY_SIZE(osd_vars); ++i)
|
||||
var_AddCallback(ev->vout, osd_vars[i],
|
||||
vlc_player_VoutOSDCallback, player);
|
||||
}
|
||||
break;
|
||||
case VLC_INPUT_EVENT_VOUT_DELETED:
|
||||
if (is_video_es)
|
||||
{
|
||||
/* Un-register vout callbacks before the vout list event */
|
||||
var_DelCallback(ev->vout, "fullscreen",
|
||||
vlc_player_VoutCallback, player);
|
||||
|
@ -2088,10 +2103,12 @@ vlc_player_input_HandleVoutEvent(struct vlc_player_input *input,
|
|||
for (size_t i = 0; i < ARRAY_SIZE(osd_vars); ++i)
|
||||
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);
|
||||
VLC_PLAYER_VOUT_STOPPED, ev->vout,
|
||||
VLC_VOUT_ORDER_NONE, ev->id);
|
||||
break;
|
||||
default:
|
||||
vlc_assert_unreachable();
|
||||
|
|
|
@ -85,6 +85,7 @@ struct report_vout
|
|||
{
|
||||
enum vlc_player_vout_action action;
|
||||
vout_thread_t *vout;
|
||||
enum vlc_vout_order order;
|
||||
vlc_es_id_t *es_id;
|
||||
};
|
||||
|
||||
|
@ -437,12 +438,14 @@ player_on_statistics_changed(vlc_player_t *player,
|
|||
static void
|
||||
player_on_vout_changed(vlc_player_t *player,
|
||||
enum vlc_player_vout_action action,
|
||||
vout_thread_t *vout, vlc_es_id_t *es_id, void *data)
|
||||
vout_thread_t *vout, enum vlc_vout_order order,
|
||||
vlc_es_id_t *es_id, void *data)
|
||||
{
|
||||
struct ctx *ctx = get_ctx(player, data);
|
||||
struct report_vout report = {
|
||||
.action = action,
|
||||
.vout = vout_Hold(vout),
|
||||
.order = order,
|
||||
.es_id = vlc_es_id_Hold(es_id),
|
||||
};
|
||||
assert(report.es_id);
|
||||
|
|
Loading…
Reference in New Issue