[vlc-devel] [PATCH 11/20] input: pass vout and spu_order via events
Thomas Guillem
thomas at gllm.fr
Thu Jun 20 17:56:41 CEST 2019
On Thu, Jun 20, 2019, at 17:54, Rémi Denis-Courmont wrote:
> Hi,
>
> This conflicts with Romain's series. I don't have an opinion, but someone will need to yield.
I will merge Roman's patches first, then add spu_added/removed callbacks.
>
> Le 20 juin 2019 18:23:54 GMT+03:00, Thomas Guillem <thomas at gllm.fr> a écrit :
>> src/input/decoder.c | 39 +++++++++++++++++++++++++++++++-------
>> src/input/event.h | 9 +++++++++
>> src/input/input_internal.h | 12 ++++++++++++
>> 3 files changed, 53 insertions(+), 7 deletions(-)
>>
>> diff --git a/src/input/decoder.c b/src/input/decoder.c
>> index 3a47c01ddf..ea9373975b 100644
>> --- a/src/input/decoder.c
>> +++ b/src/input/decoder.c
>> @@ -611,12 +611,19 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
>> msg_Warn( p_dec, "no vout found, dropping subpicture" );
>> if( p_owner->p_vout )
>> {
>> - if (p_owner->i_spu_channel != -1)
>> - {
>> - vout_UnregisterSubpictureChannel(p_owner->p_vout,
>> - p_owner->i_spu_channel);
>> - p_owner->i_spu_channel = -1;
>> - }
>> + assert(p_owner->i_spu_channel != -1);
>> +
>> + if (p_owner->p_input)
>> + input_SendEventSpu(p_owner->p_input,
>> + &(struct vlc_input_event_spu) {
>> + .vout = p_owner->p_vout,
>> + .channel_order = VLC_SPU_CHANNEL_ORDER_NONE,
>> + .id = p_owner->id,
>> + });
>> +
>> + vout_UnregisterSubpictureChannel(p_owner->p_vout,
>> + p_owner->i_spu_channel);
>> + p_owner->i_spu_channel = -1;
>>
>> vlc_mutex_lock( &p_owner->lock );
>> vout_Release(p_owner->p_vout);
>> @@ -629,13 +636,15 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
>> if( p_owner->p_vout != p_vout )
>> {
>> ssize_t old_spu_channel = p_owner->i_spu_channel;
>> + enum vlc_spu_channel_order channel_order;
>> p_owner->i_spu_channel =
>> vout_RegisterSubpictureChannelInternal(p_vout, p_owner->p_clock,
>> - NULL);
>> + &channel_order);
>> p_owner->i_spu_order = 0;
>>
>> if (p_owner->i_spu_channel != -1)
>> {
>> + assert(channel_order != VLC_SPU_CHANNEL_ORDER_NONE);
>> if (p_owner->p_vout && old_spu_channel != -1)
>> vout_UnregisterSubpictureChannel(p_owner->p_vout,
>> old_spu_channel);
>> @@ -644,6 +653,14 @@ static subpicture_t *spu_new_buffer( decoder_t *p_dec,
>> vout_Release(p_owner->p_vout);
>> p_owner->p_vout = p_vout;
>> vlc_mutex_unlock(&p_owner->lock);
>> +
>> + if (p_owner->p_input)
>> + input_SendEventSpu(p_owner->p_input,
>> + &(struct vlc_input_event_spu) {
>> + .vout = p_vout,
>> + .channel_order = channel_order,
>> + .id = p_owner->id,
>> + });
>> }
>> }
>> else
>> @@ -1991,6 +2008,14 @@ static void DeleteDecoder( decoder_t * p_dec )
>> if( p_owner->p_vout )
>> {
>> assert( p_owner->i_spu_channel > 0 );
>> + if (p_owner->p_input)
>> + input_SendEventSpu(p_owner->p_input,
>> + &(struct vlc_input_event_spu) {
>> + .vout = p_owner->p_vout,
>> + .channel_order = VLC_SPU_CHANNEL_ORDER_NONE,
>> + .id = p_owner->id,
>> + });
>> +
>> vout_UnregisterSubpictureChannel( p_owner->p_vout,
>> p_owner->i_spu_channel );
>> vout_Release(p_owner->p_vout);
>> diff --git a/src/input/event.h b/src/input/event.h
>> index 01163c479a..467d4ee799 100644
>> --- a/src/input/event.h
>> +++ b/src/input/event.h
>> @@ -281,6 +281,15 @@ static inline void input_SendEventVout(input_thread_t *p_input,
>> });
>> }
>>
>> +static inline void input_SendEventSpu(input_thread_t *p_input,
>> + const struct vlc_input_event_spu *event)
>> +{
>> + input_SendEvent(p_input, &(struct vlc_input_event) {
>> + .type = INPUT_EVENT_SPU,
>> + .spu = *event,
>> + });
>> +}
>> +
>> /*****************************************************************************
>> * Event for control.c/input.c
>> *****************************************************************************/
>> diff --git a/src/input/input_internal.h b/src/input/input_internal.h
>> index b159033b1c..b68ad77b4f 100644
>> --- a/src/input/input_internal.h
>> +++ b/src/input/input_internal.h
>> @@ -169,6 +169,9 @@ typedef enum input_event_type_e
>> /* A vout_thread_t object has been created/deleted by *the input* */
>> INPUT_EVENT_VOUT,
>>
>> + /* A new SPU channel has been registered/unregistered */
>> + INPUT_EVENT_SPU,
>> +
>> /* (pre-)parsing events */
>> INPUT_EVENT_SUBITEMS,
>>
>> @@ -271,6 +274,13 @@ struct vlc_input_event_vout
>> vlc_es_id_t *id;
>> };
>>
>> +struct vlc_input_event_spu
>> +{
>> + vout_thread_t *vout;
>> + enum vlc_spu_channel_order channel_order;
>> + vlc_es_id_t *id;
>> +};
>> +
>> struct vlc_input_event
>> {
>> input_event_type_e type;
>> @@ -304,6 +314,8 @@ struct vlc_input_event
>> float cache;
>> /* INPUT_EVENT_VOUT */
>> struct vlc_input_event_vout vout;
>> + /* INPUT_EVENT_SPU */
>> + struct vlc_input_event_spu spu;
>> /* INPUT_EVENT_SUBITEMS */
>> input_item_node_t *subitems;
>> /* INPUT_EVENT_VBI_PAGE */
>
> --
> Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20190620/a6487c8a/attachment.html>
More information about the vlc-devel
mailing list