On 28/04/17 10:00, Anton Khirnov wrote: > 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
Maybe not. I had it so that you don't need to supply two options when making just one device (i.e. "-filter_hw_device foo -vf hwupload..."), but I agree it's redundant. >> 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. Not really sure how to express that sentiment for documentation. "Note that this option is temporarily available to support a single device in filter graphs, applying to every filter. It is intended to be replaced by a more complete specification allowing multiple devices, and will be removed when that is introduced." ? _______________________________________________ libav-devel mailing list libav-devel@libav.org https://lists.libav.org/mailman/listinfo/libav-devel