[vlc-devel] [PATCH 2/2] player: fix teletext handling
Rémi Denis-Courmont
remi at remlab.net
Fri Feb 7 16:03:38 CET 2020
This needs a description and rationale, IMO.
Le 7 février 2020 16:08:35 GMT+02:00, Francois Cartegnie <fcvlcdev at free.fr> a écrit :
>---
> src/player/input.c | 61 ++++++++++++++++++++++++++++-----------------
> src/player/player.h | 2 +-
> 2 files changed, 39 insertions(+), 24 deletions(-)
>
>diff --git a/src/player/input.c b/src/player/input.c
>index 37a235664b..45ecb1c405 100644
>--- a/src/player/input.c
>+++ b/src/player/input.c
>@@ -355,44 +355,61 @@ vlc_player_input_HandleProgramEvent(struct
>vlc_player_input *input,
>
> static void
> vlc_player_input_HandleTeletextMenu(struct vlc_player_input *input,
>- const struct vlc_input_event_es
>*ev)
>+ const struct vlc_input_event_es
>*ev,
>+ const struct vlc_player_track_priv
>*trackpriv)
> {
> vlc_player_t *player = input->player;
>+ const struct vlc_player_track_priv *t;
>+ if(ev->fmt->i_codec != VLC_CODEC_TELETEXT)
>+ return;
> switch (ev->action)
> {
> case VLC_INPUT_ES_ADDED:
>- if (input->teletext_menu)
>+ if(!input->teletext_menu || trackpriv->t.selected)
>+ input->teletext_menu = trackpriv;
>+ vlc_vector_foreach(t, &input->spu_track_vector)
> {
>- msg_Warn(player, "Can't handle more than one teletext
>menu "
>- "track. Using the last one.");
>- vlc_player_track_priv_Delete(input->teletext_menu);
>+ /* Did we have index teletext page before in spu list
>*/
>+ if(t->t.fmt.i_codec == VLC_CODEC_TELETEXT &&
>+ t->t.fmt.subs.teletext.i_type != 0x02 &&
>+ t->t.fmt.subs.teletext.i_type != 0x05 &&
>+ t != trackpriv)
>+ return;
> }
>- input->teletext_menu = vlc_player_track_priv_New(ev->id,
>ev->title,
>- ev->fmt);
>- if (!input->teletext_menu)
>- return;
>-
> vlc_player_SendEvent(player, on_teletext_menu_changed, true);
> break;
> case VLC_INPUT_ES_DELETED:
> {
>- if (input->teletext_menu && input->teletext_menu->t.es_id
>== ev->id)
>+ if (input->teletext_menu == trackpriv)
> {
> assert(!input->teletext_enabled);
>-
>- vlc_player_track_priv_Delete(input->teletext_menu);
> input->teletext_menu = NULL;
>- vlc_player_SendEvent(player, on_teletext_menu_changed,
>false);
> }
>+ vlc_vector_foreach(t, &input->spu_track_vector)
>+ {
>+ /* Do we still have index teletext page in spu list */
>+ if(t->t.fmt.i_codec == VLC_CODEC_TELETEXT &&
>+ t->t.fmt.subs.teletext.i_type != 0x02 &&
>+ t->t.fmt.subs.teletext.i_type != 0x05 &&
>+ t != trackpriv)
>+ {
>+ input->teletext_menu = t;
>+ return;
>+ }
>+ }
>+ vlc_player_SendEvent(player, on_teletext_menu_changed,
>false);
> break;
> }
> case VLC_INPUT_ES_UPDATED:
> break;
> case VLC_INPUT_ES_SELECTED:
> case VLC_INPUT_ES_UNSELECTED:
>- if (input->teletext_menu->t.es_id == ev->id)
>+ if(trackpriv->t.fmt.subs.teletext.i_type != 0x02 &&
>+ trackpriv->t.fmt.subs.teletext.i_type != 0x05)
> {
> input->teletext_enabled = ev->action == VLC_INPUT_ES_SELECTED;
>+ if(input->teletext_enabled)
>+ input->teletext_menu = trackpriv;
> vlc_player_SendEvent(player, on_teletext_enabled_changed,
> input->teletext_enabled);
> }
>@@ -408,14 +425,6 @@ vlc_player_input_HandleEsEvent(struct
>vlc_player_input *input,
> {
> assert(ev->id && ev->title && ev->fmt);
>
>- if (ev->fmt->i_cat == SPU_ES && ev->fmt->i_codec ==
>VLC_CODEC_TELETEXT
>- && (ev->fmt->subs.teletext.i_magazine == 1
>- || ev->fmt->subs.teletext.i_magazine > 8))
>- {
>- vlc_player_input_HandleTeletextMenu(input, ev);
>- return;
>- }
>-
> vlc_player_track_vector *vec =
> vlc_player_input_GetTrackVector(input, ev->fmt->i_cat);
> if (!vec)
>@@ -463,6 +472,7 @@ vlc_player_input_HandleEsEvent(struct
>vlc_player_input *input,
> input->ml.states.current_subtitle_track == ev->fmt->i_id)
> vlc_player_SelectTrack(input->player, &trackpriv->t,
> VLC_PLAYER_SELECT_EXCLUSIVE);
>+ vlc_player_input_HandleTeletextMenu(input, ev,
>trackpriv);
> default:
> break;
> }
>@@ -473,6 +483,8 @@ vlc_player_input_HandleEsEvent(struct
>vlc_player_input *input,
> trackpriv = vlc_player_track_vector_FindById(vec, ev->id, &idx);
> if (trackpriv)
> {
>+ if(trackpriv->t.fmt.i_cat == SPU_ES)
>+ vlc_player_input_HandleTeletextMenu(input, ev,
>trackpriv);
> vlc_player_SendEvent(player, on_track_list_changed,
> VLC_PLAYER_LIST_REMOVED, &trackpriv->t);
> vlc_vector_remove(vec, idx);
>@@ -513,6 +525,7 @@ vlc_player_input_HandleEsEvent(struct
>vlc_player_input *input,
> case SPU_ES:
> if (input->ml.default_subtitle_track == -2)
> input->ml.default_subtitle_track = ev->fmt->i_id;
>+ vlc_player_input_HandleTeletextMenu(input, ev,
>trackpriv);
> break;
> default:
> break;
>@@ -526,6 +539,8 @@ vlc_player_input_HandleEsEvent(struct
>vlc_player_input *input,
> trackpriv->t.selected = false;
> vlc_player_SendEvent(player, on_track_selection_changed,
> trackpriv->t.es_id, NULL);
>+ if(trackpriv->t.fmt.i_cat == SPU_ES)
>+ vlc_player_input_HandleTeletextMenu(input, ev,
>trackpriv);
> }
> break;
> default:
>diff --git a/src/player/player.h b/src/player/player.h
>index d7e499a84e..e45cc1d510 100644
>--- a/src/player/player.h
>+++ b/src/player/player.h
>@@ -83,7 +83,7 @@ struct vlc_player_input
> vlc_player_track_vector video_track_vector;
> vlc_player_track_vector audio_track_vector;
> vlc_player_track_vector spu_track_vector;
>- struct vlc_player_track_priv *teletext_menu;
>+ const struct vlc_player_track_priv *teletext_menu;
>
> struct vlc_player_title_list *titles;
>
>--
>2.24.1
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel
--
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200207/31a556f0/attachment.html>
More information about the vlc-devel
mailing list