mirror of
https://github.com/xenia-project/FFmpeg.git
synced 2024-11-23 11:39:49 +00:00
a086b73e1f
Fixes gimbal lock issues, and round-off errors.
199 lines
4.3 KiB
C
199 lines
4.3 KiB
C
/*
|
|
* Copyright (c) 2019 Eugene Lyapustin
|
|
*
|
|
* This file is part of FFmpeg.
|
|
*
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
*/
|
|
|
|
#ifndef AVFILTER_V360_H
|
|
#define AVFILTER_V360_H
|
|
#include "avfilter.h"
|
|
|
|
enum StereoFormats {
|
|
STEREO_2D,
|
|
STEREO_SBS,
|
|
STEREO_TB,
|
|
NB_STEREO_FMTS,
|
|
};
|
|
|
|
enum Projections {
|
|
EQUIRECTANGULAR,
|
|
CUBEMAP_3_2,
|
|
CUBEMAP_6_1,
|
|
EQUIANGULAR,
|
|
FLAT,
|
|
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,
|
|
};
|
|
|
|
enum Faces {
|
|
TOP_LEFT,
|
|
TOP_MIDDLE,
|
|
TOP_RIGHT,
|
|
BOTTOM_LEFT,
|
|
BOTTOM_MIDDLE,
|
|
BOTTOM_RIGHT,
|
|
NB_FACES,
|
|
};
|
|
|
|
enum Direction {
|
|
RIGHT, ///< Axis +X
|
|
LEFT, ///< Axis -X
|
|
UP, ///< Axis +Y
|
|
DOWN, ///< Axis -Y
|
|
FRONT, ///< Axis -Z
|
|
BACK, ///< Axis +Z
|
|
NB_DIRECTIONS,
|
|
};
|
|
|
|
enum Rotation {
|
|
ROT_0,
|
|
ROT_90,
|
|
ROT_180,
|
|
ROT_270,
|
|
NB_ROTATIONS,
|
|
};
|
|
|
|
enum RotationOrder {
|
|
YAW,
|
|
PITCH,
|
|
ROLL,
|
|
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;
|
|
char *in_frot;
|
|
char *out_frot;
|
|
char *rorder;
|
|
|
|
int in_cubemap_face_order[6];
|
|
int out_cubemap_direction_order[6];
|
|
int in_cubemap_face_rotation[6];
|
|
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 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;
|
|
|
|
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 *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);
|
|
void ff_v360_init_x86(V360Context *s, int depth);
|
|
|
|
#endif /* AVFILTER_V360_H */
|