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