diff options
author | Anton Khirnov <anton@khirnov.net> | 2023-03-15 19:09:11 +0100 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2023-03-24 10:23:52 +0100 |
commit | 3f63685c3554aea7f72bab1fdbde440820816d37 (patch) | |
tree | c99e10a11043d9c8e5af16403240ad1d7641fc28 /fftools/ffmpeg_filter.c | |
parent | 632c34993195f716e9fa575af3de80d07fd50991 (diff) | |
download | ffmpeg-3f63685c3554aea7f72bab1fdbde440820816d37.tar.gz |
fftools/ffmpeg: supply hw_device_ctx to filters before initializing them
This is more correct, but was not possible before the recently-added
filtergraph parsing API.
Also, only pass hw devices to filters that are flagged as capable of
using them.
Tested-by: Niklas Haas
Diffstat (limited to 'fftools/ffmpeg_filter.c')
-rw-r--r-- | fftools/ffmpeg_filter.c | 26 |
1 files changed, 20 insertions, 6 deletions
diff --git a/fftools/ffmpeg_filter.c b/fftools/ffmpeg_filter.c index 62d0eefa6d..4fde120067 100644 --- a/fftools/ffmpeg_filter.c +++ b/fftools/ffmpeg_filter.c @@ -440,7 +440,8 @@ static int graph_opts_apply(AVFilterGraphSegment *seg) } static int graph_parse(AVFilterGraph *graph, const char *desc, - AVFilterInOut **inputs, AVFilterInOut **outputs) + AVFilterInOut **inputs, AVFilterInOut **outputs, + AVBufferRef *hw_device) { AVFilterGraphSegment *seg; int ret; @@ -456,6 +457,20 @@ static int graph_parse(AVFilterGraph *graph, const char *desc, if (ret < 0) goto fail; + if (hw_device) { + for (int i = 0; i < graph->nb_filters; i++) { + AVFilterContext *f = graph->filters[i]; + + if (!(f->filter->flags & AVFILTER_FLAG_HWDEVICE)) + continue; + f->hw_device_ctx = av_buffer_ref(hw_device); + if (!f->hw_device_ctx) { + ret = AVERROR(ENOMEM); + goto fail; + } + } + } + ret = graph_opts_apply(seg); if (ret < 0) goto fail; @@ -480,7 +495,7 @@ int init_complex_filtergraph(FilterGraph *fg) return AVERROR(ENOMEM); graph->nb_threads = 1; - ret = graph_parse(graph, fg->graph_desc, &inputs, &outputs); + ret = graph_parse(graph, fg->graph_desc, &inputs, &outputs, NULL); if (ret < 0) goto fail; @@ -1114,6 +1129,7 @@ static int graph_is_meta(AVFilterGraph *graph) int configure_filtergraph(FilterGraph *fg) { + AVBufferRef *hw_device; AVFilterInOut *inputs, *outputs, *cur; int ret, i, simple = filtergraph_is_simple(fg); const char *graph_desc = simple ? fg->outputs[0]->ost->avfilter : @@ -1157,11 +1173,9 @@ int configure_filtergraph(FilterGraph *fg) fg->graph->nb_threads = filter_complex_nbthreads; } - if ((ret = graph_parse(fg->graph, graph_desc, &inputs, &outputs)) < 0) - goto fail; + hw_device = hw_device_for_filter(); - ret = hw_device_setup_for_filter(fg); - if (ret < 0) + if ((ret = graph_parse(fg->graph, graph_desc, &inputs, &outputs, hw_device)) < 0) goto fail; if (simple && (!inputs || inputs->next || !outputs || outputs->next)) { |