[FFmpeg-devel] [PATCH v2 1/3] avfilter: add v360 filter
Thilo Borgmann
thilo.borgmann at mail.de
Wed Aug 14 12:56:24 EEST 2019
[...]
>>> +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.
Thilo
More information about the ffmpeg-devel
mailing list