]> git.sesse.net Git - vlc/blobdiff - modules/codec/avcodec/video.c
avcodec: pass coded dimensions to hardware decoder
[vlc] / modules / codec / avcodec / video.c
index c8b18f0707db10dadba910547a38f99183e0c6e6..edba52eaf6caa0d6fd88f1ff76a0b8e6e34115ea 100644 (file)
@@ -125,8 +125,14 @@ static inline picture_t *ffmpeg_NewPictBuf( decoder_t *p_dec,
 {
     decoder_sys_t *p_sys = p_dec->p_sys;
 
-    p_dec->fmt_out.video.i_width = p_context->width;
-    p_dec->fmt_out.video.i_height = p_context->height;
+    if( p_context->coded_width != p_context->width ||
+        p_context->coded_height != p_context->height )
+    {
+        p_dec->fmt_out.video.i_visible_width = p_context->width;
+        p_dec->fmt_out.video.i_visible_height = p_context->height;
+    }
+    p_dec->fmt_out.video.i_width = p_context->coded_width;
+    p_dec->fmt_out.video.i_height = p_context->coded_height;
 
     if( !p_context->width || !p_context->height )
     {
@@ -331,6 +337,11 @@ 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;
+
+    p_sys->p_context->thread_safe_callbacks = true;
 #endif
 
     char *hw = var_CreateGetString( p_dec, "avcodec-hw" ); /* FIXME */
@@ -340,16 +351,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
@@ -465,8 +476,10 @@ picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
 
         p_sys->i_late_frames = 0;
 
+        post_mt( p_sys );
         if( p_block->i_flags & BLOCK_FLAG_DISCONTINUITY )
             avcodec_flush_buffers( p_context );
+        wait_mt( p_sys );
 
         block_Release( p_block );
         return NULL;
@@ -894,7 +907,7 @@ static int ffmpeg_va_GetFrameBuf( struct AVCodecContext *p_context, AVFrame *p_f
     /* hwaccel_context is not present in old ffmpeg version */
     if( vlc_va_Setup( p_va,
                 &p_context->hwaccel_context, &p_dec->fmt_out.video.i_chroma,
-                p_context->width, p_context->height ) )
+                p_context->coded_width, p_context->coded_height ) )
     {
         msg_Err( p_dec, "vlc_va_Setup failed" );
         return -1;
@@ -902,7 +915,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;
     }
 
@@ -1023,6 +1036,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;
@@ -1036,7 +1050,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;
 }