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 NB_PROJECTIONS, 58 }; 59 60 enum InterpMethod { 61 NEAREST, 62 BILINEAR, 63 LAGRANGE9, 64 BICUBIC, 65 LANCZOS, 66 SPLINE16, 67 GAUSSIAN, 68 MITCHELL, 69 NB_INTERP_METHODS, 70 }; 71 72 enum Faces { 73 TOP_LEFT, 74 TOP_MIDDLE, 75 TOP_RIGHT, 76 BOTTOM_LEFT, 77 BOTTOM_MIDDLE, 78 BOTTOM_RIGHT, 79 NB_FACES, 80 }; 81 82 enum Direction { 83 RIGHT, ///< Axis +X 84 LEFT, ///< Axis -X 85 UP, ///< Axis +Y 86 DOWN, ///< Axis -Y 87 FRONT, ///< Axis -Z 88 BACK, ///< Axis +Z 89 NB_DIRECTIONS, 90 }; 91 92 enum Rotation { 93 ROT_0, 94 ROT_90, 95 ROT_180, 96 ROT_270, 97 NB_ROTATIONS, 98 }; 99 100 enum RotationOrder { 101 YAW, 102 PITCH, 103 ROLL, 104 NB_RORDERS, 105 }; 106 107 typedef struct XYRemap { 108 int16_t u[4][4]; 109 int16_t v[4][4]; 110 float ker[4][4]; 111 } XYRemap; 112 113 typedef struct SliceXYRemap { 114 int16_t *u[2], *v[2]; 115 int16_t *ker[2]; 116 uint8_t *mask; 117 } SliceXYRemap; 118 119 typedef struct V360Context { 120 const AVClass *class; 121 int in, out; 122 int interp; 123 int alpha; 124 int width, height; 125 char *in_forder; 126 char *out_forder; 127 char *in_frot; 128 char *out_frot; 129 char *rorder; 130 131 int in_cubemap_face_order[6]; 132 int out_cubemap_direction_order[6]; 133 int in_cubemap_face_rotation[6]; 134 int out_cubemap_face_rotation[6]; 135 int rotation_order[3]; 136 137 int in_stereo, out_stereo; 138 139 float in_pad, out_pad; 140 int fin_pad, fout_pad; 141 142 float yaw, pitch, roll; 143 144 int ih_flip, iv_flip; 145 int h_flip, v_flip, d_flip; 146 int in_transpose, out_transpose; 147 148 float h_fov, v_fov, d_fov; 149 float ih_fov, iv_fov, id_fov; 150 float flat_range[2]; 151 float iflat_range[2]; 152 153 float rot_quaternion[2][4]; 154 155 float output_mirror_modifier[3]; 156 157 int in_width, in_height; 158 int out_width, out_height; 159 160 int pr_width[4], pr_height[4]; 161 162 int in_offset_w[4], in_offset_h[4]; 163 int out_offset_w[4], out_offset_h[4]; 164 165 int planewidth[4], planeheight[4]; 166 int inplanewidth[4], inplaneheight[4]; 167 int uv_linesize[4]; 168 int nb_planes; 169 int nb_allocated; 170 int elements; 171 int mask_size; 172 int max_value; 173 int nb_threads; 174 175 SliceXYRemap *slice_remap; 176 unsigned map[4]; 177 178 int (*in_transform)(const struct V360Context *s, 179 const float *vec, int width, int height, 180 int16_t us[4][4], int16_t vs[4][4], float *du, float *dv); 181 182 int (*out_transform)(const struct V360Context *s, 183 int i, int j, int width, int height, 184 float *vec); 185 186 void (*calculate_kernel)(float du, float dv, const XYRemap *rmap, 187 int16_t *u, int16_t *v, int16_t *ker); 188 189 int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs); 190 191 void (*remap_line)(uint8_t *dst, int width, const uint8_t *const src, ptrdiff_t in_linesize, 192 const int16_t *const u, const int16_t *const v, const int16_t *const ker); 193 } V360Context; 194 195 void ff_v360_init(V360Context *s, int depth); 196 void ff_v360_init_x86(V360Context *s, int depth); 197 198 #endif /* AVFILTER_V360_H */ 199