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 v3 1/3] avutil/hwcontext: add a function to get the AVHWDeviceType
@ 2022-07-03 12:57 Tong Wu
  2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format Tong Wu
  2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter Tong Wu
  0 siblings, 2 replies; 5+ messages in thread
From: Tong Wu @ 2022-07-03 12:57 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Tong Wu

Add a function to get the corresponding AVHWDeviceType from a given
hardware pixel format.

Signed-off-by: Tong Wu <tong1.wu@intel.com>
---
 libavutil/hwcontext.c | 11 +++++++++++
 libavutil/hwcontext.h | 12 ++++++++++++
 2 files changed, 23 insertions(+)

diff --git a/libavutil/hwcontext.c b/libavutil/hwcontext.c
index ab9ad3703e..4d14cb2cb4 100644
--- a/libavutil/hwcontext.c
+++ b/libavutil/hwcontext.c
@@ -80,6 +80,17 @@ static const char *const hw_type_names[] = {
     [AV_HWDEVICE_TYPE_VULKAN] = "vulkan",
 };
 
+enum AVHWDeviceType av_hwdevice_get_type_by_pix_fmt(enum AVPixelFormat fmt)
+{
+    for (int i = 0; hw_table[i]; i++) {
+        for (int j = 0; hw_table[i]->pix_fmts[j] != AV_PIX_FMT_NONE; j++) {
+            if (hw_table[i]->pix_fmts[j] == fmt)
+                return hw_table[i]->type;
+        }
+    }
+    return AV_HWDEVICE_TYPE_NONE;
+}
+
 enum AVHWDeviceType av_hwdevice_find_type_by_name(const char *name)
 {
     int type;
diff --git a/libavutil/hwcontext.h b/libavutil/hwcontext.h
index c18b7e1e8b..49f3a799ed 100644
--- a/libavutil/hwcontext.h
+++ b/libavutil/hwcontext.h
@@ -229,6 +229,18 @@ typedef struct AVHWFramesContext {
     int width, height;
 } AVHWFramesContext;
 
+/**
+ * Get the device type by a given pixel format.
+ *
+ * This function only returns a preferred device type which supports the given
+ * pixel format. There is no guarantee that the device type is unique.
+ *
+ * @param fmt Pixel format from enum AVPixelFormat.
+ * @return The type from enum AVHWDeviceType, or AV_HWDEVICE_TYPE_NONE if
+ *         not found.
+ */
+enum AVHWDeviceType av_hwdevice_get_type_by_pix_fmt(enum AVPixelFormat fmt);
+
 /**
  * Look up an AVHWDeviceType by name.
  *
-- 
2.35.1.windows.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [FFmpeg-devel] [PATCH v3 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format
  2022-07-03 12:57 [FFmpeg-devel] [PATCH v3 1/3] avutil/hwcontext: add a function to get the AVHWDeviceType Tong Wu
@ 2022-07-03 12:57 ` Tong Wu
  2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter Tong Wu
  1 sibling, 0 replies; 5+ messages in thread
From: Tong Wu @ 2022-07-03 12:57 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Tong Wu

When a derive_device_type is not specified, the hwmap filter should be
able to retrieve AVHWDeviceType from outlink->format and create
corresponding hwdevice context.

Signed-off-by: Tong Wu <tong1.wu@intel.com>
---
 libavfilter/vf_hwmap.c | 13 +++++++++++--
 1 file changed, 11 insertions(+), 2 deletions(-)

diff --git a/libavfilter/vf_hwmap.c b/libavfilter/vf_hwmap.c
index 2e03dfc1fe..328395e352 100644
--- a/libavfilter/vf_hwmap.c
+++ b/libavfilter/vf_hwmap.c
@@ -70,18 +70,27 @@ static int hwmap_config_output(AVFilterLink *outlink)
     device_is_derived = 0;
 
     if (inlink->hw_frames_ctx) {
+        enum AVHWDeviceType type;
         hwfc = (AVHWFramesContext*)inlink->hw_frames_ctx->data;
 
         if (ctx->derive_device_type) {
-            enum AVHWDeviceType type;
-
             type = av_hwdevice_find_type_by_name(ctx->derive_device_type);
             if (type == AV_HWDEVICE_TYPE_NONE) {
                 av_log(avctx, AV_LOG_ERROR, "Invalid device type.\n");
                 err = AVERROR(EINVAL);
                 goto fail;
             }
+        } else {
+            type = av_hwdevice_get_type_by_pix_fmt(outlink->format);
+            if (type == AV_HWDEVICE_TYPE_NONE) {
+                av_log(avctx, AV_LOG_ERROR, "Could not get device type from "
+                       "format %s.\n", av_get_pix_fmt_name(outlink->format));
+                err = AVERROR(EINVAL);
+                goto fail;
+            }
+        }
 
+        if (!device || ctx->derive_device_type) {
             err = av_hwdevice_ctx_create_derived(&device, type,
                                                  hwfc->device_ref, 0);
             if (err < 0) {
-- 
2.35.1.windows.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter
  2022-07-03 12:57 [FFmpeg-devel] [PATCH v3 1/3] avutil/hwcontext: add a function to get the AVHWDeviceType Tong Wu
  2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format Tong Wu
@ 2022-07-03 12:57 ` Tong Wu
  2022-07-03 13:27   ` Nicolas George
  1 sibling, 1 reply; 5+ messages in thread
From: Tong Wu @ 2022-07-03 12:57 UTC (permalink / raw)
  To: ffmpeg-devel; +Cc: Tong Wu

When two formats lists cannot be merged, a scale filter is
auto-inserted. However, when it comes to hardware map, we have to
manually add a hwmap filter to do the conversion. This patch introduces
an auto hwmap filter to do the hwmap conversion automatically and
modifies the negotiation structures, making it extensible for more auto
filters.

Signed-off-by: Tong Wu <tong1.wu@intel.com>
---
 libavfilter/avfiltergraph.c | 183 ++++++++++++++++++++++++------------
 libavfilter/formats.c       |  26 ++++-
 libavfilter/formats.h       |   9 +-
 3 files changed, 150 insertions(+), 68 deletions(-)

diff --git a/libavfilter/avfiltergraph.c b/libavfilter/avfiltergraph.c
index b7dbfc063b..0f12f2d802 100644
--- a/libavfilter/avfiltergraph.c
+++ b/libavfilter/avfiltergraph.c
@@ -393,6 +393,83 @@ static int formats_declared(AVFilterContext *f)
     return 1;
 }
 
+static int insert_auto_filter(AVFilterContext **convert, AVFilterGraph *graph,
+                              AVFilterLink *link, const AVFilterNegotiation *neg,
+                              unsigned conv_step, int *converter_count, void *log_ctx)
+{
+    int ret;
+    const AVFilter *filter;
+    AVFilterContext *ctx;
+    AVFilterLink *inlink, *outlink;
+    char inst_name[30];
+    const char *opts = neg->conversion_filters[conv_step].conversion_opts_offset == 0 ? NULL :
+                       FF_FIELD_AT(char *, neg->conversion_filters[conv_step].conversion_opts_offset, *graph);
+    const char *name = neg->conversion_filters[conv_step].conversion_filter;
+
+    if (graph->disable_auto_convert) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "The filters '%s' and '%s' do not have a common format "
+               "and automatic conversion is disabled.\n",
+               link->src->name, link->dst->name);
+        return AVERROR(EINVAL);
+    }
+
+    if (!(filter = avfilter_get_by_name(name))) {
+        av_log(log_ctx, AV_LOG_ERROR,
+               "'%s' filter not present, cannot convert formats.\n",
+               name);
+        return AVERROR(EINVAL);
+    }
+    snprintf(inst_name, sizeof(inst_name), "auto_%s_%d",
+             name, (*converter_count)++);
+    ret = avfilter_graph_create_filter(&ctx, filter, inst_name, opts, NULL, graph);
+    if (ret < 0)
+        return ret;
+
+    if ((ret = avfilter_insert_filter(link, ctx, 0, 0)) < 0)
+        return ret;
+
+    if ((ret = filter_query_formats(ctx)) < 0)
+        return ret;
+
+    inlink  = ctx->inputs[0];
+    outlink = ctx->outputs[0];
+    av_assert0( inlink->incfg.formats->refcount > 0);
+    av_assert0( inlink->outcfg.formats->refcount > 0);
+    av_assert0(outlink->incfg.formats->refcount > 0);
+    av_assert0(outlink->outcfg.formats->refcount > 0);
+    if (outlink->type == AVMEDIA_TYPE_AUDIO) {
+        av_assert0( inlink-> incfg.samplerates->refcount > 0);
+        av_assert0( inlink->outcfg.samplerates->refcount > 0);
+        av_assert0(outlink-> incfg.samplerates->refcount > 0);
+        av_assert0(outlink->outcfg.samplerates->refcount > 0);
+        av_assert0( inlink-> incfg.channel_layouts->refcount > 0);
+        av_assert0( inlink->outcfg.channel_layouts->refcount > 0);
+        av_assert0(outlink-> incfg.channel_layouts->refcount > 0);
+        av_assert0(outlink->outcfg.channel_layouts->refcount > 0);
+    }
+
+    *convert = ctx;
+    return 0;
+}
+
+static int merge_auto_filter(AVFilterContext *convert, const AVFilterNegotiation *neg)
+{
+    int neg_step, ret;
+    AVFilterLink *inlink  = convert->inputs[0];
+    AVFilterLink *outlink = convert->outputs[0];
+#define MERGE(merger, link)                                                  \
+    ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg),   \
+                     FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg)))
+    for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) {
+        const AVFilterFormatsMerger *m = &neg->mergers[neg_step];
+        if ((ret = MERGE(m,  inlink)) <= 0 ||
+            (ret = MERGE(m, outlink)) <= 0)
+                break;
+    }
+    return ret;
+}
+
 /**
  * Perform one round of query_formats() and merging formats lists on the
  * filter graph.
@@ -433,7 +510,7 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx)
         for (j = 0; j < filter->nb_inputs; j++) {
             AVFilterLink *link = filter->inputs[j];
             const AVFilterNegotiation *neg;
-            unsigned neg_step;
+            unsigned neg_step, conv_step;
             int convert_needed = 0;
 
             if (!link)
@@ -469,68 +546,50 @@ static int query_formats(AVFilterGraph *graph, void *log_ctx)
             }
 
             if (convert_needed) {
-                AVFilterContext *convert;
-                const AVFilter *filter;
-                AVFilterLink *inlink, *outlink;
-                char inst_name[30];
-                const char *opts;
-
-                if (graph->disable_auto_convert) {
-                    av_log(log_ctx, AV_LOG_ERROR,
-                           "The filters '%s' and '%s' do not have a common format "
-                           "and automatic conversion is disabled.\n",
-                           link->src->name, link->dst->name);
-                    return AVERROR(EINVAL);
-                }
-
-                /* couldn't merge format lists. auto-insert conversion filter */
-                if (!(filter = avfilter_get_by_name(neg->conversion_filter))) {
-                    av_log(log_ctx, AV_LOG_ERROR,
-                           "'%s' filter not present, cannot convert formats.\n",
-                           neg->conversion_filter);
-                    return AVERROR(EINVAL);
-                }
-                snprintf(inst_name, sizeof(inst_name), "auto_%s_%d",
-                         neg->conversion_filter, converter_count++);
-                opts = FF_FIELD_AT(char *, neg->conversion_opts_offset, *graph);
-                ret = avfilter_graph_create_filter(&convert, filter, inst_name, opts, NULL, graph);
-                if (ret < 0)
-                    return ret;
-                if ((ret = avfilter_insert_filter(link, convert, 0, 0)) < 0)
-                    return ret;
-
-                if ((ret = filter_query_formats(convert)) < 0)
-                    return ret;
+                for (conv_step = 0; conv_step < neg->nb_conversion_filters; conv_step++) {
+                    AVFilterContext *convert;
+                    ret = insert_auto_filter(&convert, graph, link, neg,
+                                             conv_step, &converter_count, log_ctx);
+                    if (ret < 0) {
+                        av_log(log_ctx, AV_LOG_ERROR, "Failed to insert an auto filter.\n");
+                        return ret;
+                    }
 
-                inlink  = convert->inputs[0];
-                outlink = convert->outputs[0];
-                av_assert0( inlink->incfg.formats->refcount > 0);
-                av_assert0( inlink->outcfg.formats->refcount > 0);
-                av_assert0(outlink->incfg.formats->refcount > 0);
-                av_assert0(outlink->outcfg.formats->refcount > 0);
-                if (outlink->type == AVMEDIA_TYPE_AUDIO) {
-                    av_assert0( inlink-> incfg.samplerates->refcount > 0);
-                    av_assert0( inlink->outcfg.samplerates->refcount > 0);
-                    av_assert0(outlink-> incfg.samplerates->refcount > 0);
-                    av_assert0(outlink->outcfg.samplerates->refcount > 0);
-                    av_assert0( inlink-> incfg.channel_layouts->refcount > 0);
-                    av_assert0( inlink->outcfg.channel_layouts->refcount > 0);
-                    av_assert0(outlink-> incfg.channel_layouts->refcount > 0);
-                    av_assert0(outlink->outcfg.channel_layouts->refcount > 0);
-                }
-#define MERGE(merger, link)                                                  \
-    ((merger)->merge(FF_FIELD_AT(void *, (merger)->offset, (link)->incfg),   \
-                     FF_FIELD_AT(void *, (merger)->offset, (link)->outcfg)))
-                for (neg_step = 0; neg_step < neg->nb_mergers; neg_step++) {
-                    const AVFilterFormatsMerger *m = &neg->mergers[neg_step];
-                    if ((ret = MERGE(m,  inlink)) <= 0 ||
-                        (ret = MERGE(m, outlink)) <= 0) {
-                        if (ret < 0)
-                            return ret;
-                        av_log(log_ctx, AV_LOG_ERROR,
-                               "Impossible to convert between the formats supported by the filter "
-                               "'%s' and the filter '%s'\n", link->src->name, link->dst->name);
-                        return AVERROR(ENOSYS);
+                    ret = merge_auto_filter(convert, neg);
+                    if (ret < 0)
+                        return ret;
+                    else if (ret > 0)
+                        break;
+                    else if (conv_step < neg->nb_conversion_filters - 1) {
+                            AVFilterLink *inlink  = convert->inputs[0];
+                            AVFilterLink *outlink = convert->outputs[0];
+                            av_log(log_ctx, AV_LOG_VERBOSE,
+                                   "Impossible to convert between the formats supported by the filter "
+                                   "'%s' and the filter '%s', try another conversion filter.\n",
+                                   link->src->name, link->dst->name);
+                            unsigned dstpad_idx = outlink->dstpad - outlink->dst->input_pads;
+                            converter_count--;
+                            /* re-hookup the link */
+                            inlink->dst                      = outlink->dst;
+                            inlink->dstpad                   = &outlink->dst->input_pads[dstpad_idx];
+                            outlink->dst->inputs[dstpad_idx] = inlink;
+                            if (outlink->outcfg.formats)
+                                ff_formats_changeref(&outlink->outcfg.formats,
+                                                 &inlink->outcfg.formats);
+                            if (outlink->outcfg.samplerates)
+                                ff_formats_changeref(&outlink->outcfg.samplerates,
+                                                    &inlink->outcfg.samplerates);
+                            if (outlink->outcfg.channel_layouts)
+                                ff_channel_layouts_changeref(&outlink->outcfg.channel_layouts,
+                                                            &inlink->outcfg.channel_layouts);
+                            /* remove the previous auto filter */
+                            convert->inputs[0]       = NULL;
+                            convert->outputs[0]->dst = NULL;
+                            avfilter_free(convert);
+                    } else {
+                            av_log(log_ctx, AV_LOG_ERROR,
+                                   "Impossible to convert between the formats supported by the filter "
+                                   "'%s' and the filter '%s'\n", link->src->name, link->dst->name);
                     }
                 }
             }
diff --git a/libavfilter/formats.c b/libavfilter/formats.c
index e8c2888c0c..fee10fa0ee 100644
--- a/libavfilter/formats.c
+++ b/libavfilter/formats.c
@@ -326,18 +326,36 @@ static const AVFilterFormatsMerger mergers_audio[] = {
     },
 };
 
+static const AVFilterFormatsFilter filters_video[] = {
+    {
+        .conversion_filter = "scale",
+        .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts),
+    },
+    {
+        .conversion_filter = "hwmap",
+        .conversion_opts_offset = 0,
+    }
+};
+
+static const AVFilterFormatsFilter filters_audio[] = {
+    {
+        .conversion_filter = "aresample",
+        .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts),
+    }
+};
+
 static const AVFilterNegotiation negotiate_video = {
     .nb_mergers = FF_ARRAY_ELEMS(mergers_video),
     .mergers = mergers_video,
-    .conversion_filter = "scale",
-    .conversion_opts_offset = offsetof(AVFilterGraph, scale_sws_opts),
+    .nb_conversion_filters = FF_ARRAY_ELEMS(filters_video),
+    .conversion_filters = filters_video,
 };
 
 static const AVFilterNegotiation negotiate_audio = {
     .nb_mergers = FF_ARRAY_ELEMS(mergers_audio),
     .mergers = mergers_audio,
-    .conversion_filter = "aresample",
-    .conversion_opts_offset = offsetof(AVFilterGraph, aresample_swr_opts),
+    .nb_conversion_filters = FF_ARRAY_ELEMS(filters_audio),
+    .conversion_filters = filters_audio,
 };
 
 const AVFilterNegotiation *ff_filter_get_negotiation(AVFilterLink *link)
