@ -29,6 +29,8 @@
typedef struct {
int h ; ///< output slice height
int vshift ; ///< vertical chroma subsampling shift
uint32_t lcg_state ; ///< LCG state used to compute random slice height
int use_random_h ; ///< enable the use of random slice height values
} SliceContext ;
static av_cold int init ( AVFilterContext * ctx , const char * args , void * opaque )
@ -36,9 +38,13 @@ static av_cold int init(AVFilterContext *ctx, const char *args, void *opaque)
SliceContext * slice = ctx - > priv ;
slice - > h = 16 ;
if ( args )
sscanf ( args , " %d " , & slice - > h ) ;
if ( args ) {
if ( ! strcmp ( args , " random " ) ) {
slice - > use_random_h = 1 ;
} else {
sscanf ( args , " %d " , & slice - > h ) ;
}
}
return 0 ;
}
@ -48,12 +54,6 @@ static int config_props(AVFilterLink *link)
slice - > vshift = av_pix_fmt_descriptors [ link - > format ] . log2_chroma_h ;
/* ensure that slices play nice with chroma subsampling, and enforce
* a reasonable minimum size for the slices */
slice - > h = FFMAX ( 8 , slice - > h & ( - 1 < < slice - > vshift ) ) ;
av_log ( link - > dst , AV_LOG_INFO , " h:%d \n " , slice - > h ) ;
return 0 ;
}
@ -65,6 +65,19 @@ static AVFilterPicRef *get_video_buffer(AVFilterLink *link, int perms,
static void start_frame ( AVFilterLink * link , AVFilterPicRef * picref )
{
SliceContext * slice = link - > dst - > priv ;
if ( slice - > use_random_h ) {
slice - > lcg_state = slice - > lcg_state * 1664525 + 1013904223 ;
slice - > h = 8 + ( uint64_t ) slice - > lcg_state * 25 / UINT32_MAX ;
}
/* ensure that slices play nice with chroma subsampling, and enforce
* a reasonable minimum size for the slices */
slice - > h = FFMAX ( 8 , slice - > h & ( - 1 < < slice - > vshift ) ) ;
av_log ( link - > dst , AV_LOG_DEBUG , " h:%d \n " , slice - > h ) ;
avfilter_start_frame ( link - > dst - > outputs [ 0 ] , picref ) ;
}