]> git.sesse.net Git - vlc/blobdiff - modules/codec/avcodec/video.c
avcodec: disable threading when decoding in hardware(fixes #8786)
[vlc] / modules / codec / avcodec / video.c
index ecba97e95fbf631be84305f03fea3eeb6b1346f0..7f5b8abb936d48f1d54d43606902f7db3a23f7a4 100644 (file)
@@ -331,6 +331,10 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
     i_thread_count = __MIN( i_thread_count, 16 );
     msg_Dbg( p_dec, "allowing %d thread(s) for decoding", i_thread_count );
     p_sys->p_context->thread_count = i_thread_count;
+
+    if( i_codec_id == AV_CODEC_ID_MPEG4 )
+        p_sys->p_context->thread_count = 1;
+
 #endif
 
     char *hw = var_CreateGetString( p_dec, "avcodec-hw" ); /* FIXME */
@@ -340,16 +344,16 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
          i_codec_id == AV_CODEC_ID_H264 ||
          i_codec_id == AV_CODEC_ID_VC1 || i_codec_id == AV_CODEC_ID_WMV3) )
     {
-#if defined(HAVE_AVCODEC_MT) && LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 1, 0)
+#if defined(HAVE_AVCODEC_MT) //&& LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 1, 0)
         if( p_sys->p_context->thread_type & FF_THREAD_FRAME )
         {
-            msg_Warn( p_dec, "threaded frame decoding is not compatible with libavcodec-hw, disabled" );
+            msg_Warn( p_dec, "threaded frame decoding is not compatible with avcodec-hw, disabled" );
             p_sys->p_context->thread_type &= ~FF_THREAD_FRAME;
         }
         if( ( p_sys->p_context->thread_type & FF_THREAD_SLICE ) &&
             ( i_codec_id == AV_CODEC_ID_MPEG1VIDEO || i_codec_id == AV_CODEC_ID_MPEG2VIDEO ) )
         {
-            msg_Warn( p_dec, "threaded slice decoding is not compatible with libavcodec-hw, disabled" );
+            msg_Warn( p_dec, "threaded slice decoding is not compatible with avcodec-hw, disabled" );
             p_sys->p_context->thread_type &= ~FF_THREAD_SLICE;
         }
 #endif
@@ -902,7 +906,7 @@ static int ffmpeg_va_GetFrameBuf( struct AVCodecContext *p_context, AVFrame *p_f
 
     if( vlc_va_Get( p_va, p_ff_pic ) )
     {
-        msg_Err( p_dec, "VaGrabSurface failed" );
+        msg_Err( p_dec, "vlc_va_Get failed" );
         return -1;
     }
 
@@ -914,7 +918,6 @@ static picture_t *ffmpeg_dr_GetFrameBuf(struct AVCodecContext *p_context)
 {
     decoder_t *p_dec = (decoder_t *)p_context->opaque;
     decoder_sys_t *p_sys = p_dec->p_sys;
-    vlc_va_t *p_va = p_sys->p_va;
 
     int i_width = p_context->width;
     int i_height = p_context->height;
@@ -1024,6 +1027,7 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
     }
 
     p_context->draw_horiz_band = NULL;
+    post_mt( p_sys );
 
     p_ff_pic->opaque = (void*)p_pic;
     p_ff_pic->type = FF_BUFFER_TYPE_USER;
@@ -1037,7 +1041,6 @@ static int ffmpeg_GetFrameBuf( struct AVCodecContext *p_context,
     p_ff_pic->linesize[2] = p_pic->p[2].i_pitch;
     p_ff_pic->linesize[3] = 0;
 
-    post_mt( p_sys );
     return 0;
 }