diff --git a/libavfilter/formats.h b/libavfilter/formats.h
index 22224dce2d..9943fb8aa3 100644
--- a/libavfilter/formats.h
+++ b/libavfilter/formats.h
@@ -330,6 +330,11 @@ typedef struct AVFilterFormatMerger {
     int (*can_merge)(const void *a, const void *b);
 } AVFilterFormatsMerger;
 
+typedef struct AVFilterFormatFilter {
+    const char *conversion_filter;
+    unsigned conversion_opts_offset;
+} AVFilterFormatsFilter;
+
 /**
  * Callbacks and properties to describe the steps of a format negotiation.
  *
@@ -418,8 +423,8 @@ typedef struct AVFilterFormatMerger {
 typedef struct AVFilterNegotiation {
     unsigned nb_mergers;
     const AVFilterFormatsMerger *mergers;
-    const char *conversion_filter;
-    unsigned conversion_opts_offset;
+    unsigned nb_conversion_filters;
+    const AVFilterFormatsFilter *conversion_filters;
 } AVFilterNegotiation;
 
 const AVFilterNegotiation *ff_filter_get_negotiation(AVFilterLink *link);
-- 
2.35.1.windows.2

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

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter
  2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter Tong Wu
@ 2022-07-03 13:27   ` Nicolas George
  2022-07-04  1:25     ` Wu, Tong1
  0 siblings, 1 reply; 5+ messages in thread
From: Nicolas George @ 2022-07-03 13:27 UTC (permalink / raw)
  To: FFmpeg development discussions and patches; +Cc: Tong Wu


[-- Attachment #1.1: Type: text/plain, Size: 1241 bytes --]

Tong Wu (12022-07-03):
> When two formats lists cannot be merged, a scale filter is
> auto-inserted. However, when it comes to hardware map, we have to
> manually add a hwmap filter to do the conversion. This patch introduces
> an auto hwmap filter to do the hwmap conversion automatically and
> modifies the negotiation structures, making it extensible for more auto
> filters.
> 
> Signed-off-by: Tong Wu <tong1.wu@intel.com>
> ---
>  libavfilter/avfiltergraph.c | 183 ++++++++++++++++++++++++------------
>  libavfilter/formats.c       |  26 ++++-
>  libavfilter/formats.h       |   9 +-
>  3 files changed, 150 insertions(+), 68 deletions(-)

Hi, thanks for the patch. It looks a bit hard to review due to the
amount of moved code.

Can you split the patch into two: (1) moving and reindenting the code
into an auxiliary function without functional changes and (2) adding the
feature you wanted to add, please?

To do that without too much hassle, I would: first, start again from a
new branch, make the "move to a function" commit; second, take the code
with the extra feature from the other branch and let git turn it into a
commit; third, clean up that commit.

Thanks in advance.

-- 
  Nicolas George

[-- Attachment #1.2: signature.asc --]
[-- Type: application/pgp-signature, Size: 833 bytes --]

[-- Attachment #2: Type: text/plain, Size: 251 bytes --]

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

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter
  2022-07-03 13:27   ` Nicolas George
@ 2022-07-04  1:25     ` Wu, Tong1
  0 siblings, 0 replies; 5+ messages in thread
From: Wu, Tong1 @ 2022-07-04  1:25 UTC (permalink / raw)
  To: FFmpeg development discussions and patches



> -----Original Message-----
> From: ffmpeg-devel <ffmpeg-devel-bounces@ffmpeg.org> On Behalf Of
> Nicolas George
> Sent: Sunday, July 3, 2022 9:28 PM
> To: FFmpeg development discussions and patches <ffmpeg-
> devel@ffmpeg.org>
> Cc: Wu, Tong1 <tong1.wu@intel.com>
> Subject: Re: [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an
> auto hwmap filter
> 
> Tong Wu (12022-07-03):
> > When two formats lists cannot be merged, a scale filter is
> > auto-inserted. However, when it comes to hardware map, we have to
> > manually add a hwmap filter to do the conversion. This patch
> > introduces an auto hwmap filter to do the hwmap conversion
> > automatically and modifies the negotiation structures, making it
> > extensible for more auto filters.
> >
> > Signed-off-by: Tong Wu <tong1.wu@intel.com>
> > ---
> >  libavfilter/avfiltergraph.c | 183 ++++++++++++++++++++++++------------
> >  libavfilter/formats.c       |  26 ++++-
> >  libavfilter/formats.h       |   9 +-
> >  3 files changed, 150 insertions(+), 68 deletions(-)
> 
> Hi, thanks for the patch. It looks a bit hard to review due to the amount of
> moved code.
> 
> Can you split the patch into two: (1) moving and reindenting the code into an
> auxiliary function without functional changes and (2) adding the feature you
> wanted to add, please?
> 
> To do that without too much hassle, I would: first, start again from a new
> branch, make the "move to a function" commit; second, take the code with
> the extra feature from the other branch and let git turn it into a commit; third,
> clean up that commit.
> 
> Thanks in advance.
> 
> --
>   Nicolas George

Sure, will do it ASAP.

Thanks,
Tong
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2022-07-04  1:25 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-07-03 12:57 [FFmpeg-devel] [PATCH v3 1/3] avutil/hwcontext: add a function to get the AVHWDeviceType Tong Wu
2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 2/3] avfilter/vf_hwmap: get the AVHWDeviceType from outlink format Tong Wu
2022-07-03 12:57 ` [FFmpeg-devel] [PATCH v3 3/3] avfilter/avfiltergraph: add an auto hwmap filter Tong Wu
2022-07-03 13:27   ` Nicolas George
2022-07-04  1:25     ` Wu, Tong1

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