diff options
-rw-r--r-- | avconv.c | 5 | ||||
-rw-r--r-- | libavfilter/avfilter.c | 15 | ||||
-rw-r--r-- | libavfilter/avfilter.h | 2 | ||||
-rw-r--r-- | libavfilter/internal.h | 6 | ||||
-rw-r--r-- | libavfilter/vf_deinterlace_qsv.c | 2 | ||||
-rw-r--r-- | libavfilter/vf_hwdownload.c | 1 | ||||
-rw-r--r-- | libavfilter/vf_hwupload.c | 1 | ||||
-rw-r--r-- | libavfilter/vf_hwupload_cuda.c | 2 | ||||
-rw-r--r-- | libavfilter/vf_scale_npp.c | 2 | ||||
-rw-r--r-- | libavfilter/vf_scale_qsv.c | 2 | ||||
-rw-r--r-- | libavfilter/vf_scale_vaapi.c | 1 |
11 files changed, 30 insertions, 9 deletions
@@ -38,6 +38,7 @@ #include "libavutil/parseutils.h" #include "libavutil/samplefmt.h" #include "libavutil/fifo.h" +#include "libavutil/hwcontext.h" #include "libavutil/internal.h" #include "libavutil/intreadwrite.h" #include "libavutil/dict.h" @@ -2035,7 +2036,9 @@ static int init_output_stream(OutputStream *ost, char *error, int error_len) if (!av_dict_get(ost->encoder_opts, "threads", NULL, 0)) av_dict_set(&ost->encoder_opts, "threads", "auto", 0); - if (ost->filter && ost->filter->filter->inputs[0]->hw_frames_ctx) { + if (ost->filter && ost->filter->filter->inputs[0]->hw_frames_ctx && + ((AVHWFramesContext*)ost->filter->filter->inputs[0]->hw_frames_ctx->data)->format == + ost->filter->filter->inputs[0]->format) { ost->enc_ctx->hw_frames_ctx = av_buffer_ref(ost->filter->filter->inputs[0]->hw_frames_ctx); if (!ost->enc_ctx->hw_frames_ctx) return AVERROR(ENOMEM); diff --git a/libavfilter/avfilter.c b/libavfilter/avfilter.c index 1cedb15..99531e5 100644 --- a/libavfilter/avfilter.c +++ b/libavfilter/avfilter.c @@ -19,6 +19,7 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ +#include "libavutil/avassert.h" #include "libavutil/avstring.h" #include "libavutil/buffer.h" #include "libavutil/channel_layout.h" @@ -212,14 +213,12 @@ int avfilter_config_links(AVFilterContext *filter) } if (link->src->nb_inputs && link->src->inputs[0]->hw_frames_ctx && - !link->hw_frames_ctx) { - AVHWFramesContext *input_ctx = (AVHWFramesContext*)link->src->inputs[0]->hw_frames_ctx->data; - - if (input_ctx->format == link->format) { - link->hw_frames_ctx = av_buffer_ref(link->src->inputs[0]->hw_frames_ctx); - if (!link->hw_frames_ctx) - return AVERROR(ENOMEM); - } + !(link->src->filter->flags_internal & FF_FILTER_FLAG_HWFRAME_AWARE)) { + av_assert0(!link->hw_frames_ctx && + "should not be set by non-hwframe-aware filter"); + link->hw_frames_ctx = av_buffer_ref(link->src->inputs[0]->hw_frames_ctx); + if (!link->hw_frames_ctx) + return AVERROR(ENOMEM); } if ((config_link = link->dstpad->config_props)) diff --git a/libavfilter/avfilter.h b/libavfilter/avfilter.h index a17b2a2..568480d 100644 --- a/libavfilter/avfilter.h +++ b/libavfilter/avfilter.h @@ -244,6 +244,8 @@ typedef struct AVFilter { int priv_size; ///< size of private data to allocate for the filter + int flags_internal; ///< Additional flags for avfilter internal use only. + /** * Used by the filter registration system. Must not be touched by any other * code. diff --git a/libavfilter/internal.h b/libavfilter/internal.h index 202c2c0..a377f9b 100644 --- a/libavfilter/internal.h +++ b/libavfilter/internal.h @@ -220,4 +220,10 @@ AVFilterContext *ff_filter_alloc(const AVFilter *filter, const char *inst_name); */ void ff_filter_graph_remove_filter(AVFilterGraph *graph, AVFilterContext *filter); +/** + * The filter is aware of hardware frames, and any hardware frame context + * should not be automatically propagated through it. + */ +#define FF_FILTER_FLAG_HWFRAME_AWARE (1 << 0) + #endif /* AVFILTER_INTERNAL_H */ diff --git a/libavfilter/vf_deinterlace_qsv.c b/libavfilter/vf_deinterlace_qsv.c index 36eea15..5cda286 100644 --- a/libavfilter/vf_deinterlace_qsv.c +++ b/libavfilter/vf_deinterlace_qsv.c @@ -575,4 +575,6 @@ AVFilter ff_vf_deinterlace_qsv = { .inputs = qsvdeint_inputs, .outputs = qsvdeint_outputs, + + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_hwdownload.c b/libavfilter/vf_hwdownload.c index 42925b8..aee8d23 100644 --- a/libavfilter/vf_hwdownload.c +++ b/libavfilter/vf_hwdownload.c @@ -212,4 +212,5 @@ AVFilter ff_vf_hwdownload = { .priv_class = &hwdownload_class, .inputs = hwdownload_inputs, .outputs = hwdownload_outputs, + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_hwupload.c b/libavfilter/vf_hwupload.c index 8c43e00..8cca9f4 100644 --- a/libavfilter/vf_hwupload.c +++ b/libavfilter/vf_hwupload.c @@ -233,4 +233,5 @@ AVFilter ff_vf_hwupload = { .priv_class = &hwupload_class, .inputs = hwupload_inputs, .outputs = hwupload_outputs, + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_hwupload_cuda.c b/libavfilter/vf_hwupload_cuda.c index 0ab5276..94d5013 100644 --- a/libavfilter/vf_hwupload_cuda.c +++ b/libavfilter/vf_hwupload_cuda.c @@ -230,4 +230,6 @@ AVFilter ff_vf_hwupload_cuda = { .inputs = cudaupload_inputs, .outputs = cudaupload_outputs, + + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_scale_npp.c b/libavfilter/vf_scale_npp.c index 2fb4990..0e636a9 100644 --- a/libavfilter/vf_scale_npp.c +++ b/libavfilter/vf_scale_npp.c @@ -657,4 +657,6 @@ AVFilter ff_vf_scale_npp = { .inputs = nppscale_inputs, .outputs = nppscale_outputs, + + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_scale_qsv.c b/libavfilter/vf_scale_qsv.c index f7c1c55..8ef7783 100644 --- a/libavfilter/vf_scale_qsv.c +++ b/libavfilter/vf_scale_qsv.c @@ -626,4 +626,6 @@ AVFilter ff_vf_scale_qsv = { .inputs = qsvscale_inputs, .outputs = qsvscale_outputs, + + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; diff --git a/libavfilter/vf_scale_vaapi.c b/libavfilter/vf_scale_vaapi.c index 67648a9..50be68e 100644 --- a/libavfilter/vf_scale_vaapi.c +++ b/libavfilter/vf_scale_vaapi.c @@ -463,4 +463,5 @@ AVFilter ff_vf_scale_vaapi = { .inputs = scale_vaapi_inputs, .outputs = scale_vaapi_outputs, .priv_class = &scale_vaapi_class, + .flags_internal = FF_FILTER_FLAG_HWFRAME_AWARE, }; |