mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-05-13 21:26:33 +02:00
lavfi/dnn_backend_openvino.c: unify code for infer request for sync/async
This commit is contained in:
parent
ed409b8088
commit
1b5dc712cd
@ -52,9 +52,6 @@ typedef struct OVModel{
|
|||||||
ie_core_t *core;
|
ie_core_t *core;
|
||||||
ie_network_t *network;
|
ie_network_t *network;
|
||||||
ie_executable_network_t *exe_network;
|
ie_executable_network_t *exe_network;
|
||||||
ie_infer_request_t *infer_request;
|
|
||||||
|
|
||||||
/* for async execution */
|
|
||||||
SafeQueue *request_queue; // holds RequestItem
|
SafeQueue *request_queue; // holds RequestItem
|
||||||
Queue *task_queue; // holds TaskItem
|
Queue *task_queue; // holds TaskItem
|
||||||
} OVModel;
|
} OVModel;
|
||||||
@ -269,12 +266,9 @@ static void infer_completion_callback(void *args)
|
|||||||
ie_blob_free(&output_blob);
|
ie_blob_free(&output_blob);
|
||||||
|
|
||||||
request->task_count = 0;
|
request->task_count = 0;
|
||||||
|
if (ff_safe_queue_push_back(requestq, request) < 0) {
|
||||||
if (task->async) {
|
av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n");
|
||||||
if (ff_safe_queue_push_back(requestq, request) < 0) {
|
return;
|
||||||
av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -347,11 +341,6 @@ static DNNReturnType init_model_ov(OVModel *ov_model, const char *input_name, co
|
|||||||
goto err;
|
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
|
// create infer_requests for async execution
|
||||||
if (ctx->options.nireq <= 0) {
|
if (ctx->options.nireq <= 0) {
|
||||||
// the default value is a rough estimation
|
// the default value is a rough estimation
|
||||||
@ -502,10 +491,9 @@ static DNNReturnType get_output_ov(void *model, const char *input_name, int inpu
|
|||||||
OVModel *ov_model = model;
|
OVModel *ov_model = model;
|
||||||
OVContext *ctx = &ov_model->ctx;
|
OVContext *ctx = &ov_model->ctx;
|
||||||
TaskItem task;
|
TaskItem task;
|
||||||
RequestItem request;
|
RequestItem *request;
|
||||||
AVFrame *in_frame = NULL;
|
AVFrame *in_frame = NULL;
|
||||||
AVFrame *out_frame = NULL;
|
AVFrame *out_frame = NULL;
|
||||||
TaskItem *ptask = &task;
|
|
||||||
IEStatusCode status;
|
IEStatusCode status;
|
||||||
input_shapes_t input_shapes;
|
input_shapes_t input_shapes;
|
||||||
|
|
||||||
@ -557,11 +545,16 @@ static DNNReturnType get_output_ov(void *model, const char *input_name, int inpu
|
|||||||
task.out_frame = out_frame;
|
task.out_frame = out_frame;
|
||||||
task.ov_model = ov_model;
|
task.ov_model = ov_model;
|
||||||
|
|
||||||
request.infer_request = ov_model->infer_request;
|
request = ff_safe_queue_pop_front(ov_model->request_queue);
|
||||||
request.task_count = 1;
|
if (!request) {
|
||||||
request.tasks = &ptask;
|
av_frame_free(&out_frame);
|
||||||
|
av_frame_free(&in_frame);
|
||||||
|
av_log(ctx, AV_LOG_ERROR, "unable to get infer request.\n");
|
||||||
|
return DNN_ERROR;
|
||||||
|
}
|
||||||
|
request->tasks[request->task_count++] = &task;
|
||||||
|
|
||||||
ret = execute_model_ov(&request);
|
ret = execute_model_ov(request);
|
||||||
*output_width = out_frame->width;
|
*output_width = out_frame->width;
|
||||||
*output_height = out_frame->height;
|
*output_height = out_frame->height;
|
||||||
|
|
||||||
@ -633,8 +626,7 @@ DNNReturnType ff_dnn_execute_model_ov(const DNNModel *model, const char *input_n
|
|||||||
OVModel *ov_model = model->model;
|
OVModel *ov_model = model->model;
|
||||||
OVContext *ctx = &ov_model->ctx;
|
OVContext *ctx = &ov_model->ctx;
|
||||||
TaskItem task;
|
TaskItem task;
|
||||||
RequestItem request;
|
RequestItem *request;
|
||||||
TaskItem *ptask = &task;
|
|
||||||
|
|
||||||
if (!in_frame) {
|
if (!in_frame) {
|
||||||
av_log(ctx, AV_LOG_ERROR, "in frame is NULL when execute model.\n");
|
av_log(ctx, AV_LOG_ERROR, "in frame is NULL when execute model.\n");
|
||||||
@ -674,11 +666,14 @@ DNNReturnType ff_dnn_execute_model_ov(const DNNModel *model, const char *input_n
|
|||||||
task.out_frame = out_frame;
|
task.out_frame = out_frame;
|
||||||
task.ov_model = ov_model;
|
task.ov_model = ov_model;
|
||||||
|
|
||||||
request.infer_request = ov_model->infer_request;
|
request = ff_safe_queue_pop_front(ov_model->request_queue);
|
||||||
request.task_count = 1;
|
if (!request) {
|
||||||
request.tasks = &ptask;
|
av_log(ctx, AV_LOG_ERROR, "unable to get infer request.\n");
|
||||||
|
return DNN_ERROR;
|
||||||
|
}
|
||||||
|
request->tasks[request->task_count++] = &task;
|
||||||
|
|
||||||
return execute_model_ov(&request);
|
return execute_model_ov(request);
|
||||||
}
|
}
|
||||||
|
|
||||||
DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *input_name, AVFrame *in_frame,
|
DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *input_name, AVFrame *in_frame,
|
||||||
@ -821,8 +816,6 @@ void ff_dnn_free_model_ov(DNNModel **model)
|
|||||||
}
|
}
|
||||||
ff_queue_destroy(ov_model->task_queue);
|
ff_queue_destroy(ov_model->task_queue);
|
||||||
|
|
||||||
if (ov_model->infer_request)
|
|
||||||
ie_infer_request_free(&ov_model->infer_request);
|
|
||||||
if (ov_model->exe_network)
|
if (ov_model->exe_network)
|
||||||
ie_exec_network_free(&ov_model->exe_network);
|
ie_exec_network_free(&ov_model->exe_network);
|
||||||
if (ov_model->network)
|
if (ov_model->network)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user