@ -248,6 +248,103 @@ static void infer_completion_callback(void *args)
}
}
}
}
static DNNReturnType init_model_ov ( OVModel * ov_model )
{
OVContext * ctx = & ov_model - > ctx ;
IEStatusCode status ;
ie_available_devices_t a_dev ;
ie_config_t config = { NULL , NULL , NULL } ;
char * all_dev_names = NULL ;
// batch size
if ( ctx - > options . batch_size < = 0 ) {
ctx - > options . batch_size = 1 ;
}
if ( ctx - > options . batch_size > 1 ) {
input_shapes_t input_shapes ;
status = ie_network_get_input_shapes ( ov_model - > network , & input_shapes ) ;
if ( status ! = OK )
goto err ;
for ( int i = 0 ; i < input_shapes . shape_num ; i + + )
input_shapes . shapes [ i ] . shape . dims [ 0 ] = ctx - > options . batch_size ;
status = ie_network_reshape ( ov_model - > network , input_shapes ) ;
ie_network_input_shapes_free ( & input_shapes ) ;
if ( status ! = OK )
goto err ;
}
status = ie_core_load_network ( ov_model - > core , ov_model - > network , ctx - > options . device_type , & config , & ov_model - > exe_network ) ;
if ( status ! = OK ) {
av_log ( ctx , AV_LOG_ERROR , " Failed to load OpenVINO model network \n " ) ;
status = ie_core_get_available_devices ( ov_model - > core , & a_dev ) ;
if ( status ! = OK ) {
av_log ( ctx , AV_LOG_ERROR , " Failed to get available devices \n " ) ;
goto err ;
}
for ( int i = 0 ; i < a_dev . num_devices ; i + + ) {
APPEND_STRING ( all_dev_names , a_dev . devices [ i ] )
}
av_log ( ctx , AV_LOG_ERROR , " device %s may not be supported, all available devices are: \" %s \" \n " ,
ctx - > options . device_type , all_dev_names ) ;
goto err ;
}
// create infer_request for sync execution
status = ie_exec_network_create_infer_request ( ov_model - > exe_network , & ov_model - > infer_request ) ;
if ( status ! = OK )
goto err ;
// create infer_requests for async execution
if ( ctx - > options . nireq < = 0 ) {
// the default value is a rough estimation
ctx - > options . nireq = av_cpu_count ( ) / 2 + 1 ;
}
ov_model - > request_queue = ff_safe_queue_create ( ) ;
if ( ! ov_model - > request_queue ) {
goto err ;
}
for ( int i = 0 ; i < ctx - > options . nireq ; i + + ) {
RequestItem * item = av_mallocz ( sizeof ( * item ) ) ;
if ( ! item ) {
goto err ;
}
status = ie_exec_network_create_infer_request ( ov_model - > exe_network , & item - > infer_request ) ;
if ( status ! = OK ) {
av_freep ( & item ) ;
goto err ;
}
item - > tasks = av_malloc_array ( ctx - > options . batch_size , sizeof ( * item - > tasks ) ) ;
if ( ! item - > tasks ) {
av_freep ( & item ) ;
goto err ;
}
item - > task_count = 0 ;
item - > callback . completeCallBackFunc = infer_completion_callback ;
item - > callback . args = item ;
if ( ff_safe_queue_push_back ( ov_model - > request_queue , item ) < 0 ) {
av_freep ( & item ) ;
goto err ;
}
}
ov_model - > task_queue = ff_queue_create ( ) ;
if ( ! ov_model - > task_queue ) {
goto err ;
}
return DNN_SUCCESS ;
err :
ff_dnn_free_model_ov ( & ov_model - > model ) ;
return DNN_ERROR ;
}
static DNNReturnType execute_model_ov ( RequestItem * request )
static DNNReturnType execute_model_ov ( RequestItem * request )
{
{
IEStatusCode status ;
IEStatusCode status ;
@ -367,6 +464,13 @@ static DNNReturnType get_output_ov(void *model, const char *input_name, int inpu
in_frame - > width = input_width ;
in_frame - > width = input_width ;
in_frame - > height = input_height ;
in_frame - > height = input_height ;
if ( ! ov_model - > exe_network ) {
if ( init_model_ov ( ov_model ) ! = DNN_SUCCESS ) {
av_log ( ctx , AV_LOG_ERROR , " Failed init OpenVINO exectuable network or inference request \n " ) ;
return DNN_ERROR ;
} ;
}
task . done = 0 ;
task . done = 0 ;
task . do_ioproc = 0 ;
task . do_ioproc = 0 ;
task . async = 0 ;
task . async = 0 ;
@ -391,13 +495,10 @@ static DNNReturnType get_output_ov(void *model, const char *input_name, int inpu
DNNModel * ff_dnn_load_model_ov ( const char * model_filename , const char * options , AVFilterContext * filter_ctx )
DNNModel * ff_dnn_load_model_ov ( const char * model_filename , const char * options , AVFilterContext * filter_ctx )
{
{
char * all_dev_names = NULL ;
DNNModel * model = NULL ;
DNNModel * model = NULL ;
OVModel * ov_model = NULL ;
OVModel * ov_model = NULL ;
OVContext * ctx = NULL ;
OVContext * ctx = NULL ;
IEStatusCode status ;
IEStatusCode status ;
ie_config_t config = { NULL , NULL , NULL } ;
ie_available_devices_t a_dev ;
model = av_mallocz ( sizeof ( DNNModel ) ) ;
model = av_mallocz ( sizeof ( DNNModel ) ) ;
if ( ! model ) {
if ( ! model ) {
@ -429,88 +530,6 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, const char *options,
if ( status ! = OK )
if ( status ! = OK )
goto err ;
goto err ;
// batch size
if ( ctx - > options . batch_size < = 0 ) {
ctx - > options . batch_size = 1 ;
}
if ( ctx - > options . batch_size > 1 ) {
input_shapes_t input_shapes ;
status = ie_network_get_input_shapes ( ov_model - > network , & input_shapes ) ;
if ( status ! = OK )
goto err ;
for ( int i = 0 ; i < input_shapes . shape_num ; i + + )
input_shapes . shapes [ i ] . shape . dims [ 0 ] = ctx - > options . batch_size ;
status = ie_network_reshape ( ov_model - > network , input_shapes ) ;
ie_network_input_shapes_free ( & input_shapes ) ;
if ( status ! = OK )
goto err ;
}
status = ie_core_load_network ( ov_model - > core , ov_model - > network , ctx - > options . device_type , & config , & ov_model - > exe_network ) ;
if ( status ! = OK ) {
av_log ( ctx , AV_LOG_ERROR , " Failed to init OpenVINO model \n " ) ;
status = ie_core_get_available_devices ( ov_model - > core , & a_dev ) ;
if ( status ! = OK ) {
av_log ( ctx , AV_LOG_ERROR , " Failed to get available devices \n " ) ;
goto err ;
}
for ( int i = 0 ; i < a_dev . num_devices ; i + + ) {
APPEND_STRING ( all_dev_names , a_dev . devices [ i ] )
}
av_log ( ctx , AV_LOG_ERROR , " device %s may not be supported, all available devices are: \" %s \" \n " ,
ctx - > options . device_type , all_dev_names ) ;
goto err ;
}
// create infer_request for sync execution
status = ie_exec_network_create_infer_request ( ov_model - > exe_network , & ov_model - > infer_request ) ;
if ( status ! = OK )
goto err ;
// create infer_requests for async execution
if ( ctx - > options . nireq < = 0 ) {
// the default value is a rough estimation
ctx - > options . nireq = av_cpu_count ( ) / 2 + 1 ;
}
ov_model - > request_queue = ff_safe_queue_create ( ) ;
if ( ! ov_model - > request_queue ) {
goto err ;
}
for ( int i = 0 ; i < ctx - > options . nireq ; i + + ) {
RequestItem * item = av_mallocz ( sizeof ( * item ) ) ;
if ( ! item ) {
goto err ;
}
status = ie_exec_network_create_infer_request ( ov_model - > exe_network , & item - > infer_request ) ;
if ( status ! = OK ) {
av_freep ( & item ) ;
goto err ;
}
item - > tasks = av_malloc_array ( ctx - > options . batch_size , sizeof ( * item - > tasks ) ) ;
if ( ! item - > tasks ) {
av_freep ( & item ) ;
goto err ;
}
item - > task_count = 0 ;
item - > callback . completeCallBackFunc = infer_completion_callback ;
item - > callback . args = item ;
if ( ff_safe_queue_push_back ( ov_model - > request_queue , item ) < 0 ) {
av_freep ( & item ) ;
goto err ;
}
}
ov_model - > task_queue = ff_queue_create ( ) ;
if ( ! ov_model - > task_queue ) {
goto err ;
}
model - > get_input = & get_input_ov ;
model - > get_input = & get_input_ov ;
model - > get_output = & get_output_ov ;
model - > get_output = & get_output_ov ;
model - > options = options ;
model - > options = options ;
@ -554,6 +573,13 @@ DNNReturnType ff_dnn_execute_model_ov(const DNNModel *model, const char *input_n
return DNN_ERROR ;
return DNN_ERROR ;
}
}
if ( ! ov_model - > exe_network ) {
if ( init_model_ov ( ov_model ) ! = DNN_SUCCESS ) {
av_log ( ctx , AV_LOG_ERROR , " Failed init OpenVINO exectuable network or inference request \n " ) ;
return DNN_ERROR ;
} ;
}
task . done = 0 ;
task . done = 0 ;
task . do_ioproc = 1 ;
task . do_ioproc = 1 ;
task . async = 0 ;
task . async = 0 ;
@ -594,6 +620,13 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i
return DNN_ERROR ;
return DNN_ERROR ;
}
}
if ( ! ov_model - > exe_network ) {
if ( init_model_ov ( ov_model ) ! = DNN_SUCCESS ) {
av_log ( ctx , AV_LOG_ERROR , " Failed init OpenVINO exectuable network or inference request \n " ) ;
return DNN_ERROR ;
} ;
}
task - > done = 0 ;
task - > done = 0 ;
task - > do_ioproc = 1 ;
task - > do_ioproc = 1 ;
task - > async = 1 ;
task - > async = 1 ;