@ -63,7 +63,13 @@ static int query_formats(AVFilterContext *ctx)
static void null_draw_slice ( AVFilterLink * link , int y , int h , int slice_dir ) { }
# if CONFIG_OCV_SMOOTH_FILTER
typedef struct {
const char * name ;
int ( * init ) ( AVFilterContext * ctx , const char * args , void * opaque ) ;
void ( * uninit ) ( AVFilterContext * ctx ) ;
void ( * end_frame_filter ) ( AVFilterContext * ctx , IplImage * inimg , IplImage * outimg ) ;
void * priv ;
} OCVContext ;
typedef struct {
int type ;
@ -73,7 +79,8 @@ typedef struct {
static av_cold int smooth_init ( AVFilterContext * ctx , const char * args , void * opaque )
{
SmoothContext * smooth = ctx - > priv ;
OCVContext * ocv = ctx - > priv ;
SmoothContext * smooth = ocv - > priv ;
char type_str [ 128 ] = " gaussian " ;
smooth - > param1 = 3 ;
@ -113,17 +120,74 @@ static av_cold int smooth_init(AVFilterContext *ctx, const char *args, void *opa
return 0 ;
}
static void smooth_end_frame ( AVFilterLink * inlink )
static void smooth_end_frame_filter ( AVFilterContext * ctx , IplImage * inimg , IplImage * outimg )
{
SmoothContext * smooth = inlink - > dst - > priv ;
AVFilterLink * outlink = inlink - > dst - > outputs [ 0 ] ;
OCVContext * ocv = ctx - > priv ;
SmoothContext * smooth = ocv - > priv ;
cvSmooth ( inimg , outimg , smooth - > type , smooth - > param1 , smooth - > param2 , smooth - > param3 , smooth - > param4 ) ;
}
typedef struct {
const char * name ;
size_t priv_size ;
int ( * init ) ( AVFilterContext * ctx , const char * args , void * opaque ) ;
void ( * uninit ) ( AVFilterContext * ctx ) ;
void ( * end_frame_filter ) ( AVFilterContext * ctx , IplImage * inimg , IplImage * outimg ) ;
} OCVFilterEntry ;
static OCVFilterEntry ocv_filter_entries [ ] = {
{ " smooth " , sizeof ( SmoothContext ) , smooth_init , NULL , smooth_end_frame_filter } ,
} ;
static av_cold int init ( AVFilterContext * ctx , const char * args , void * opaque )
{
OCVContext * ocv = ctx - > priv ;
char name [ 128 ] , priv_args [ 1024 ] ;
int i ;
char c ;
sscanf ( args , " %127[^=:]%c%1023s " , name , & c , priv_args ) ;
for ( i = 0 ; i < FF_ARRAY_ELEMS ( ocv_filter_entries ) ; i + + ) {
OCVFilterEntry * entry = & ocv_filter_entries [ i ] ;
if ( ! strcmp ( name , entry - > name ) ) {
ocv - > name = entry - > name ;
ocv - > init = entry - > init ;
ocv - > uninit = entry - > uninit ;
ocv - > end_frame_filter = entry - > end_frame_filter ;
if ( ! ( ocv - > priv = av_mallocz ( entry - > priv_size ) ) )
return AVERROR ( ENOMEM ) ;
return ocv - > init ( ctx , priv_args , opaque ) ;
}
}
av_log ( ctx , AV_LOG_ERROR , " No libopencv filter named '%s' \n " , name ) ;
return AVERROR ( EINVAL ) ;
}
static av_cold void uninit ( AVFilterContext * ctx )
{
OCVContext * ocv = ctx - > priv ;
if ( ocv - > uninit )
ocv - > uninit ( ctx ) ;
av_free ( ocv - > priv ) ;
memset ( ocv , 0 , sizeof ( * ocv ) ) ;
}
static void end_frame ( AVFilterLink * inlink )
{
AVFilterContext * ctx = inlink - > dst ;
OCVContext * ocv = ctx - > priv ;
AVFilterLink * outlink = inlink - > dst - > outputs [ 0 ] ;
AVFilterBufferRef * inpicref = inlink - > cur_buf ;
AVFilterBufferRef * outpicref = outlink - > out_buf ;
IplImage inimg , outimg ;
fill_iplimage_from_picref ( & inimg , inpicref , inlink - > format ) ;
fill_iplimage_from_picref ( & outimg , outpicref , inlink - > format ) ;
cvSmooth ( & inimg , & outimg , smooth - > type , smooth - > param1 , smooth - > param2 , smooth - > param3 , smooth - > param4 ) ;
ocv - > end_frame_filter ( ctx , & inimg , & outimg ) ;
fill_picref_from_iplimage ( outpicref , & outimg , inlink - > format ) ;
avfilter_unref_buffer ( inpicref ) ;
@ -132,19 +196,20 @@ static void smooth_end_frame(AVFilterLink *inlink)
avfilter_unref_buffer ( outpicref ) ;
}
AVFilter avfilter_vf_ocv_smooth = {
. name = " ocv_smooth " ,
. description = NULL_IF_CONFIG_SMALL ( " Apply smooth transform using libopencv. " ) ,
AVFilter avfilter_vf_ocv = {
. name = " ocv " ,
. description = NULL_IF_CONFIG_SMALL ( " Apply transform using libopencv. " ) ,
. priv_size = sizeof ( Smooth Context) ,
. priv_size = sizeof ( OCV Context) ,
. query_formats = query_formats ,
. init = smooth_init ,
. init = init ,
. uninit = uninit ,
. inputs = ( AVFilterPad [ ] ) { { . name = " default " ,
. type = AVMEDIA_TYPE_VIDEO ,
. draw_slice = null_draw_slice ,
. end_frame = smooth_ end_frame,
. end_frame = end_frame ,
. min_perms = AV_PERM_READ } ,
{ . name = NULL } } ,
@ -152,5 +217,3 @@ AVFilter avfilter_vf_ocv_smooth = {
. type = AVMEDIA_TYPE_VIDEO , } ,
{ . name = NULL } } ,
} ;
# endif /* CONFIG_OCV_SMOOTH_FILTER */