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.tags/n4.0
| @@ -489,6 +489,7 @@ extern const OptionDef options[]; | |||||
| extern const HWAccel hwaccels[]; | extern const HWAccel hwaccels[]; | ||||
| extern int hwaccel_lax_profile_check; | extern int hwaccel_lax_profile_check; | ||||
| extern AVBufferRef *hw_device_ctx; | extern AVBufferRef *hw_device_ctx; | ||||
| extern HWDevice *filter_hw_device; | |||||
| void reset_options(OptionsContext *o); | void reset_options(OptionsContext *o); | ||||
| void show_usage(void); | void show_usage(void); | ||||
| @@ -711,9 +711,15 @@ int configure_filtergraph(FilterGraph *fg) | |||||
| if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0) | if ((ret = avfilter_graph_parse2(fg->graph, graph_desc, &inputs, &outputs)) < 0) | ||||
| goto fail; | 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++) { | 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; | |||||
| } | |||||
| } | } | ||||
| } | } | ||||
| @@ -80,6 +80,7 @@ const HWAccel hwaccels[] = { | |||||
| }; | }; | ||||
| int hwaccel_lax_profile_check = 0; | int hwaccel_lax_profile_check = 0; | ||||
| AVBufferRef *hw_device_ctx; | AVBufferRef *hw_device_ctx; | ||||
| HWDevice *filter_hw_device; | |||||
| char *vstats_filename; | char *vstats_filename; | ||||
| @@ -369,6 +370,20 @@ 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) | |||||
| { | |||||
| 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) { | |||||
| av_log(NULL, AV_LOG_ERROR, "Invalid filter device %s.\n", arg); | |||||
| return AVERROR(EINVAL); | |||||
| } | |||||
| return 0; | |||||
| } | |||||
| /** | /** | ||||
| * Parse a metadata specifier passed as 'arg' parameter. | * Parse a metadata specifier passed as 'arg' parameter. | ||||
| * @param arg metadata string to parse | * @param arg metadata string to parse | ||||
| @@ -2775,6 +2790,8 @@ const OptionDef options[] = { | |||||
| { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device }, | { "init_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_init_hw_device }, | ||||
| "initialise hardware device", "args" }, | "initialise hardware device", "args" }, | ||||
| { "filter_hw_device", HAS_ARG | OPT_EXPERT, { .func_arg = opt_filter_hw_device }, | |||||
| "set hardware device used when filtering", "device" }, | |||||
| { NULL, }, | { NULL, }, | ||||
| }; | }; | ||||
| @@ -644,6 +644,20 @@ deriving it from the existing device with the name @var{source}. | |||||
| @item -init_hw_device list | @item -init_hw_device list | ||||
| List all hardware device types supported in this build of avconv. | 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. | |||||
| Do not use this option in scripts that should remain functional in future | |||||
| avconv versions. | |||||
| @item -hwaccel[:@var{stream_specifier}] @var{hwaccel} (@emph{input,per-stream}) | @item -hwaccel[:@var{stream_specifier}] @var{hwaccel} (@emph{input,per-stream}) | ||||
| Use hardware acceleration to decode the matching stream(s). The allowed values | Use hardware acceleration to decode the matching stream(s). The allowed values | ||||
| of @var{hwaccel} are: | of @var{hwaccel} are: | ||||