2018-06-05 17:20 GMT+03:00 James Almer <jamr...@gmail.com>:

> On 6/3/2018 3:02 PM, Sergey Lavrushkin wrote:
> > diff --git a/libavfilter/vf_srcnn.c b/libavfilter/vf_srcnn.c
> > index d6efe9b478..5c5e26b33a 100644
> > --- a/libavfilter/vf_srcnn.c
> > +++ b/libavfilter/vf_srcnn.c
> > @@ -41,7 +41,6 @@ typedef struct SRCNNContext {
> >      DNNData input_output;
> >  } SRCNNContext;
> >
> > -
> >  #define OFFSET(x) offsetof(SRCNNContext, x)
> >  #define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
> >  static const AVOption srcnn_options[] = {
> > @@ -55,10 +54,19 @@ static av_cold int init(AVFilterContext* context)
> >  {
> >      SRCNNContext* srcnn_context = context->priv;
> >
> > -    srcnn_context->dnn_module = ff_get_dnn_module(DNN_NATIVE);
> > +    srcnn_context->dnn_module = ff_get_dnn_module(DNN_TF);
>
> This should be a filter AVOption, not hardcoded to one or another. What
> if i, for whatever reason, want to use the native backend when i have
> libtensorflow enabled?
>
> >      if (!srcnn_context->dnn_module){
> > -        av_log(context, AV_LOG_ERROR, "could not create dnn module\n");
> > -        return AVERROR(ENOMEM);
> > +        srcnn_context->dnn_module = ff_get_dnn_module(DNN_NATIVE);
> > +        if (!srcnn_context->dnn_module){
> > +            av_log(context, AV_LOG_ERROR, "could not create dnn
> module\n");
> > +            return AVERROR(ENOMEM);
> > +        }
> > +        else{
> > +            av_log(context, AV_LOG_INFO, "using native backend for DNN
> inference\n");
>
> VERBOSE, not INFO
>
> > +        }
> > +    }
> > +    else{
> > +        av_log(context, AV_LOG_INFO, "using tensorflow backend for DNN
> inference\n");
>
> Ditto.
>
> >      }
> >      if (!srcnn_context->model_filename){
> >          av_log(context, AV_LOG_INFO, "model file for network was not
> specified, using default network for x2 upsampling\n");


Here is the patch, that fixes described issues.
From 971e15b4b1e3f2747aa07d0221f99226cba622ac Mon Sep 17 00:00:00 2001
From: Sergey Lavrushkin <dual...@gmail.com>
Date: Wed, 6 Jun 2018 01:44:40 +0300
Subject: [PATCH] libavfilter/vf_srcnn.c: adds DNN module backend AVOption,
 changes AV_LOG_INFO message to AV_LOG_VERBOSE.

---
 libavfilter/vf_srcnn.c | 23 +++++++++--------------
 1 file changed, 9 insertions(+), 14 deletions(-)

diff --git a/libavfilter/vf_srcnn.c b/libavfilter/vf_srcnn.c
index 5c5e26b33a..17e380503e 100644
--- a/libavfilter/vf_srcnn.c
+++ b/libavfilter/vf_srcnn.c
@@ -36,6 +36,7 @@ typedef struct SRCNNContext {
 
     char* model_filename;
     float* input_output_buf;
+    DNNBackendType backend_type;
     DNNModule* dnn_module;
     DNNModel* model;
     DNNData input_output;
@@ -44,6 +45,9 @@ typedef struct SRCNNContext {
 #define OFFSET(x) offsetof(SRCNNContext, x)
 #define FLAGS AV_OPT_FLAG_FILTERING_PARAM | AV_OPT_FLAG_VIDEO_PARAM
 static const AVOption srcnn_options[] = {
+    { "dnn_backend", "DNN backend used for model execution", OFFSET(backend_type), AV_OPT_TYPE_FLAGS, { .i64 = 0 }, 0, 1, FLAGS, "backend" },
+    { "native", "native backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 0 }, 0, 0, FLAGS, "backend" },
+    { "tensorflow", "tensorflow backend flag", 0, AV_OPT_TYPE_CONST, { .i64 = 1 }, 0, 0, FLAGS, "backend" },
     { "model_filename", "path to model file specifying network architecture and its parameters", OFFSET(model_filename), AV_OPT_TYPE_STRING, {.str=NULL}, 0, 0, FLAGS },
     { NULL }
 };
@@ -54,29 +58,20 @@ static av_cold int init(AVFilterContext* context)
 {
     SRCNNContext* srcnn_context = context->priv;
 
-    srcnn_context->dnn_module = ff_get_dnn_module(DNN_TF);
+    srcnn_context->dnn_module = ff_get_dnn_module(srcnn_context->backend_type);
     if (!srcnn_context->dnn_module){
-        srcnn_context->dnn_module = ff_get_dnn_module(DNN_NATIVE);
-        if (!srcnn_context->dnn_module){
-            av_log(context, AV_LOG_ERROR, "could not create dnn module\n");
-            return AVERROR(ENOMEM);
-        }
-        else{
-            av_log(context, AV_LOG_INFO, "using native backend for DNN inference\n");
-        }
-    }
-    else{
-        av_log(context, AV_LOG_INFO, "using tensorflow backend for DNN inference\n");
+        av_log(context, AV_LOG_ERROR, "could not create DNN module for requested backend\n");
+        return AVERROR(ENOMEM);
     }
     if (!srcnn_context->model_filename){
-        av_log(context, AV_LOG_INFO, "model file for network was not specified, using default network for x2 upsampling\n");
+        av_log(context, AV_LOG_VERBOSE, "model file for network was not specified, using default network for x2 upsampling\n");
         srcnn_context->model = (srcnn_context->dnn_module->load_default_model)(DNN_SRCNN);
     }
     else{
         srcnn_context->model = (srcnn_context->dnn_module->load_model)(srcnn_context->model_filename);
     }
     if (!srcnn_context->model){
-        av_log(context, AV_LOG_ERROR, "could not load dnn model\n");
+        av_log(context, AV_LOG_ERROR, "could not load DNN model\n");
         return AVERROR(EIO);
     }
 
-- 
2.14.1

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to