[FFmpeg-devel] [PATCH v2 1/3] avfilter: add v360 filter

Li, Zhong zhong.li at intel.com
Wed Aug 14 17:32:24 EEST 2019


> From: ffmpeg-devel [mailto:ffmpeg-devel-bounces at ffmpeg.org] On Behalf
> Of Thilo Borgmann
> Sent: Wednesday, August 14, 2019 10:06 PM
> To: ffmpeg-devel at ffmpeg.org
> Subject: Re: [FFmpeg-devel] [PATCH v2 1/3] avfilter: add v360 filter
> 
> Am 14.08.19 um 15:14 schrieb Eugene:
> > On 14.08.2019 13:06, Paul B Mahol wrote:
> >
> >> On Wed, Aug 14, 2019 at 11:56 AM Thilo Borgmann
> >> <thilo.borgmann at mail.de>
> >> wrote:
> >>
> >>> [...]
> >>>
> >>>>>> +static int config_output(AVFilterLink *outlink) {
> >>>>>> +    AVFilterContext *ctx = outlink->src;
> >>>>>> +    AVFilterLink *inlink = ctx->inputs[0];
> >>>>>> +    V360Context *s = ctx->priv;
> >>>>>> +    const AVPixFmtDescriptor *desc =
> >>>>>> av_pix_fmt_desc_get(inlink->format);
> >>>>>> +    const int depth = desc->comp[0].depth;
> >>>>>> +    float remap_data_size = 0.f;
> >>>>>> +    int sizeof_remap;
> >>>>>> +    int err;
> >>>>>> +    int p, h, w;
> >>>>>> +    float hf, wf;
> >>>>>> +    float mirror_modifier[3];
> >>>>>> +    void (*in_transform)(const V360Context *s,
> >>>>>> +                         const float *vec, int width, int
> >>>>>> +height,
> >>>>>> +                         uint16_t us[4][4], uint16_t
> vs[4][4],
> >>>>>> +float
> >>>>>> *du, float *dv);
> >>>>>> +    void (*out_transform)(const V360Context *s,
> >>>>>> +                          int i, int j, int width, int
> height,
> >>>>>> +                          float *vec);
> >>>>>> +    void (*calculate_kernel)(float du, float dv, int shift,
> >>>>>> +const
> >>>>> XYRemap4
> >>>>>> *r_tmp, void *r);
> >>>>>> +    float rot_mat[3][3];
> >>>>>> +
> >>>>>> +    switch (s->interp) {
> >>>>>> +    case NEAREST:
> >>>>>> +        calculate_kernel = nearest_kernel;
> >>>>>> +        s->remap_slice = depth <= 8 ? remap1_8bit_slice :
> >>>>>> remap1_16bit_slice;
> >>>>>> +        sizeof_remap = sizeof(XYRemap1);
> >>>>>> +        break;
> >>>>>> +    case BILINEAR:
> >>>>>> +        calculate_kernel = bilinear_kernel;
> >>>>>> +        s->remap_slice = depth <= 8 ? remap2_8bit_slice :
> >>>>>> remap2_16bit_slice;
> >>>>>> +        sizeof_remap = sizeof(XYRemap2);
> >>>>>> +        break;
> >>>>>> +    case BICUBIC:
> >>>>>> +        calculate_kernel = bicubic_kernel;
> >>>>>> +        s->remap_slice = depth <= 8 ? remap4_8bit_slice :
> >>>>>> remap4_16bit_slice;
> >>>>>> +        sizeof_remap = sizeof(XYRemap4);
> >>>>>> +        break;
> >>>>>> +    case LANCZOS:
> >>>>>> +        calculate_kernel = lanczos_kernel;
> >>>>>> +        s->remap_slice = depth <= 8 ? remap4_8bit_slice :
> >>>>>> remap4_16bit_slice;
> >>>>>> +        sizeof_remap = sizeof(XYRemap4);
> >>>>>> +        break;
> >>>>>> +    }
> >>>>>> +
> >>>>>> +    switch (s->in) {
> >>>>>> +    case EQUIRECTANGULAR:
> >>>>>> +        in_transform = xyz_to_equirect;
> >>>>>> +        err = 0;
> >>>>>> +        wf = inlink->w;
> >>>>>> +        hf = inlink->h;
> >>>>>> +        break;
> >>>>>> +    case CUBEMAP_3_2:
> >>>>>> +        in_transform = xyz_to_cube3x2;
> >>>>>> +        err = prepare_cube_in(ctx);
> >>>>>> +        wf = inlink->w / 3.f * 4.f;
> >>>>>> +        hf = inlink->h;
> >>>>>> +        break;
> >>>>>> +    case CUBEMAP_6_1:
> >>>>>> +        in_transform = xyz_to_cube6x1;
> >>>>>> +        err = prepare_cube_in(ctx);
> >>>>>> +        wf = inlink->w / 3.f * 2.f;
> >>>>>> +        hf = inlink->h * 2.f;
> >>>>>> +        break;
> >>>>>> +    case EQUIANGULAR:
> >>>>>> +        in_transform = xyz_to_eac;
> >>>>>> +        err = prepare_eac_in(ctx);
> >>>>>> +        wf = inlink->w;
> >>>>>> +        hf = inlink->h / 9.f * 8.f;
> >>>>>> +        break;
> >>>>>> +    case FLAT:
> >>>>>> +        av_log(ctx, AV_LOG_ERROR, "Flat format is not
> accepted
> >>>>>> +as
> >>>>>> input.\n");
> >>>>>> +        return AVERROR(EINVAL);
> >>>>>> +    }
> >>>>>> +
> >>>>>> +    if (err != 0) {
> >>>>>> +        return err;
> >>>>>> +    }
> >>>>>> +
> >>>>>> +    switch (s->out) {
> >>>>>> +    case EQUIRECTANGULAR:
> >>>>>> +        out_transform = equirect_to_xyz;
> >>>>>> +        err = 0;
> >>>>>> +        w = roundf(wf);
> >>>>>> +        h = roundf(hf);
> >>>>>> +        break;
> >>>>>> +    case CUBEMAP_3_2:
> >>>>>> +        out_transform = cube3x2_to_xyz;
> >>>>>> +        err = prepare_cube_out(ctx);
> >>>>>> +        w = roundf(wf / 4.f * 3.f);
> >>>>>> +        h = roundf(hf);
> >>>>>> +        break;
> >>>>>> +    case CUBEMAP_6_1:
> >>>>>> +        out_transform = cube6x1_to_xyz;
> >>>>>> +        err = prepare_cube_out(ctx);
> >>>>>> +        w = roundf(wf / 2.f * 3.f);
> >>>>>> +        h = roundf(hf / 2.f);
> >>>>>> +        break;
> >>>>>> +    case EQUIANGULAR:
> >>>>>> +        out_transform = eac_to_xyz;
> >>>>>> +        err = prepare_eac_out(ctx);
> >>>>>> +        w = roundf(wf);
> >>>>>> +        h = roundf(hf / 8.f * 9.f);
> >>>>>> +        break;
> >>>>>> +    case FLAT:
> >>>>>> +        out_transform = flat_to_xyz;
> >>>>>> +        err = prepare_flat_out(ctx);
> >>>>>> +        w = roundf(wf * s->flat_range[0] / s->flat_range[1] /
> >>>>>> +2.f);
> >>>>>> +        h = roundf(hf);
> >>>>>> +        break;
> >>>>>> +    }
> >>>>>> +
> >>>>>> +    if (err != 0) {
> >>>>>> +        return err;
> >>>>>> +    }
> >>>>>> +
> >>>>>> +    if (s->width > 0 && s->height > 0) {
> >>>>>> +        w = s->width;
> >>>>>> +        h = s->height;
> >>>>>> +    }
> >>>>> If s->width/height are checked, should handle the case of no ture,
> >>>>> Else w/h may be used but not initialized.
> >>>>>
> >>>> Please try more hard to write english. I do not understand what is
> >>>> typed above.
> >>> If w and h don't have initial values at declaration. So they might
> >>> never get set if that last if statement evaluates to false.
> >>>
> >>> So he suggests to add an else case like
> >>>
> >>> if (s->width > 0 && s->height > 0) {
> >>>   w = s->width;
> >>>   h = s->height;
> >>> } else {
> >>>   w = 0;
> >>>   h = 0;
> >>> }
> >>>
> >>> or whatever values might make sense.
> >>>
> >> else case should have assert or return AVERROR_BUG.
> >
> > This "if" branch overrides default values with user values. Default values
> are calculated just above this code based on input/output formats.
> > So w and h do get initialized in any case.
> 
> Hmm... what happens if (s->out != any case you have in the switch) and
> (s->width < 1 || s->height < 1)
> 
> Maybe I misread, actually I just clarified what Li Zhong said.
> 
> -Thilo

Yes, this is exactly what I mean.


More information about the ffmpeg-devel mailing list