Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel
 help / color / mirror / Atom feed
* [FFmpeg-devel] [PATCH] avfilter/dnn: add LibTorch backend for DNN processing
@ 2026-02-04 12:56 Raja Rathour via ffmpeg-devel
  0 siblings, 0 replies; only message in thread
From: Raja Rathour via ffmpeg-devel @ 2026-02-04 12:56 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Raja Rathour

This patch implements a new LibTorch backend for the DNN filter framework in FFmpeg.

Key features:

    Support for asynchronous inference using the DNNAsyncExecModule.

    C++ exception handling for robust model loading and execution.

    NCHW tensor mapping for efficient data flow.

Note: Explicit pointer casts for av_mallocz are included as required for C++ compilation within the FFmpeg build system.

Signed-off-by: Raja Rathour <imraja729@gmail.com>
---
 Changelog                             |  2 ++
 libavfilter/dnn/dnn_backend_torch.cpp | 31 +++++++++++++--------------
 2 files changed, 17 insertions(+), 16 deletions(-)

diff --git a/Changelog b/Changelog
index a9d68b369e..56efc3036f 100644
--- a/Changelog
+++ b/Changelog
@@ -2256,3 +2256,5 @@ version 0.3.1: added avi/divx support
 
 
 version 0.3: initial public release
+
+- LibTorch backend for DNN filters
\ No newline at end of file
diff --git a/libavfilter/dnn/dnn_backend_torch.cpp b/libavfilter/dnn/dnn_backend_torch.cpp
index 33809bf983..47a3cba042 100644
--- a/libavfilter/dnn/dnn_backend_torch.cpp
+++ b/libavfilter/dnn/dnn_backend_torch.cpp
@@ -515,10 +515,13 @@ static DNNModel *dnn_load_model_th(DnnContext *ctx, DNNFunctionType func_type, A
 
     try {
         th_model->jit_model = new torch::jit::Module;
-        (*th_model->jit_model) = torch::jit::load(ctx->model_filename);
-        th_model->jit_model->to(device);
+        *th_model->jit_model = torch::jit::load(ctx->model_filename, device);
+        av_log(ctx, AV_LOG_VERBOSE, "LibTorch model loaded on device: %s\n", device_name);
     } catch (const c10::Error& e) {
-        av_log(ctx, AV_LOG_ERROR, "Failed to load torch model\n");
+        av_log(ctx, AV_LOG_ERROR, "LibTorch error loading model '%s': %s\n",
+               ctx->model_filename, e.what());
+        delete th_model->jit_model;
+        th_model->jit_model = NULL;
         goto fail;
     }
 
@@ -591,45 +594,42 @@ static int dnn_execute_model_th(const DNNModel *model, DNNExecBaseParams *exec_p
 
     ret = ff_check_exec_params(ctx, DNN_TH, model->func_type, exec_params);
     if (ret != 0) {
-        av_log(ctx, AV_LOG_ERROR, "exec parameter checking fail.\n");
+        av_log(ctx, AV_LOG_ERROR, "Exec parameter checking failed.\n");
         return ret;
     }
 
-    task = (TaskItem *)av_malloc(sizeof(TaskItem));
+    task = (TaskItem *)av_mallocz(sizeof(*task));
     if (!task) {
-        av_log(ctx, AV_LOG_ERROR, "unable to alloc memory for task item.\n");
+        av_log(ctx, AV_LOG_ERROR, "Unable to allocate memory for task item.\n");
         return AVERROR(ENOMEM);
     }
 
     ret = ff_dnn_fill_task(task, exec_params, th_model, 0, 1);
     if (ret != 0) {
         av_freep(&task);
-        av_log(ctx, AV_LOG_ERROR, "unable to fill task.\n");
+        av_log(ctx, AV_LOG_ERROR, "Unable to fill task.\n");
         return ret;
     }
 
-    ret = ff_queue_push_back(th_model->task_queue, task);
-    if (ret < 0) {
+    if (ff_queue_push_back(th_model->task_queue, task) < 0) {
         av_freep(&task);
-        av_log(ctx, AV_LOG_ERROR, "unable to push back task_queue.\n");
-        return ret;
+        av_log(ctx, AV_LOG_ERROR, "Unable to push back task_queue.\n");
+        return AVERROR(ENOMEM);
     }
 
     ret = extract_lltask_from_task(task, th_model->lltask_queue);
     if (ret != 0) {
-        av_log(ctx, AV_LOG_ERROR, "unable to extract last level task from task.\n");
         return ret;
     }
 
     request = (THRequestItem *)ff_safe_queue_pop_front(th_model->request_queue);
     if (!request) {
-        av_log(ctx, AV_LOG_ERROR, "unable to get infer request.\n");
-        return AVERROR(EINVAL);
+        av_log(ctx, AV_LOG_ERROR, "No inference request available in the queue.\n");
+        return AVERROR(EAGAIN);
     }
 
     return execute_model_th(request, th_model->lltask_queue);
 }
-
 static DNNAsyncStatusType dnn_get_result_th(const DNNModel *model, AVFrame **in, AVFrame **out)
 {
     THModel *th_model = (THModel *)model;
@@ -642,7 +642,6 @@ static int dnn_flush_th(const DNNModel *model)
     THRequestItem *request;
 
     if (ff_queue_size(th_model->lltask_queue) == 0)
-        // no pending task need to flush
         return 0;
 
     request = (THRequestItem *)ff_safe_queue_pop_front(th_model->request_queue);
-- 
2.51.0

_______________________________________________
ffmpeg-devel mailing list -- ffmpeg-devel@ffmpeg.org
To unsubscribe send an email to ffmpeg-devel-leave@ffmpeg.org

^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2026-02-04 13:01 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2026-02-04 12:56 [FFmpeg-devel] [PATCH] avfilter/dnn: add LibTorch backend for DNN processing Raja Rathour via ffmpeg-devel

Git Inbox Mirror of the ffmpeg-devel mailing list - see https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

This inbox may be cloned and mirrored by anyone:

	git clone --mirror https://master.gitmailbox.com/ffmpegdev/0 ffmpegdev/git/0.git

	# If you have public-inbox 1.1+ installed, you may
	# initialize and index your mirror using the following commands:
	public-inbox-init -V2 ffmpegdev ffmpegdev/ https://master.gitmailbox.com/ffmpegdev \
		ffmpegdev@gitmailbox.com
	public-inbox-index ffmpegdev

Example config snippet for mirrors.


AGPL code for this site: git clone https://public-inbox.org/public-inbox.git