Andreas Rheinhardt (12020-08-21):
> If adding the list of input formats to its AVFilterLink fails, the list
> of output formats (which has not been attached to permanent storage yet)
> leaks. This has been fixed by not creating the lists of in- and output
> formats simultaneously. Instead creating said lists is relegated to
> ff_formats_pixdesc_filter() (this also avoids the reallocations implicit
> in using ff_add_format()) and the second list is only created after (and
> if) the first list has been permanently attached to ist AVFilterLink.
> 
> Signed-off-by: Andreas Rheinhardt <andreas.rheinha...@gmail.com>
> ---
> ff_formats_pixdesc_filter() uses av_pix_fmt_desc_get() under the hood;
> but both av_pix_fmt_desc_get() and av_pix_fmt_desc_next() lead
> (currently) to the same order of pixel formats (it coincides with the
> natural order) and given that this filter doesn't seem to have any
> preferred order at all, it wouldn't even matter if these two methods
> yielded different results one day.

The order of formats should not matter, the API does not mean them to
matter.

> 
>  libavfilter/vf_hwdownload.c | 23 +++++------------------
>  1 file changed, 5 insertions(+), 18 deletions(-)
> 
> diff --git a/libavfilter/vf_hwdownload.c b/libavfilter/vf_hwdownload.c
> index 33af30cf40..faf2ea8c0e 100644
> --- a/libavfilter/vf_hwdownload.c
> +++ b/libavfilter/vf_hwdownload.c
> @@ -37,26 +37,13 @@ typedef struct HWDownloadContext {
>  
>  static int hwdownload_query_formats(AVFilterContext *avctx)
>  {
> -    AVFilterFormats  *infmts = NULL;
> -    AVFilterFormats *outfmts = NULL;
> -    const AVPixFmtDescriptor *desc;
> +    AVFilterFormats *fmts;
>      int err;
>  
> -    for (desc = av_pix_fmt_desc_next(NULL); desc;
> -         desc = av_pix_fmt_desc_next(desc)) {
> -        if (desc->flags & AV_PIX_FMT_FLAG_HWACCEL)
> -            err = ff_add_format(&infmts,  av_pix_fmt_desc_get_id(desc));
> -        else
> -            err = ff_add_format(&outfmts, av_pix_fmt_desc_get_id(desc));
> -        if (err) {
> -            ff_formats_unref(&infmts);
> -            ff_formats_unref(&outfmts);
> -            return err;
> -        }
> -    }
> -
> -    if ((err = ff_formats_ref(infmts,  &avctx->inputs[0]->out_formats)) < 0 
> ||
> -        (err = ff_formats_ref(outfmts, &avctx->outputs[0]->in_formats)) < 0)
> +    if ((err = ff_formats_pixdesc_filter(&fmts, AV_PIX_FMT_FLAG_HWACCEL, 0)) 
> ||
> +        (err = ff_formats_ref(fmts, &avctx->inputs[0]->out_formats))         
> ||
> +        (err = ff_formats_pixdesc_filter(&fmts, 0, AV_PIX_FMT_FLAG_HWACCEL)) 
> ||
> +        (err = ff_formats_ref(fmts, &avctx->outputs[0]->in_formats)))
>          return err;
>  
>      return 0;

It looks ok, but I do not maintain this code.

Regards,

-- 
  Nicolas George

Attachment: signature.asc
Description: PGP signature

_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
https://ffmpeg.org/mailman/listinfo/ffmpeg-devel

To unsubscribe, visit link above, or email
ffmpeg-devel-requ...@ffmpeg.org with subject "unsubscribe".

Reply via email to