This commit rearranges the existing code to create a separate function for the completion callback in execute_model_tf.
Showing the changes to libavfilter/dnn (1 of 1 file). Show all
Unified · Split
| @@ -915,6 +915,65 @@ static DNNReturnType fill_model_input_tf(TFModel *tf_model, TFRequestItem *reque · 914 unmodified lines | ||
| 915 | 915 | return DNN_SUCCESS; |
| 916 | 916 | } |
| 917 | 917 | |
| 918 | +static void infer_completion_callback(void *args) { | |
| 919 | + TFRequestItem *request = args; | |
| 920 | + InferenceItem *inference = request->inference; | |
| 921 | + TaskItem *task = inference->task; | |
| 922 | + DNNData *outputs; | |
| 923 | + TFInferRequest *infer_request = request->infer_request; | |
| 924 | + TFModel *tf_model = task->model; | |
| 925 | + TFContext *ctx = &tf_model->ctx; | |
| 926 | + | |
| 927 | + outputs = av_malloc_array(task->nb_output, sizeof(*outputs)); | |
| 928 | + if (!outputs) { | |
| 929 | + av_log(ctx, AV_LOG_ERROR, "Failed to allocate memory for *outputs\n"); | |
| 930 | + goto err; | |
| 931 | + } | |
| 932 | + | |
| 933 | + for (uint32_t i = 0; i < task->nb_output; ++i) { | |
| 934 | + outputs[i].height = TF_Dim(infer_request->output_tensors[i], 1); | |
| 935 | + outputs[i].width = TF_Dim(infer_request->output_tensors[i], 2); | |
| 936 | + outputs[i].channels = TF_Dim(infer_request->output_tensors[i], 3); | |
| 937 | + outputs[i].data = TF_TensorData(infer_request->output_tensors[i]); | |
| 938 | + outputs[i].dt = TF_TensorType(infer_request->output_tensors[i]); | |
| 939 | + } | |
| 940 | + switch (tf_model->model->func_type) { | |
| 941 | + case DFT_PROCESS_FRAME: | |
| 942 | + //it only support 1 output if it's frame in & frame out | |
| 943 | + if (task->do_ioproc) { | |
| 944 | + if (tf_model->model->frame_post_proc != NULL) { | |
| 945 | + tf_model->model->frame_post_proc(task->out_frame, outputs, tf_model->model->filter_ctx); | |
| 946 | + } else { | |
| 947 | + ff_proc_from_dnn_to_frame(task->out_frame, outputs, ctx); | |
| 948 | + } | |
| 949 | + } else { | |
| 950 | + task->out_frame->width = outputs[0].width; | |
| 951 | + task->out_frame->height = outputs[0].height; | |
| 952 | + } | |
| 953 | + break; | |
| 954 | + case DFT_ANALYTICS_DETECT: | |
| 955 | + if (!tf_model->model->detect_post_proc) { | |
| 956 | + av_log(ctx, AV_LOG_ERROR, "Detect filter needs provide post proc\n"); | |
| 957 | + return; | |
| 958 | + } | |
| 959 | + tf_model->model->detect_post_proc(task->out_frame, outputs, task->nb_output, tf_model->model->filter_ctx); | |
| 960 | + break; | |
| 961 | + default: | |
| 962 | + av_log(ctx, AV_LOG_ERROR, "Tensorflow backend does not support this kind of dnn filter now\n"); | |
| 963 | + goto err; | |
| 964 | + } | |
| 965 | + task->inference_done++; | |
| 966 | +err: | |
| 967 | + tf_free_request(infer_request); | |
| 968 | + av_freep(&outputs); | |
| 969 | + | |
| 970 | + if (ff_safe_queue_push_back(tf_model->request_queue, request) < 0) { | |
| 971 | + av_freep(&request->infer_request); | |
| 972 | + av_freep(&request); | |
| 973 | + av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n"); | |
| 974 | + } | |
| 975 | +} | |
| 976 | + | |
| 918 | 977 | static DNNReturnType execute_model_tf(TFRequestItem *request, Queue *inference_queue) |
| 919 | 978 | { |
| 920 | 979 | TFModel *tf_model; |
| @@ -922,7 +981,6 @@ static DNNReturnType execute_model_tf(TFRequestItem *request, Queue *inference_q · 1 unmodified line | ||
| 922 | 981 | TFInferRequest *infer_request; |
| 923 | 982 | InferenceItem *inference; |
| 924 | 983 | TaskItem *task; |
| 925 | − DNNData *outputs; | |
| 926 | 984 | |
| 927 | 985 | inference = ff_queue_peek_front(inference_queue); |
| 928 | 986 | task = inference->task; |
| @@ -944,56 +1002,11 @@ static DNNReturnType execute_model_tf(TFRequestItem *request, Queue *inference_q · 15 unmodified lines | ||
| 944 | 1002 | task->nb_output, NULL, 0, NULL, |
| 945 | 1003 | tf_model->status); |
| 946 | 1004 | if (TF_GetCode(tf_model->status) != TF_OK) { |
| 947 | − tf_free_request(infer_request); | |
| 948 | − av_log(ctx, AV_LOG_ERROR, "Failed to run session when executing model\n"); | |
| 949 | − return DNN_ERROR; | |
| 950 | − } | |
| 951 | − | |
| 952 | − outputs = av_malloc_array(task->nb_output, sizeof(*outputs)); | |
| 953 | − if (!outputs) { | |
| 954 | − tf_free_request(infer_request); | |
| 955 | − av_log(ctx, AV_LOG_ERROR, "Failed to allocate memory for *outputs\n"); | |
| 956 | − return DNN_ERROR; | |
| 957 | − } | |
| 958 | − | |
| 959 | − for (uint32_t i = 0; i < task->nb_output; ++i) { | |
| 960 | − outputs[i].height = TF_Dim(infer_request->output_tensors[i], 1); | |
| 961 | − outputs[i].width = TF_Dim(infer_request->output_tensors[i], 2); | |
| 962 | − outputs[i].channels = TF_Dim(infer_request->output_tensors[i], 3); | |
| 963 | − outputs[i].data = TF_TensorData(infer_request->output_tensors[i]); | |
| 964 | − outputs[i].dt = TF_TensorType(infer_request->output_tensors[i]); | |
| 965 | − } | |
| 966 | − switch (tf_model->model->func_type) { | |
| 967 | − case DFT_PROCESS_FRAME: | |
| 968 | − //it only support 1 output if it's frame in & frame out | |
| 969 | − if (task->do_ioproc) { | |
| 970 | − if (tf_model->model->frame_post_proc != NULL) { | |
| 971 | − tf_model->model->frame_post_proc(task->out_frame, outputs, tf_model->model->filter_ctx); | |
| 972 | − } else { | |
| 973 | − ff_proc_from_dnn_to_frame(task->out_frame, outputs, ctx); | |
| 974 | − } | |
| 975 | − } else { | |
| 976 | − task->out_frame->width = outputs[0].width; | |
| 977 | − task->out_frame->height = outputs[0].height; | |
| 978 | − } | |
| 979 | − break; | |
| 980 | − case DFT_ANALYTICS_DETECT: | |
| 981 | − if (!tf_model->model->detect_post_proc) { | |
| 982 | − av_log(ctx, AV_LOG_ERROR, "Detect filter needs provide post proc\n"); | |
| 983 | − return DNN_ERROR; | |
| 984 | − } | |
| 985 | − tf_model->model->detect_post_proc(task->out_frame, outputs, task->nb_output, tf_model->model->filter_ctx); | |
| 986 | − break; | |
| 987 | − default: | |
| 988 | 1005 | tf_free_request(infer_request); |
| 989 | − | |
| 990 | − av_log(ctx, AV_LOG_ERROR, "Tensorflow backend does not support this kind of dnn filter now\n"); | |
| 1006 | + av_log(ctx, AV_LOG_ERROR, "Failed to run session when executing model\n"); | |
| 991 | 1007 | return DNN_ERROR; |
| 992 | 1008 | } |
| 993 | − task->inference_done++; | |
| 994 | − tf_free_request(infer_request); | |
| 995 | − av_freep(&outputs); | |
| 996 | − ff_safe_queue_push_back(tf_model->request_queue, request); | |
| 1009 | + infer_completion_callback(request); | |
| 997 | 1010 | return (task->inference_done == task->inference_todo) ? DNN_SUCCESS : DNN_ERROR; |
| 998 | 1011 | } |
| 999 | 1012 | } |