On 14.08.2019 13:06, Paul B Mahol wrote:

On Wed, Aug 14, 2019 at 11:56 AM Thilo Borgmann <thilo.borgm...@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.



Thilo


_______________________________________________
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".
_______________________________________________
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".
_______________________________________________
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