[FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once

2015-10-07 Thread Derek Buitenhuis
This makes the h.264 decoder threadsafe to initialize.

Signed-off-by: Derek Buitenhuis 
---
 libavcodec/h264.c | 9 -
 libavcodec/h264.h | 7 +++
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/libavcodec/h264.c b/libavcodec/h264.c
index 3209c9c..1abdc4b 100644
--- a/libavcodec/h264.c
+++ b/libavcodec/h264.c
@@ -644,6 +644,8 @@ static int h264_init_context(AVCodecContext *avctx, 
H264Context *h)
 return 0;
 }
 
+static pthread_once_t ff_h264_vlc_init = PTHREAD_ONCE_INIT;
+
 av_cold int ff_h264_decode_init(AVCodecContext *avctx)
 {
 H264Context *h = avctx->priv_data;
@@ -657,7 +659,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
 if (!avctx->has_b_frames)
 h->low_delay = 1;
 
-ff_h264_decode_init_vlc();
+ret = pthread_once(_h264_vlc_init, _h264_decode_init_vlc);
+if (ret != 0) {
+av_log(avctx, AV_LOG_ERROR, "pthread_once has failed.");
+return AVERROR_UNKNOWN;
+}
 
 if (avctx->codec_id == AV_CODEC_ID_H264) {
 if (avctx->ticks_per_frame == 1) {
@@ -1993,6 +1999,7 @@ AVCodec ff_h264_decoder = {
 .capabilities  = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ 
AV_CODEC_CAP_DR1 |
  AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS |
  AV_CODEC_CAP_FRAME_THREADS,
+.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
 .flush = flush_dpb,
 .init_thread_copy  = ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
 .update_thread_context = 
ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
diff --git a/libavcodec/h264.h b/libavcodec/h264.h
index 769abda..f8a58a6 100644
--- a/libavcodec/h264.h
+++ b/libavcodec/h264.h
@@ -29,6 +29,7 @@
 #define AVCODEC_H264_H
 
 #include "libavutil/intreadwrite.h"
+#include "libavutil/thread.h"
 #include "cabac.h"
 #include "error_resilience.h"
 #include "get_bits.h"
@@ -43,6 +44,12 @@
 #include "rectangle.h"
 #include "videodsp.h"
 
+#if HAVE_PTHREADS
+#   include 
+#elif HAVE_W32THREADS
+#   include "compat/w32pthreads.h"
+#endif
+
 #define H264_MAX_PICTURE_COUNT 36
 #define H264_MAX_THREADS   32
 
-- 
1.8.3.1

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once

2015-10-07 Thread wm4
On Wed,  7 Oct 2015 12:24:32 -0400
Derek Buitenhuis  wrote:

> This makes the h.264 decoder threadsafe to initialize.
> 
> Signed-off-by: Derek Buitenhuis 
> ---
>  libavcodec/h264.c | 9 -
>  libavcodec/h264.h | 7 +++
>  2 files changed, 15 insertions(+), 1 deletion(-)
> 
> diff --git a/libavcodec/h264.c b/libavcodec/h264.c
> index 3209c9c..1abdc4b 100644
> --- a/libavcodec/h264.c
> +++ b/libavcodec/h264.c
> @@ -644,6 +644,8 @@ static int h264_init_context(AVCodecContext *avctx, 
> H264Context *h)
>  return 0;
>  }
>  
> +static pthread_once_t ff_h264_vlc_init = PTHREAD_ONCE_INIT;
> +
>  av_cold int ff_h264_decode_init(AVCodecContext *avctx)
>  {
>  H264Context *h = avctx->priv_data;
> @@ -657,7 +659,11 @@ av_cold int ff_h264_decode_init(AVCodecContext *avctx)
>  if (!avctx->has_b_frames)
>  h->low_delay = 1;
>  
> -ff_h264_decode_init_vlc();
> +ret = pthread_once(_h264_vlc_init, _h264_decode_init_vlc);
> +if (ret != 0) {
> +av_log(avctx, AV_LOG_ERROR, "pthread_once has failed.");
> +return AVERROR_UNKNOWN;
> +}
>  
>  if (avctx->codec_id == AV_CODEC_ID_H264) {
>  if (avctx->ticks_per_frame == 1) {
> @@ -1993,6 +1999,7 @@ AVCodec ff_h264_decoder = {
>  .capabilities  = /*AV_CODEC_CAP_DRAW_HORIZ_BAND |*/ 
> AV_CODEC_CAP_DR1 |
>   AV_CODEC_CAP_DELAY | AV_CODEC_CAP_SLICE_THREADS 
> |
>   AV_CODEC_CAP_FRAME_THREADS,
> +.caps_internal = FF_CODEC_CAP_INIT_THREADSAFE,
>  .flush = flush_dpb,
>  .init_thread_copy  = 
> ONLY_IF_THREADS_ENABLED(decode_init_thread_copy),
>  .update_thread_context = 
> ONLY_IF_THREADS_ENABLED(ff_h264_update_thread_context),
> diff --git a/libavcodec/h264.h b/libavcodec/h264.h
> index 769abda..f8a58a6 100644
> --- a/libavcodec/h264.h
> +++ b/libavcodec/h264.h
> @@ -29,6 +29,7 @@
>  #define AVCODEC_H264_H
>  
>  #include "libavutil/intreadwrite.h"
> +#include "libavutil/thread.h"
>  #include "cabac.h"
>  #include "error_resilience.h"
>  #include "get_bits.h"
> @@ -43,6 +44,12 @@
>  #include "rectangle.h"
>  #include "videodsp.h"
>  
> +#if HAVE_PTHREADS
> +#   include 
> +#elif HAVE_W32THREADS
> +#   include "compat/w32pthreads.h"
> +#endif
> +
>  #define H264_MAX_PICTURE_COUNT 36
>  #define H264_MAX_THREADS   32
>  

I think you forgot to remove the second chunk? It's unnecessary with
thread.h included.

Other than that LGTM.
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


Re: [FFmpeg-devel] [PATCH 3/3 v2] h264: Run VLC init under pthread_once

2015-10-07 Thread Derek Buitenhuis
On 10/7/2015 5:24 PM, Derek Buitenhuis wrote:
> This makes the h.264 decoder threadsafe to initialize.
> 
> Signed-off-by: Derek Buitenhuis 
> ---
>  libavcodec/h264.c | 9 -
>  libavcodec/h264.h | 7 +++
>  2 files changed, 15 insertions(+), 1 deletion(-)

Disregard this one, wrong ver sent.

- Derek

___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel