[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