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