@ -853,6 +853,30 @@ int ff_decode_frame_props(AVCodecContext *avctx, AVFrame *frame)
return ff_init_buffer_info ( avctx , frame ) ;
}
static void validate_avframe_allocation ( AVCodecContext * avctx , AVFrame * frame )
{
if ( avctx - > codec_type = = AVMEDIA_TYPE_VIDEO ) {
int i ;
int num_planes = av_pix_fmt_count_planes ( frame - > format ) ;
const AVPixFmtDescriptor * desc = av_pix_fmt_desc_get ( frame - > format ) ;
int flags = desc ? desc - > flags : 0 ;
if ( num_planes = = 1 & & ( flags & AV_PIX_FMT_FLAG_PAL ) )
num_planes = 2 ;
for ( i = 0 ; i < num_planes ; i + + ) {
av_assert0 ( frame - > data [ i ] ) ;
}
// For now do not enforce anything for palette of pseudopal formats
if ( num_planes = = 1 & & ( flags & AV_PIX_FMT_FLAG_PSEUDOPAL ) )
num_planes = 2 ;
// For formats without data like hwaccel allow unused pointers to be non-NULL.
for ( i = num_planes ; num_planes > 0 & & i < FF_ARRAY_ELEMS ( frame - > data ) ; i + + ) {
if ( frame - > data [ i ] )
av_log ( avctx , AV_LOG_ERROR , " Buffer returned by get_buffer2() did not zero unused plane pointers \n " ) ;
frame - > data [ i ] = NULL ;
}
}
}
static int get_buffer_internal ( AVCodecContext * avctx , AVFrame * frame , int flags )
{
const AVHWAccel * hwaccel = avctx - > hwaccel ;
@ -889,6 +913,8 @@ static int get_buffer_internal(AVCodecContext *avctx, AVFrame *frame, int flags)
avctx - > sw_pix_fmt = avctx - > pix_fmt ;
ret = avctx - > get_buffer2 ( avctx , frame , flags ) ;
if ( ret > = 0 )
validate_avframe_allocation ( avctx , frame ) ;
end :
if ( avctx - > codec_type = = AVMEDIA_TYPE_VIDEO & & ! override_dimensions ) {