You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

199 lines
4.3KB

  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. #ifndef AVFILTER_V360_H
  21. #define AVFILTER_V360_H
  22. #include "avfilter.h"
  23. enum StereoFormats {
  24. STEREO_2D,
  25. STEREO_SBS,
  26. STEREO_TB,
  27. NB_STEREO_FMTS,
  28. };
  29. enum Projections {
  30. EQUIRECTANGULAR,
  31. CUBEMAP_3_2,
  32. CUBEMAP_6_1,
  33. EQUIANGULAR,
  34. FLAT,
  35. DUAL_FISHEYE,
  36. BARREL,
  37. CUBEMAP_1_6,
  38. STEREOGRAPHIC,
  39. MERCATOR,
  40. BALL,
  41. HAMMER,
  42. SINUSOIDAL,
  43. FISHEYE,
  44. PANNINI,
  45. CYLINDRICAL,
  46. PERSPECTIVE,
  47. TETRAHEDRON,
  48. BARREL_SPLIT,
  49. TSPYRAMID,
  50. HEQUIRECTANGULAR,
  51. EQUISOLID,
  52. ORTHOGRAPHIC,
  53. OCTAHEDRON,
  54. NB_PROJECTIONS,
  55. };
  56. enum InterpMethod {
  57. NEAREST,
  58. BILINEAR,
  59. LAGRANGE9,
  60. BICUBIC,
  61. LANCZOS,
  62. SPLINE16,
  63. GAUSSIAN,
  64. MITCHELL,
  65. NB_INTERP_METHODS,
  66. };
  67. enum Faces {
  68. TOP_LEFT,
  69. TOP_MIDDLE,
  70. TOP_RIGHT,
  71. BOTTOM_LEFT,
  72. BOTTOM_MIDDLE,
  73. BOTTOM_RIGHT,
  74. NB_FACES,
  75. };
  76. enum Direction {
  77. RIGHT, ///< Axis +X
  78. LEFT, ///< Axis -X
  79. UP, ///< Axis +Y
  80. DOWN, ///< Axis -Y
  81. FRONT, ///< Axis -Z
  82. BACK, ///< Axis +Z
  83. NB_DIRECTIONS,
  84. };
  85. enum Rotation {
  86. ROT_0,
  87. ROT_90,
  88. ROT_180,
  89. ROT_270,
  90. NB_ROTATIONS,
  91. };
  92. enum RotationOrder {
  93. YAW,
  94. PITCH,
  95. ROLL,
  96. NB_RORDERS,
  97. };
  98. typedef struct XYRemap {
  99. int16_t u[4][4];
  100. int16_t v[4][4];
  101. float ker[4][4];
  102. } XYRemap;
  103. typedef struct SliceXYRemap {
  104. int16_t *u[2], *v[2];
  105. int16_t *ker[2];
  106. uint8_t *mask;
  107. } SliceXYRemap;
  108. typedef struct V360Context {
  109. const AVClass *class;
  110. int in, out;
  111. int interp;
  112. int alpha;
  113. int width, height;
  114. char *in_forder;
  115. char *out_forder;
  116. char *in_frot;
  117. char *out_frot;
  118. char *rorder;
  119. int in_cubemap_face_order[6];
  120. int out_cubemap_direction_order[6];
  121. int in_cubemap_face_rotation[6];
  122. int out_cubemap_face_rotation[6];
  123. int rotation_order[3];
  124. int in_stereo, out_stereo;
  125. float in_pad, out_pad;
  126. int fin_pad, fout_pad;
  127. float yaw, pitch, roll;
  128. int ih_flip, iv_flip;
  129. int h_flip, v_flip, d_flip;
  130. int in_transpose, out_transpose;
  131. float h_fov, v_fov, d_fov;
  132. float ih_fov, iv_fov, id_fov;
  133. float flat_range[2];
  134. float iflat_range[2];
  135. float rot_quaternion[2][4];
  136. float output_mirror_modifier[3];
  137. int in_width, in_height;
  138. int out_width, out_height;
  139. int pr_width[4], pr_height[4];
  140. int in_offset_w[4], in_offset_h[4];
  141. int out_offset_w[4], out_offset_h[4];
  142. int planewidth[4], planeheight[4];
  143. int inplanewidth[4], inplaneheight[4];
  144. int uv_linesize[4];
  145. int nb_planes;
  146. int nb_allocated;
  147. int elements;
  148. int mask_size;
  149. int max_value;
  150. int nb_threads;
  151. SliceXYRemap *slice_remap;
  152. unsigned map[4];
  153. int (*in_transform)(const struct V360Context *s,
  154. const float *vec, int width, int height,
  155. int16_t us[4][4], int16_t vs[4][4], float *du, float *dv);
  156. int (*out_transform)(const struct V360Context *s,
  157. int i, int j, int width, int height,
  158. float *vec);
  159. void (*calculate_kernel)(float du, float dv, const XYRemap *rmap,
  160. int16_t *u, int16_t *v, int16_t *ker);
  161. int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
  162. void (*remap_line)(uint8_t *dst, int width, const uint8_t *const src, ptrdiff_t in_linesize,
  163. const int16_t *const u, const int16_t *const v, const int16_t *const ker);
  164. } V360Context;
  165. void ff_v360_init(V360Context *s, int depth);
  166. void ff_v360_init_x86(V360Context *s, int depth);
  167. #endif /* AVFILTER_V360_H */