[vlc-devel] [PATCH] HLS: implement pause

Rémi Denis-Courmont remi at remlab.net
Mon Aug 26 17:03:43 CEST 2013


Le lundi 26 août 2013 16:41:43 Rafaël Carré a écrit :
> Close #9234
> ---
>  modules/stream_filter/httplive.c | 40
> +++++++++++++++++++++++++++++++++++++++- 1 file changed, 39 insertions(+),
> 1 deletion(-)
> 
> diff --git a/modules/stream_filter/httplive.c
> b/modules/stream_filter/httplive.c index 55d54aa..472c261 100644
> --- a/modules/stream_filter/httplive.c
> +++ b/modules/stream_filter/httplive.c
> @@ -147,6 +147,11 @@ struct stream_sys_t
>      bool        b_live;     /* live stream? or vod? */
>      bool        b_error;    /* parsing error */
>      bool        b_aesmsg;   /* only print one time that the media is
> encrypted */ +
> +    /* Shared data */
> +    vlc_cond_t   wait;
> +    vlc_mutex_t  lock;
> +    bool         paused;

It looks OK to me but I think a semaphore would be much simpler.

>  };
> 
>  /**************************************************************************
> ** @@ -1799,8 +1804,14 @@ static int Prefetch(stream_t *s, int *current)
> ***************************************************************************
> */ static int hls_Download(stream_t *s, segment_t *segment)
>  {
> +    stream_sys_t *p_sys = s->p_sys;
>      assert(segment);
> 
> +    vlc_mutex_lock(&p_sys->lock);
> +    while (p_sys->paused)
> +        vlc_cond_wait(&p_sys->wait, &p_sys->lock);
> +    vlc_mutex_unlock(&p_sys->lock);
> +
>      stream_t *p_ts = stream_UrlNew(s, segment->url);
>      if (p_ts == NULL)
>          return VLC_EGENERIC;
> @@ -2007,6 +2018,11 @@ static int Open(vlc_object_t *p_this)
>      s->pf_peek = Peek;
>      s->pf_control = Control;
> 
> +    p_sys->paused = false;
> +
> +    vlc_cond_init(&p_sys->wait);
> +    vlc_mutex_init(&p_sys->lock);
> +
>      /* Parse HLS m3u8 content. */
>      uint8_t *buffer = NULL;
>      ssize_t len = read_M3U8_from_stream(s->p_source, &buffer);
> @@ -2085,6 +2101,9 @@ fail:
>      }
>      vlc_array_destroy(p_sys->hls_stream);
> 
> +    vlc_mutex_destroy(&p_sys->lock);
> +    vlc_cond_destroy(&p_sys->wait);
> +
>      /* */
>      free(p_sys->m3u8);
>      free(p_sys);
> @@ -2101,6 +2120,11 @@ static void Close(vlc_object_t *p_this)
> 
>      assert(p_sys->hls_stream);
> 
> +    vlc_mutex_lock(&p_sys->lock);
> +    p_sys->paused = false;
> +    vlc_cond_signal(&p_sys->wait);
> +    vlc_mutex_unlock(&p_sys->lock);
> +
>      /* */
>      vlc_mutex_lock(&p_sys->download.lock_wait);
>      /* negate the condition variable's predicate */
> @@ -2128,6 +2152,10 @@ static void Close(vlc_object_t *p_this)
>      vlc_array_destroy(p_sys->hls_stream);
> 
>      /* */
> +
> +    vlc_mutex_destroy(&p_sys->lock);
> +    vlc_cond_destroy(&p_sys->wait);
> +
>      free(p_sys->m3u8);
>      if (p_sys->peeked)
>          block_Release (p_sys->peeked);
> @@ -2610,15 +2638,25 @@ static int Control(stream_t *s, int i_query, va_list
> args) *(va_arg (args, bool *)) = hls_MaySeek(s);
>              break;
>          case STREAM_CAN_CONTROL_PACE:
> +        case STREAM_CAN_PAUSE:
>              *(va_arg (args, bool *)) = true;
>              break;
>          case STREAM_CAN_FASTSEEK:
> -        case STREAM_CAN_PAUSE: /* TODO */
>              *(va_arg (args, bool *)) = false;
>              break;
>          case STREAM_GET_POSITION:
>              *(va_arg (args, uint64_t *)) = p_sys->playback.offset;
>              break;
> +        case STREAM_SET_PAUSE_STATE:
> +        {
> +            bool paused = va_arg (args, unsigned);
> +
> +            vlc_mutex_lock(&p_sys->lock);
> +            p_sys->paused = paused;
> +            vlc_cond_signal(&p_sys->wait);
> +            vlc_mutex_unlock(&p_sys->lock);
> +            break;
> +        }
>          case STREAM_SET_POSITION:
>              if (hls_MaySeek(s))
>              {
-- 
Rémi Denis-Courmont
http://www.remlab.net/




More information about the vlc-devel mailing list