Quoting Mark Thompson (2017-04-23 21:21:02)
> This only supports one device globally, but more can be used by
> passing them with input streams in hw_frames_ctx or by deriving new
> devices inside a filter graph with hwmap.
> ---
> Added doc.
>
>
> avtools/avconv.h | 1 +
> avtools/avconv_filter.c | 10 ++++++++--
> avtools/avconv_opt.c | 21 +++++++++++++++++++++
> doc/avconv.texi | 11 +++++++++++
> 4 files changed, 41 insertions(+), 2 deletions(-)
>
> diff --git a/avtools/avconv.h b/avtools/avconv.h
> index 9415b208b..3354c5044 100644
> --- a/avtools/avconv.h
> +++ b/avtools/avconv.h
> @@ -489,6 +489,7 @@ extern const OptionDef options[];
> extern const HWAccel hwaccels[];
> extern int hwaccel_lax_profile_check;
> extern AVBufferRef *hw_device_ctx;
> +extern HWDevice *filter_hw_device;
>
> void reset_options(OptionsContext *o);
> void show_usage(void);
> diff --git a/avtools/avconv_filter.c b/avtools/avconv_filter.c
> index e53dcd271..884478da2 100644
> --- a/avtools/avconv_filter.c
> +++ b/avtools/avconv_filter.c
> @@ -711,9 +711,15 @@ int configure_filtergraph(FilterGraph *fg)
> if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs,
> &outputs)) < 0)
> goto fail;
>
> - if (hw_device_ctx) {
> + if (filter_hw_device || hw_device_ctx) {
> + AVBufferRef *device = filter_hw_device ? filter_hw_device->device_ref
> + : hw_device_ctx;
> for (i = 0; i < fg->graph->nb_filters; i++) {
> - fg->graph->filters[i]->hw_device_ctx =
> av_buffer_ref(hw_device_ctx);
> + fg->graph->filters[i]->hw_device_ctx = av_buffer_ref(device);
> + if (!fg->graph->filters[i]->hw_device_ctx) {
> + ret = AVERROR(ENOMEM);
> + goto fail;
> + }
> }
> }
>
> diff --git a/avtools/avconv_opt.c b/avtools/avconv_opt.c
> index e970c8e46..cdc980870 100644
> --- a/avtools/avconv_opt.c
> +++ b/avtools/avconv_opt.c
> @@ -80,6 +80,7 @@ const HWAccel hwaccels[] = {
> };
> int hwaccel_lax_profile_check = 0;
> AVBufferRef *hw_device_ctx;
> +HWDevice *filter_hw_device;
>
> char *vstats_filename;
>
> @@ -369,6 +370,24 @@ static int opt_init_hw_device(void *optctx, const char
> *opt, const char *arg)
> }
> }
>
> +static int opt_filter_hw_device(void *optctx, const char *opt, const char
> *arg)
> +{
> + int err;
> + if (filter_hw_device) {
> + av_log(NULL, AV_LOG_ERROR, "Only one filter device can be used.\n");
> + return AVERROR(EINVAL);
> + }
> + filter_hw_device = hw_device_get_by_name(arg);
> + if (!filter_hw_device) {
> + err = hw_device_init_from_string(arg, &filter_hw_device);
Do we really want this fallback? Seems to me this might cause more
confusion since now stuff depends on the ordering of -filter_hw_device
and -init_hw_device
> diff --git a/doc/avconv.texi b/doc/avconv.texi
> index 7bcb78797..2837e30f3 100644
> --- a/doc/avconv.texi
> +++ b/doc/avconv.texi
> @@ -644,6 +644,17 @@ deriving it from the existing device with the name
> @var{source}.
> @item -init_hw_device list
> List all hardware device types supported in this build of avconv.
>
> +@item -filter_hw_device @var{name}
> +Pass the hardware device called @var{name} to all filters in any filter
> graph.
> +This can be used to set the device to upload to with the @code{hwupload}
> filter,
> +or the device to map to with the @code{hwmap} filter. Other filters may also
> +make use of this parameter when they require a hardware device. Note that
> this
> +is typically only required when the input is not already in hardware frames -
> +when it is, filters will derive the device they require from the context of
> the
> +frames they receive as input.
> +
> +This is a global setting, so all filters will receive the same device.
> +
Maybe mention that this is a (hopefully) temporary thing and people
shouldn't rely on this option in scripts and such.
--
Anton Khirnov
_______________________________________________
libav-devel mailing list
[email protected]
https://lists.libav.org/mailman/listinfo/libav-devel