Commit e9a226a3 authored by Laurent Aimar's avatar Laurent Aimar

Workaround a potential segfault when using VAAPI/DXVA2 (close #3606).

It seems that some avcodec decoders release frames even after being flushed.
parent 957409b2
...@@ -795,7 +795,10 @@ void EndVideoDec( decoder_t *p_dec ) ...@@ -795,7 +795,10 @@ void EndVideoDec( decoder_t *p_dec )
if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic ); if( p_sys->p_ff_pic ) av_free( p_sys->p_ff_pic );
if( p_sys->p_va ) if( p_sys->p_va )
{
vlc_va_Delete( p_sys->p_va ); vlc_va_Delete( p_sys->p_va );
p_sys->p_va = NULL;
}
vlc_sem_destroy( &p_sys->sem_mt ); vlc_sem_destroy( &p_sys->sem_mt );
} }
...@@ -1120,25 +1123,24 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context, ...@@ -1120,25 +1123,24 @@ static void ffmpeg_ReleaseFrameBuf( struct AVCodecContext *p_context,
if( p_sys->p_va ) if( p_sys->p_va )
{ {
vlc_va_Release( p_sys->p_va, p_ff_pic ); vlc_va_Release( p_sys->p_va, p_ff_pic );
/* */
for( int i = 0; i < 4; i++ )
p_ff_pic->data[i] = NULL;
} }
else if( !p_ff_pic->opaque ) else if( !p_ff_pic->opaque )
{ {
avcodec_default_release_buffer( p_context, p_ff_pic ); /* We can end up here without the AVFrame being allocated by
* avcodec_default_get_buffer() if VA is used and the frame is
* released when the decoder is closed
*/
if( p_ff_pic->type == FF_BUFFER_TYPE_INTERNAL )
avcodec_default_release_buffer( p_context, p_ff_pic );
} }
else else
{ {
picture_t *p_pic = (picture_t*)p_ff_pic->opaque; picture_t *p_pic = (picture_t*)p_ff_pic->opaque;
decoder_UnlinkPicture( p_dec, p_pic ); decoder_UnlinkPicture( p_dec, p_pic );
/* */
for( int i = 0; i < 4; i++ )
p_ff_pic->data[i] = NULL;
} }
for( int i = 0; i < 4; i++ )
p_ff_pic->data[i] = NULL;
} }
#ifdef HAVE_AVCODEC_VA #ifdef HAVE_AVCODEC_VA
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment