[FFmpeg-devel] [PATCH] lavfi/vf_scale_cuda: Add format option
Timo Rothenpieler
timo at rothenpieler.org
Fri May 24 19:55:07 EEST 2019
On 24.05.2019 18:27, Josh Allmann wrote:
> On Fri, 24 May 2019 at 06:00, Timo Rothenpieler <timo at rothenpieler.org> wrote:
>>
>> On 24/05/2019 01:49, Josh Allmann wrote:
>>> Makes certain usages of the lavfi API easier.
>>> ---
>>> libavfilter/vf_scale_cuda.c | 12 +++++++++++-
>>> 1 file changed, 11 insertions(+), 1 deletion(-)
>>>
>>> diff --git a/libavfilter/vf_scale_cuda.c b/libavfilter/vf_scale_cuda.c
>>> index b7cdb81081..6b1ef2bb6f 100644
>>> --- a/libavfilter/vf_scale_cuda.c
>>> +++ b/libavfilter/vf_scale_cuda.c
>>> @@ -81,6 +81,7 @@ typedef struct CUDAScaleContext {
>>>
>>> char *w_expr; ///< width expression string
>>> char *h_expr; ///< height expression string
>>> + char *format_str;
>>>
>>> CUcontext cu_ctx;
>>> CUmodule cu_module;
>>> @@ -101,7 +102,15 @@ static av_cold int cudascale_init(AVFilterContext *ctx)
>>> {
>>> CUDAScaleContext *s = ctx->priv;
>>>
>>> - s->format = AV_PIX_FMT_NONE;
>>> + if (!strcmp(s->format_str, "same")) {
>>> + s->format = AV_PIX_FMT_NONE;
>>> + } else {
>>> + s->format = av_get_pix_fmt(s->format_str);
>>> + if (s->format == AV_PIX_FMT_NONE) {
>>> + av_log(ctx, AV_LOG_ERROR, "Unrecognized pixel format: %s\n", s->format_str);
>>> + return AVERROR(EINVAL);
>>> + }
>>> + }
>>> s->frame = av_frame_alloc();
>>> if (!s->frame)
>>> return AVERROR(ENOMEM);
>>> @@ -533,6 +542,7 @@ fail:
>>> static const AVOption options[] = {
>>> { "w", "Output video width", OFFSET(w_expr), AV_OPT_TYPE_STRING, { .str = "iw" }, .flags = FLAGS },
>>> { "h", "Output video height", OFFSET(h_expr), AV_OPT_TYPE_STRING, { .str = "ih" }, .flags = FLAGS },
>>> + { "format", "Output pixel format", OFFSET(format_str), AV_OPT_TYPE_STRING, { .str = "same" }, .flags = FLAGS },
>>> { NULL },
>>> };
>>
>> I'm not sure what to think about a dummy option like this. It might be
>> very confusing for users to see a format option, which only accepts a
>> single value, "same", and effectively does nothing.
>>
>
> Not sure I understand the issue. "same" is the default (terminology
> borrowed from the scale_npp filter), and it'll assign the format to
> whatever is passed in (eg, format=yuv420p assigns that).
Oh, I misread that code as just always throwing an error if it's != "same".
Unfortunately, that option is omitted for a reason.
If you look at scalecuda_resize:
https://git.videolan.org/?p=ffmpeg.git;a=blob;f=libavfilter/vf_scale_cuda.c;h=b7cdb81081ff4a34e7b641c533fc23a5714fed61;hb=HEAD#l380
It has the assumption built into it that the output frame has the same
format as the input frame. So if you were to set format=nv12 and then
input a yuv420p frame, this will most likely crash or at least severely
misbehave.
I would not be opposed to scale_cuda gaining the ability to also change
frame pix_fmts, we are lacking such a filter at the moment if one
ignores scale_npp.
But in its current state, it can't do that.
>>
>> Not strictly against it, since I can see the convenience it adds when
>> building command lines, but I'd like some second opinions on this.
>>
>
> Actually I'm using the API, albeit with some of lavfi conveniences to
> parse filter strings. This avoids "wiring in" the output format
> manually when crossing the lavfi boundary.
>
> Here's a example that demonstrates the issue via CLI (this may
> actually be a bug elsewhere?):
>
> Broken:
> ffmpeg -loglevel verbose -hwaccel cuvid -c:v h264_cuvid -i input.ts
> -an -lavfi scale_cuda=w=426:h=240,hwdownload,format=yuv420p -c:v
> libx264 out.ts
>
> Working:
> ffmpeg -loglevel verbose -hwaccel cuvid -c:v h264_cuvid -i input.ts
> -an -lavfi scale_cuda=w=426:h=240:format=yuv420p,hwdownload,format=yuv420p
> -c:v libx264 out.ts
Is this actually working in a sense where the result looks sensible?
Cause with how the code currently is, scale_cuda with format set to
yuv420p and getting nv12 as input from h264_cuvid will produce a frame
labeled as yuv420p but containing nv12 data.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 4538 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://ffmpeg.org/pipermail/ffmpeg-devel/attachments/20190524/92a92fdd/attachment.bin>
More information about the ffmpeg-devel
mailing list