#define AVFILTER_V360_H
#include "avfilter.h"
+enum StereoFormats {
+ STEREO_2D,
+ STEREO_SBS,
+ STEREO_TB,
+ NB_STEREO_FMTS,
+};
+
enum Projections {
EQUIRECTANGULAR,
CUBEMAP_3_2,
DUAL_FISHEYE,
BARREL,
CUBEMAP_1_6,
+ STEREOGRAPHIC,
+ MERCATOR,
+ BALL,
+ HAMMER,
+ SINUSOIDAL,
+ FISHEYE,
+ PANNINI,
+ CYLINDRICAL,
+ PERSPECTIVE,
+ TETRAHEDRON,
+ BARREL_SPLIT,
+ TSPYRAMID,
+ HEQUIRECTANGULAR,
+ EQUISOLID,
+ ORTHOGRAPHIC,
+ OCTAHEDRON,
NB_PROJECTIONS,
};
enum InterpMethod {
NEAREST,
BILINEAR,
+ LAGRANGE9,
BICUBIC,
LANCZOS,
+ SPLINE16,
+ GAUSSIAN,
+ MITCHELL,
NB_INTERP_METHODS,
};
NB_RORDERS,
};
+typedef struct XYRemap {
+ int16_t u[4][4];
+ int16_t v[4][4];
+ float ker[4][4];
+} XYRemap;
+
+typedef struct SliceXYRemap {
+ int16_t *u[2], *v[2];
+ int16_t *ker[2];
+ uint8_t *mask;
+} SliceXYRemap;
+
typedef struct V360Context {
const AVClass *class;
int in, out;
int interp;
+ int alpha;
int width, height;
char *in_forder;
char *out_forder;
int out_cubemap_face_rotation[6];
int rotation_order[3];
+ int in_stereo, out_stereo;
+
float in_pad, out_pad;
+ int fin_pad, fout_pad;
float yaw, pitch, roll;
+ int ih_flip, iv_flip;
int h_flip, v_flip, d_flip;
+ int in_transpose, out_transpose;
+
+ float h_fov, v_fov, d_fov;
+ float ih_fov, iv_fov, id_fov;
+ float flat_range[2];
+ float iflat_range[2];
+
+ float rot_quaternion[2][4];
- float h_fov, v_fov;
- float flat_range[3];
+ float output_mirror_modifier[3];
+
+ int in_width, in_height;
+ int out_width, out_height;
+
+ int pr_width[4], pr_height[4];
+
+ int in_offset_w[4], in_offset_h[4];
+ int out_offset_w[4], out_offset_h[4];
int planewidth[4], planeheight[4];
int inplanewidth[4], inplaneheight[4];
+ int uv_linesize[4];
int nb_planes;
int nb_allocated;
+ int elements;
+ int mask_size;
+ int max_value;
+ int nb_threads;
- uint16_t *u[4], *v[4];
- int16_t *ker[4];
+ SliceXYRemap *slice_remap;
unsigned map[4];
+ int (*in_transform)(const struct V360Context *s,
+ const float *vec, int width, int height,
+ int16_t us[4][4], int16_t vs[4][4], float *du, float *dv);
+
+ int (*out_transform)(const struct V360Context *s,
+ int i, int j, int width, int height,
+ float *vec);
+
+ void (*calculate_kernel)(float du, float dv, const XYRemap *rmap,
+ int16_t *u, int16_t *v, int16_t *ker);
+
int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
- void (*remap_line)(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
- const uint16_t *u, const uint16_t *v, const int16_t *ker);
+ void (*remap_line)(uint8_t *dst, int width, const uint8_t *const src, ptrdiff_t in_linesize,
+ const int16_t *const u, const int16_t *const v, const int16_t *const ker);
} V360Context;
void ff_v360_init(V360Context *s, int depth);