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