1 /* 2 * Copyright (c) 2019 Eugene Lyapustin 3 * 4 * This file is part of FFmpeg. 5 * 6 * FFmpeg is free software; you can redistribute it and/or 7 * modify it under the terms of the GNU Lesser General Public 8 * License as published by the Free Software Foundation; either 9 * version 2.1 of the License, or (at your option) any later version. 10 * 11 * FFmpeg is distributed in the hope that it will be useful, 12 * but WITHOUT ANY WARRANTY; without even the implied warranty of 13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14 * Lesser General Public License for more details. 15 * 16 * You should have received a copy of the GNU Lesser General Public 17 * License along with FFmpeg; if not, write to the Free Software 18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 19 */ 20 21 #ifndef AVFILTER_V360_H 22 #define AVFILTER_V360_H 23 #include "avfilter.h" 24 25 enum StereoFormats { 26 STEREO_2D, 27 STEREO_SBS, 28 STEREO_TB, 29 NB_STEREO_FMTS, 30 }; 31 32 enum Projections { 33 EQUIRECTANGULAR, 34 CUBEMAP_3_2, 35 CUBEMAP_6_1, 36 EQUIANGULAR, 37 FLAT, 38 DUAL_FISHEYE, 39 BARREL, 40 CUBEMAP_1_6, 41 STEREOGRAPHIC, 42 MERCATOR, 43 BALL, 44 HAMMER, 45 SINUSOIDAL, 46 FISHEYE, 47 PANNINI, 48 CYLINDRICAL, 49 PERSPECTIVE, 50 TETRAHEDRON, 51 BARREL_SPLIT, 52 TSPYRAMID, 53 HEQUIRECTANGULAR, 54 EQUISOLID, 55 ORTHOGRAPHIC, 56 OCTAHEDRON, 57 CYLINDRICALEA, 58 NB_PROJECTIONS, 59 }; 60 61 enum InterpMethod { 62 NEAREST, 63 BILINEAR, 64 LAGRANGE9, 65 BICUBIC, 66 LANCZOS, 67 SPLINE16, 68 GAUSSIAN, 69 MITCHELL, 70 NB_INTERP_METHODS, 71 }; 72 73 enum Faces { 74 TOP_LEFT, 75 TOP_MIDDLE, 76 TOP_RIGHT, 77 BOTTOM_LEFT, 78 BOTTOM_MIDDLE, 79 BOTTOM_RIGHT, 80 NB_FACES, 81 }; 82 83 enum Direction { 84 RIGHT, ///< Axis +X 85 LEFT, ///< Axis -X 86 UP, ///< Axis +Y 87 DOWN, ///< Axis -Y 88 FRONT, ///< Axis -Z 89 BACK, ///< Axis +Z 90 NB_DIRECTIONS, 91 }; 92 93 enum Rotation { 94 ROT_0, 95 ROT_90, 96 ROT_180, 97 ROT_270, 98 NB_ROTATIONS, 99 }; 100 101 enum RotationOrder { 102 YAW, 103 PITCH, 104 ROLL, 105 NB_RORDERS, 106 }; 107 108 typedef struct XYRemap { 109 int16_t u[4][4]; 110 int16_t v[4][4]; 111 float ker[4][4]; 112 } XYRemap; 113 114 typedef struct SliceXYRemap { 115 int16_t *u[2], *v[2]; 116 int16_t *ker[2]; 117 uint8_t *mask; 118 } SliceXYRemap; 119 120 typedef struct V360Context { 121 const AVClass *class; 122 int in, out; 123 int interp; 124 int alpha; 125 int reset_rot; 126 int width, height; 127 char *in_forder; 128 char *out_forder; 129 char *in_frot; 130 char *out_frot; 131 char *rorder; 132 133 int in_cubemap_face_order[6]; 134 int out_cubemap_direction_order[6]; 135 int in_cubemap_face_rotation[6]; 136 int out_cubemap_face_rotation[6]; 137 int rotation_order[3]; 138 139 int in_stereo, out_stereo; 140 141 float in_pad, out_pad; 142 int fin_pad, fout_pad; 143 144 float yaw, pitch, roll; 145 float h_offset, v_offset; 146 147 int ih_flip, iv_flip; 148 int h_flip, v_flip, d_flip; 149 int in_transpose, out_transpose; 150 151 float h_fov, v_fov, d_fov; 152 float ih_fov, iv_fov, id_fov; 153 float flat_range[2]; 154 float iflat_range[2]; 155 156 float rot_quaternion[2][4]; 157 158 float output_mirror_modifier[3]; 159 160 int in_width, in_height; 161 int out_width, out_height; 162 163 int pr_width[4], pr_height[4]; 164 165 int in_offset_w[4], in_offset_h[4]; 166 int out_offset_w[4], out_offset_h[4]; 167 168 int planewidth[4], planeheight[4]; 169 int inplanewidth[4], inplaneheight[4]; 170 int uv_linesize[4]; 171 int nb_planes; 172 int nb_allocated; 173 int elements; 174 int mask_size; 175 int max_value; 176 int nb_threads; 177 178 SliceXYRemap *slice_remap; 179 unsigned map[4]; 180 181 int (*in_transform)(const struct V360Context *s, 182 const float *vec, int width, int height, 183 int16_t us[4][4], int16_t vs[4][4], float *du, float *dv); 184 185 int (*out_transform)(const struct V360Context *s, 186 int i, int j, int width, int height, 187 float *vec); 188 189 void (*calculate_kernel)(float du, float dv, const XYRemap *rmap, 190 int16_t *u, int16_t *v, int16_t *ker); 191 192 int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); 193 194 void (*remap_line)(uint8_t *dst, int width, const uint8_t *const src, ptrdiff_t in_linesize, 195 const int16_t *const u, const int16_t *const v, const int16_t *const ker); 196 } V360Context; 197 198 void ff_v360_init(V360Context *s, int depth); 199 void ff_v360_init_x86(V360Context *s, int depth); 200 201 #endif /* AVFILTER_V360_H */ 202