From patchwork Wed Dec 30 15:35:06 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Yejun" X-Patchwork-Id: 24689 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 96BFD44B600 for ; Wed, 30 Dec 2020 17:36:31 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6858268A0C3; Wed, 30 Dec 2020 17:36:31 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga09.intel.com (mga09.intel.com [134.134.136.24]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0E87F6882F5 for ; Wed, 30 Dec 2020 17:36:24 +0200 (EET) IronPort-SDR: Im9E8d+Rr40Kysuor/p6M0Qvc+YLYudwSLp72xDSjmigpiz6982jFjzMw8Ozr/42E0f+HD/Fav GTppmx1V4Vjw== X-IronPort-AV: E=McAfee;i="6000,8403,9850"; a="176767981" X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="176767981" Received: from orsmga008.jf.intel.com ([10.7.209.65]) by orsmga102.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2020 07:36:22 -0800 IronPort-SDR: fdnLR2sGKlIq5jWNIs1oDxxpy57krWPn/gUpbqH4UWDX8Pffi5KJmdpLbGCM4DvKLp3OktcBD5 RbVIHJ5AFsug== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="376447955" Received: from yguo18-skl-u1604.sh.intel.com ([10.239.159.53]) by orsmga008.jf.intel.com with ESMTP; 30 Dec 2020 07:36:21 -0800 From: "Guo, Yejun" To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Dec 2020 23:35:06 +0800 Message-Id: <20201230153506.25608-1-yejun.guo@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH V2 1/3] dnn: fix redefining typedefs and also refine naming with correct prefix X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: yejun.guo@intel.com MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" The prefix for symbols not exported from the library and not local to one translation unit is ff_ (or FF for types). Signed-off-by: Guo, Yejun --- libavfilter/dnn/dnn_backend_openvino.c | 32 ++++++------- libavfilter/dnn/queue.c | 66 +++++++++++++------------- libavfilter/dnn/queue.h | 20 ++++---- libavfilter/dnn/safe_queue.c | 34 ++++++------- libavfilter/dnn/safe_queue.h | 14 +++--- 5 files changed, 83 insertions(+), 83 deletions(-) diff --git a/libavfilter/dnn/dnn_backend_openvino.c b/libavfilter/dnn/dnn_backend_openvino.c index a35d72a38c..331f13b263 100644 --- a/libavfilter/dnn/dnn_backend_openvino.c +++ b/libavfilter/dnn/dnn_backend_openvino.c @@ -53,8 +53,8 @@ typedef struct OVModel{ ie_infer_request_t *infer_request; /* for async execution */ - safe_queue *request_queue; // holds RequestItem - queue *task_queue; // holds TaskItem + FFSafeQueue *request_queue; // holds RequestItem + FFQueue *task_queue; // holds TaskItem } OVModel; typedef struct TaskItem { @@ -208,7 +208,7 @@ static void infer_completion_callback(void *args) if (task->async) { request->task = NULL; - safe_queue_push_back(task->ov_model->request_queue, request); + ff_safe_queue_push_back(task->ov_model->request_queue, request); } task->done = 1; @@ -417,7 +417,7 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, const char *options, ctx->options.nireq = av_cpu_count() / 2 + 1; } - ov_model->request_queue = safe_queue_create(); + ov_model->request_queue = ff_safe_queue_create(); if (!ov_model->request_queue) { goto err; } @@ -436,10 +436,10 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, const char *options, item->infer_request = request; item->callback.completeCallBackFunc = infer_completion_callback; item->callback.args = item; - safe_queue_push_back(ov_model->request_queue, item); + ff_safe_queue_push_back(ov_model->request_queue, item); } - ov_model->task_queue = queue_create(); + ov_model->task_queue = ff_queue_create(); if (!ov_model->task_queue) { goto err; } @@ -527,9 +527,9 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i task->output_name = output_names[0]; task->out_frame = out_frame; task->ov_model = ov_model; - queue_push_back(ov_model->task_queue, task); + ff_queue_push_back(ov_model->task_queue, task); - request = safe_queue_pop_front(ov_model->request_queue); + request = ff_safe_queue_pop_front(ov_model->request_queue); if (!request) { av_log(ctx, AV_LOG_ERROR, "unable to get infer request.\n"); return DNN_ERROR; @@ -541,7 +541,7 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i DNNAsyncStatusType ff_dnn_get_async_result_ov(const DNNModel *model, AVFrame **in, AVFrame **out) { OVModel *ov_model = (OVModel *)model->model; - TaskItem *task = queue_peek_front(ov_model->task_queue); + TaskItem *task = ff_queue_peek_front(ov_model->task_queue); if (!task) { return DAST_EMPTY_QUEUE; @@ -553,7 +553,7 @@ DNNAsyncStatusType ff_dnn_get_async_result_ov(const DNNModel *model, AVFrame **i *in = task->in_frame; *out = task->out_frame; - queue_pop_front(ov_model->task_queue); + ff_queue_pop_front(ov_model->task_queue); av_freep(&task); return DAST_SUCCESS; @@ -563,20 +563,20 @@ void ff_dnn_free_model_ov(DNNModel **model) { if (*model){ OVModel *ov_model = (OVModel *)(*model)->model; - while (safe_queue_size(ov_model->request_queue) != 0) { - RequestItem *item = safe_queue_pop_front(ov_model->request_queue); + while (ff_safe_queue_size(ov_model->request_queue) != 0) { + RequestItem *item = ff_safe_queue_pop_front(ov_model->request_queue); if (item && item->infer_request) { ie_infer_request_free(&item->infer_request); } av_freep(&item); } - safe_queue_destroy(ov_model->request_queue); + ff_safe_queue_destroy(ov_model->request_queue); - while (queue_size(ov_model->task_queue) != 0) { - TaskItem *item = queue_pop_front(ov_model->task_queue); + while (ff_queue_size(ov_model->task_queue) != 0) { + TaskItem *item = ff_queue_pop_front(ov_model->task_queue); av_freep(&item); } - 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); diff --git a/libavfilter/dnn/queue.c b/libavfilter/dnn/queue.c index 0a07c5473d..aa912b6f3a 100644 --- a/libavfilter/dnn/queue.c +++ b/libavfilter/dnn/queue.c @@ -23,31 +23,31 @@ #include "libavutil/mem.h" #include "libavutil/avassert.h" -typedef struct _queue_entry queue_entry; +typedef struct FFQueueEntry FFQueueEntry; -typedef struct _queue { - queue_entry *head; - queue_entry *tail; - size_t length; -}queue; - -typedef struct _queue_entry { +struct FFQueueEntry { void *value; - queue_entry *prev; - queue_entry *next; -} queue_entry; + FFQueueEntry *prev; + FFQueueEntry *next; +}; + +struct FFQueue { + FFQueueEntry *head; + FFQueueEntry *tail; + size_t length; +}; -static inline queue_entry *create_entry(void *val) +static inline FFQueueEntry *create_entry(void *val) { - queue_entry *entry = av_malloc(sizeof(*entry)); + FFQueueEntry *entry = av_malloc(sizeof(*entry)); av_assert0(entry != NULL); entry->value = val; return entry; } -queue* queue_create(void) +FFQueue* ff_queue_create(void) { - queue *q = av_malloc(sizeof(*q)); + FFQueue *q = av_malloc(sizeof(*q)); if (!q) return NULL; @@ -62,15 +62,15 @@ queue* queue_create(void) return q; } -void queue_destroy(queue *q) +void ff_queue_destroy(FFQueue *q) { - queue_entry *entry; + FFQueueEntry *entry; if (!q) return; entry = q->head; while (entry != NULL) { - queue_entry *temp = entry; + FFQueueEntry *temp = entry; entry = entry->next; av_freep(&temp); } @@ -78,12 +78,12 @@ void queue_destroy(queue *q) av_freep(&q); } -size_t queue_size(queue *q) +size_t ff_queue_size(FFQueue *q) { return q ? q->length : 0; } -void *queue_peek_front(queue *q) +void *ff_queue_peek_front(FFQueue *q) { if (!q || q->length == 0) return NULL; @@ -91,7 +91,7 @@ void *queue_peek_front(queue *q) return q->head->next->value; } -void *queue_peek_back(queue *q) +void *ff_queue_peek_back(FFQueue *q) { if (!q || q->length == 0) return NULL; @@ -99,10 +99,10 @@ void *queue_peek_back(queue *q) return q->tail->prev->value; } -void queue_push_front(queue *q, void *v) +void ff_queue_push_front(FFQueue *q, void *v) { - queue_entry *new_entry; - queue_entry *original_next; + FFQueueEntry *new_entry; + FFQueueEntry *original_next; if (!q) return; @@ -116,10 +116,10 @@ void queue_push_front(queue *q, void *v) q->length++; } -void queue_push_back(queue *q, void *v) +void ff_queue_push_back(FFQueue *q, void *v) { - queue_entry *new_entry; - queue_entry *original_prev; + FFQueueEntry *new_entry; + FFQueueEntry *original_prev; if (!q) return; @@ -133,10 +133,10 @@ void queue_push_back(queue *q, void *v) q->length++; } -void *queue_pop_front(queue *q) +void *ff_queue_pop_front(FFQueue *q) { - queue_entry *front; - queue_entry *new_head_next; + FFQueueEntry *front; + FFQueueEntry *new_head_next; void *ret; if (!q || q->length == 0) @@ -154,10 +154,10 @@ void *queue_pop_front(queue *q) return ret; } -void *queue_pop_back(queue *q) +void *ff_queue_pop_back(FFQueue *q) { - queue_entry *back; - queue_entry *new_tail_prev; + FFQueueEntry *back; + FFQueueEntry *new_tail_prev; void *ret; if (!q || q->length == 0) diff --git a/libavfilter/dnn/queue.h b/libavfilter/dnn/queue.h index 75f42f403b..5703cef58c 100644 --- a/libavfilter/dnn/queue.h +++ b/libavfilter/dnn/queue.h @@ -22,20 +22,20 @@ #ifndef AVFILTER_DNN_QUEUE_H #define AVFILTER_DNN_QUEUE_H -typedef struct _queue queue; +typedef struct FFQueue FFQueue; -queue *queue_create(void); -void queue_destroy(queue *q); +FFQueue *ff_queue_create(void); +void ff_queue_destroy(FFQueue *q); -size_t queue_size(queue *q); +size_t ff_queue_size(FFQueue *q); -void *queue_peek_front(queue *q); -void *queue_peek_back(queue *q); +void *ff_queue_peek_front(FFQueue *q); +void *ff_queue_peek_back(FFQueue *q); -void queue_push_front(queue *q, void *v); -void queue_push_back(queue *q, void *v); +void ff_queue_push_front(FFQueue *q, void *v); +void ff_queue_push_back(FFQueue *q, void *v); -void *queue_pop_front(queue *q); -void *queue_pop_back(queue *q); +void *ff_queue_pop_front(FFQueue *q); +void *ff_queue_pop_back(FFQueue *q); #endif diff --git a/libavfilter/dnn/safe_queue.c b/libavfilter/dnn/safe_queue.c index dba2e0fbbc..52a60982b5 100644 --- a/libavfilter/dnn/safe_queue.c +++ b/libavfilter/dnn/safe_queue.c @@ -25,19 +25,19 @@ #include "libavutil/avassert.h" #include "libavutil/thread.h" -typedef struct _safe_queue { - queue *q; +struct FFSafeQueue { + FFQueue *q; pthread_mutex_t mutex; pthread_cond_t cond; -}safe_queue; +}; -safe_queue *safe_queue_create(void) +FFSafeQueue *ff_safe_queue_create(void) { - safe_queue *sq = av_malloc(sizeof(*sq)); + FFSafeQueue *sq = av_malloc(sizeof(*sq)); if (!sq) return NULL; - sq->q = queue_create(); + sq->q = ff_queue_create(); if (!sq->q) return NULL; @@ -46,46 +46,46 @@ safe_queue *safe_queue_create(void) return sq; } -void safe_queue_destroy(safe_queue *sq) +void ff_safe_queue_destroy(FFSafeQueue *sq) { if (!sq) return; - queue_destroy(sq->q); + ff_queue_destroy(sq->q); pthread_mutex_destroy(&sq->mutex); pthread_cond_destroy(&sq->cond); av_freep(&sq); } -size_t safe_queue_size(safe_queue *sq) +size_t ff_safe_queue_size(FFSafeQueue *sq) { - return sq ? queue_size(sq->q) : 0; + return sq ? ff_queue_size(sq->q) : 0; } -void safe_queue_push_front(safe_queue *sq, void *v) +void ff_safe_queue_push_front(FFSafeQueue *sq, void *v) { pthread_mutex_lock(&sq->mutex); - queue_push_front(sq->q, v); + ff_queue_push_front(sq->q, v); pthread_cond_signal(&sq->cond); pthread_mutex_unlock(&sq->mutex); } -void safe_queue_push_back(safe_queue *sq, void *v) +void ff_safe_queue_push_back(FFSafeQueue *sq, void *v) { pthread_mutex_lock(&sq->mutex); - queue_push_back(sq->q, v); + ff_queue_push_back(sq->q, v); pthread_cond_signal(&sq->cond); pthread_mutex_unlock(&sq->mutex); } -void *safe_queue_pop_front(safe_queue *sq) +void *ff_safe_queue_pop_front(FFSafeQueue *sq) { void *value; pthread_mutex_lock(&sq->mutex); - while (queue_size(sq->q) == 0) { + while (ff_queue_size(sq->q) == 0) { pthread_cond_wait(&sq->cond, &sq->mutex); } - value = queue_pop_front(sq->q); + value = ff_queue_pop_front(sq->q); pthread_cond_signal(&sq->cond); pthread_mutex_unlock(&sq->mutex); return value; diff --git a/libavfilter/dnn/safe_queue.h b/libavfilter/dnn/safe_queue.h index aaa15fadf2..85488e80ee 100644 --- a/libavfilter/dnn/safe_queue.h +++ b/libavfilter/dnn/safe_queue.h @@ -21,16 +21,16 @@ #ifndef AVFILTER_DNN_SAFE_QUEUE_H #define AVFILTER_DNN_SAFE_QUEUE_H -typedef struct _safe_queue safe_queue; +typedef struct FFSafeQueue FFSafeQueue; -safe_queue *safe_queue_create(void); -void safe_queue_destroy(safe_queue *sq); +FFSafeQueue *ff_safe_queue_create(void); +void ff_safe_queue_destroy(FFSafeQueue *sq); -size_t safe_queue_size(safe_queue *sq); +size_t ff_safe_queue_size(FFSafeQueue *sq); -void safe_queue_push_front(safe_queue *sq, void *v); -void safe_queue_push_back(safe_queue *sq, void *v); +void ff_safe_queue_push_front(FFSafeQueue *sq, void *v); +void ff_safe_queue_push_back(FFSafeQueue *sq, void *v); -void *safe_queue_pop_front(safe_queue *sq); +void *ff_safe_queue_pop_front(FFSafeQueue *sq); #endif From patchwork Wed Dec 30 15:35:14 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Yejun" X-Patchwork-Id: 24690 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 04AED44B600 for ; Wed, 30 Dec 2020 17:36:39 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id D552C689E50; Wed, 30 Dec 2020 17:36:38 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga06.intel.com (mga06.intel.com [134.134.136.31]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D0C806882F5 for ; Wed, 30 Dec 2020 17:36:31 +0200 (EET) IronPort-SDR: 4crqxEZqiagfBlsujMbFA2iuuetPFvOI0WawuUON6pvlzexIjpYU/sq9d4hgxeywVHaF2ypU9F 2HvVXO29eEyg== X-IronPort-AV: E=McAfee;i="6000,8403,9850"; a="238167098" X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="238167098" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by orsmga104.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2020 07:36:29 -0800 IronPort-SDR: NsBomPEv7Pf8QAJOh4x4w7Y3x/dGex6H++O8T0QyWR5qve5tQmsntwJARhKXUTykKPLBrMp2zg uIuCA6s/Z2sg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="347901232" Received: from yguo18-skl-u1604.sh.intel.com ([10.239.159.53]) by fmsmga008.fm.intel.com with ESMTP; 30 Dec 2020 07:36:28 -0800 From: "Guo, Yejun" To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Dec 2020 23:35:14 +0800 Message-Id: <20201230153514.25656-1-yejun.guo@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH V2 2/3] dnn: fix issue when pthread is not supported X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: yejun.guo@intel.com MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Guo, Yejun --- libavfilter/dnn/safe_queue.c | 50 ++++++++++++++++++++++----------- libavfilter/vf_dnn_processing.c | 7 +++++ 2 files changed, 41 insertions(+), 16 deletions(-) diff --git a/libavfilter/dnn/safe_queue.c b/libavfilter/dnn/safe_queue.c index 52a60982b5..559b939ec9 100644 --- a/libavfilter/dnn/safe_queue.c +++ b/libavfilter/dnn/safe_queue.c @@ -25,10 +25,28 @@ #include "libavutil/avassert.h" #include "libavutil/thread.h" +#if HAVE_PTHREAD_CANCEL +#define DNNCond pthread_cond_t +#define dnn_cond_init pthread_cond_init +#define dnn_cond_destroy pthread_cond_destroy +#define dnn_cond_signal pthread_cond_signal +#define dnn_cond_wait pthread_cond_wait +#else +#define DNNCond char +static inline int dnn_cond_init(DNNCond *cond, const void *attr) { return 0; } +static inline int dnn_cond_destroy(DNNCond *cond) { return 0; } +static inline int dnn_cond_signal(DNNCond *cond) { return 0; } +static inline int dnn_cond_wait(DNNCond *cond, AVMutex *mutex) +{ + av_assert0(!"should not reach here"); + return 0; +} +#endif + struct FFSafeQueue { FFQueue *q; - pthread_mutex_t mutex; - pthread_cond_t cond; + AVMutex mutex; + DNNCond cond; }; FFSafeQueue *ff_safe_queue_create(void) @@ -41,8 +59,8 @@ FFSafeQueue *ff_safe_queue_create(void) if (!sq->q) return NULL; - pthread_mutex_init(&sq->mutex, NULL); - pthread_cond_init(&sq->cond, NULL); + ff_mutex_init(&sq->mutex, NULL); + dnn_cond_init(&sq->cond, NULL); return sq; } @@ -52,8 +70,8 @@ void ff_safe_queue_destroy(FFSafeQueue *sq) return; ff_queue_destroy(sq->q); - pthread_mutex_destroy(&sq->mutex); - pthread_cond_destroy(&sq->cond); + ff_mutex_destroy(&sq->mutex); + dnn_cond_destroy(&sq->cond); av_freep(&sq); } @@ -64,29 +82,29 @@ size_t ff_safe_queue_size(FFSafeQueue *sq) void ff_safe_queue_push_front(FFSafeQueue *sq, void *v) { - pthread_mutex_lock(&sq->mutex); + ff_mutex_lock(&sq->mutex); ff_queue_push_front(sq->q, v); - pthread_cond_signal(&sq->cond); - pthread_mutex_unlock(&sq->mutex); + dnn_cond_signal(&sq->cond); + ff_mutex_unlock(&sq->mutex); } void ff_safe_queue_push_back(FFSafeQueue *sq, void *v) { - pthread_mutex_lock(&sq->mutex); + ff_mutex_lock(&sq->mutex); ff_queue_push_back(sq->q, v); - pthread_cond_signal(&sq->cond); - pthread_mutex_unlock(&sq->mutex); + dnn_cond_signal(&sq->cond); + ff_mutex_unlock(&sq->mutex); } void *ff_safe_queue_pop_front(FFSafeQueue *sq) { void *value; - pthread_mutex_lock(&sq->mutex); + ff_mutex_lock(&sq->mutex); while (ff_queue_size(sq->q) == 0) { - pthread_cond_wait(&sq->cond, &sq->mutex); + dnn_cond_wait(&sq->cond, &sq->mutex); } value = ff_queue_pop_front(sq->q); - pthread_cond_signal(&sq->cond); - pthread_mutex_unlock(&sq->mutex); + dnn_cond_signal(&sq->cond); + ff_mutex_unlock(&sq->mutex); return value; } diff --git a/libavfilter/vf_dnn_processing.c b/libavfilter/vf_dnn_processing.c index da4508b50e..fff5696a31 100644 --- a/libavfilter/vf_dnn_processing.c +++ b/libavfilter/vf_dnn_processing.c @@ -110,6 +110,13 @@ static av_cold int init(AVFilterContext *context) av_log(ctx, AV_LOG_WARNING, "this backend does not support async execution, roll back to sync.\n"); } +#if !HAVE_PTHREAD_CANCEL + if (ctx->async) { + ctx->async = 0; + av_log(ctx, AV_LOG_WARNING, "pthread is not supported, roll back to sync.\n"); + } +#endif + return 0; } From patchwork Wed Dec 30 15:35:24 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Yejun" X-Patchwork-Id: 24691 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 126E044B600 for ; Wed, 30 Dec 2020 17:36:49 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E9CB868A7D8; Wed, 30 Dec 2020 17:36:48 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga04.intel.com (mga04.intel.com [192.55.52.120]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id CE0C5689CF7 for ; Wed, 30 Dec 2020 17:36:41 +0200 (EET) IronPort-SDR: C1X55M/9fDk0u73zuabKhoIGZRi8Q0yCWPqQ2Nz0bYvsQ4S7XQe9YBquGhVnfaIRfizMwONK/I RSh9Bc/hhX0A== X-IronPort-AV: E=McAfee;i="6000,8403,9850"; a="174036880" X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="174036880" Received: from fmsmga008.fm.intel.com ([10.253.24.58]) by fmsmga104.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2020 07:36:40 -0800 IronPort-SDR: e9QF/vTGx6TFy0cn7Rrxm5s4qvsCYGubeRrnYqoIDleoRFaEKixgvJ8iG5nW1PzOen63o7fJOv Td1x87h9yaBQ== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,461,1599548400"; d="scan'208";a="347901300" Received: from yguo18-skl-u1604.sh.intel.com ([10.239.159.53]) by fmsmga008.fm.intel.com with ESMTP; 30 Dec 2020 07:36:39 -0800 From: "Guo, Yejun" To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Dec 2020 23:35:24 +0800 Message-Id: <20201230153524.25704-1-yejun.guo@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH V2 3/3] dnn/queue: add error check and cleanup X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: yejun.guo@intel.com MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Guo, Yejun --- libavfilter/dnn/dnn_backend_openvino.c | 16 ++++++++++++--- libavfilter/dnn/queue.c | 28 ++++++++++++++++++++------ libavfilter/dnn/queue.h | 4 ++-- libavfilter/dnn/safe_queue.c | 16 ++++++++++----- libavfilter/dnn/safe_queue.h | 4 ++-- 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/libavfilter/dnn/dnn_backend_openvino.c b/libavfilter/dnn/dnn_backend_openvino.c index 331f13b263..d27e451eea 100644 --- a/libavfilter/dnn/dnn_backend_openvino.c +++ b/libavfilter/dnn/dnn_backend_openvino.c @@ -208,7 +208,10 @@ static void infer_completion_callback(void *args) if (task->async) { request->task = NULL; - ff_safe_queue_push_back(task->ov_model->request_queue, request); + if (ff_safe_queue_push_back(task->ov_model->request_queue, request) < 0) { + av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n"); + return; + } } task->done = 1; @@ -436,7 +439,10 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, const char *options, item->infer_request = request; item->callback.completeCallBackFunc = infer_completion_callback; item->callback.args = item; - ff_safe_queue_push_back(ov_model->request_queue, 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(); @@ -527,7 +533,11 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i task->output_name = output_names[0]; task->out_frame = out_frame; task->ov_model = ov_model; - ff_queue_push_back(ov_model->task_queue, task); + if (ff_queue_push_back(ov_model->task_queue, task) < 0) { + av_freep(&task); + av_log(ctx, AV_LOG_ERROR, "unable to push back task_queue.\n"); + return DNN_ERROR; + } request = ff_safe_queue_pop_front(ov_model->request_queue); if (!request) { diff --git a/libavfilter/dnn/queue.c b/libavfilter/dnn/queue.c index aa912b6f3a..e64f567906 100644 --- a/libavfilter/dnn/queue.c +++ b/libavfilter/dnn/queue.c @@ -40,8 +40,8 @@ struct FFQueue { static inline FFQueueEntry *create_entry(void *val) { FFQueueEntry *entry = av_malloc(sizeof(*entry)); - av_assert0(entry != NULL); - entry->value = val; + if (entry) + entry->value = val; return entry; } @@ -53,6 +53,14 @@ FFQueue* ff_queue_create(void) q->head = create_entry(q); q->tail = create_entry(q); + + if (!q->head || !q->tail) { + av_freep(&q->head); + av_freep(&q->tail); + av_freep(&q); + return NULL; + } + q->head->next = q->tail; q->tail->prev = q->head; q->head->prev = NULL; @@ -99,14 +107,16 @@ void *ff_queue_peek_back(FFQueue *q) return q->tail->prev->value; } -void ff_queue_push_front(FFQueue *q, void *v) +int ff_queue_push_front(FFQueue *q, void *v) { FFQueueEntry *new_entry; FFQueueEntry *original_next; if (!q) - return; + return 0; new_entry = create_entry(v); + if (!new_entry) + return -1; original_next = q->head->next; q->head->next = new_entry; @@ -114,16 +124,20 @@ void ff_queue_push_front(FFQueue *q, void *v) new_entry->prev = q->head; new_entry->next = original_next; q->length++; + + return q->length; } -void ff_queue_push_back(FFQueue *q, void *v) +int ff_queue_push_back(FFQueue *q, void *v) { FFQueueEntry *new_entry; FFQueueEntry *original_prev; if (!q) - return; + return 0; new_entry = create_entry(v); + if (!new_entry) + return -1; original_prev = q->tail->prev; q->tail->prev = new_entry; @@ -131,6 +145,8 @@ void ff_queue_push_back(FFQueue *q, void *v) new_entry->next = q->tail; new_entry->prev = original_prev; q->length++; + + return q->length; } void *ff_queue_pop_front(FFQueue *q) diff --git a/libavfilter/dnn/queue.h b/libavfilter/dnn/queue.h index 5703cef58c..df913d91ac 100644 --- a/libavfilter/dnn/queue.h +++ b/libavfilter/dnn/queue.h @@ -32,8 +32,8 @@ size_t ff_queue_size(FFQueue *q); void *ff_queue_peek_front(FFQueue *q); void *ff_queue_peek_back(FFQueue *q); -void ff_queue_push_front(FFQueue *q, void *v); -void ff_queue_push_back(FFQueue *q, void *v); +int ff_queue_push_front(FFQueue *q, void *v); +int ff_queue_push_back(FFQueue *q, void *v); void *ff_queue_pop_front(FFQueue *q); void *ff_queue_pop_back(FFQueue *q); diff --git a/libavfilter/dnn/safe_queue.c b/libavfilter/dnn/safe_queue.c index 559b939ec9..6b55b75246 100644 --- a/libavfilter/dnn/safe_queue.c +++ b/libavfilter/dnn/safe_queue.c @@ -56,8 +56,10 @@ FFSafeQueue *ff_safe_queue_create(void) return NULL; sq->q = ff_queue_create(); - if (!sq->q) + if (!sq->q) { + av_freep(&sq); return NULL; + } ff_mutex_init(&sq->mutex, NULL); dnn_cond_init(&sq->cond, NULL); @@ -80,20 +82,24 @@ size_t ff_safe_queue_size(FFSafeQueue *sq) return sq ? ff_queue_size(sq->q) : 0; } -void ff_safe_queue_push_front(FFSafeQueue *sq, void *v) +int ff_safe_queue_push_front(FFSafeQueue *sq, void *v) { + int ret; ff_mutex_lock(&sq->mutex); - ff_queue_push_front(sq->q, v); + ret = ff_queue_push_front(sq->q, v); dnn_cond_signal(&sq->cond); ff_mutex_unlock(&sq->mutex); + return ret; } -void ff_safe_queue_push_back(FFSafeQueue *sq, void *v) +int ff_safe_queue_push_back(FFSafeQueue *sq, void *v) { + int ret; ff_mutex_lock(&sq->mutex); - ff_queue_push_back(sq->q, v); + ret = ff_queue_push_back(sq->q, v); dnn_cond_signal(&sq->cond); ff_mutex_unlock(&sq->mutex); + return ret; } void *ff_safe_queue_pop_front(FFSafeQueue *sq) diff --git a/libavfilter/dnn/safe_queue.h b/libavfilter/dnn/safe_queue.h index 85488e80ee..548a282f0c 100644 --- a/libavfilter/dnn/safe_queue.h +++ b/libavfilter/dnn/safe_queue.h @@ -28,8 +28,8 @@ void ff_safe_queue_destroy(FFSafeQueue *sq); size_t ff_safe_queue_size(FFSafeQueue *sq); -void ff_safe_queue_push_front(FFSafeQueue *sq, void *v); -void ff_safe_queue_push_back(FFSafeQueue *sq, void *v); +int ff_safe_queue_push_front(FFSafeQueue *sq, void *v); +int ff_safe_queue_push_back(FFSafeQueue *sq, void *v); void *ff_safe_queue_pop_front(FFSafeQueue *sq);