2019-09-03 18:54:44 +02:00
|
|
|
/*
|
|
|
|
* Copyright (c) 2019 Eugene Lyapustin
|
|
|
|
*
|
|
|
|
* This file is part of FFmpeg.
|
|
|
|
*
|
|
|
|
* FFmpeg is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* FFmpeg is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
|
|
* License along with FFmpeg; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
|
|
|
*/
|
|
|
|
|
|
|
|
#ifndef AVFILTER_V360_H
|
|
|
|
#define AVFILTER_V360_H
|
|
|
|
#include "avfilter.h"
|
|
|
|
|
2019-09-14 18:16:02 +02:00
|
|
|
enum StereoFormats {
|
|
|
|
STEREO_2D,
|
|
|
|
STEREO_SBS,
|
|
|
|
STEREO_TB,
|
|
|
|
NB_STEREO_FMTS,
|
|
|
|
};
|
|
|
|
|
2019-09-03 18:54:44 +02:00
|
|
|
enum Projections {
|
|
|
|
EQUIRECTANGULAR,
|
|
|
|
CUBEMAP_3_2,
|
|
|
|
CUBEMAP_6_1,
|
|
|
|
EQUIANGULAR,
|
|
|
|
FLAT,
|
|
|
|
DUAL_FISHEYE,
|
|
|
|
BARREL,
|
|
|
|
CUBEMAP_1_6,
|
2019-09-08 18:17:57 +02:00
|
|
|
STEREOGRAPHIC,
|
2019-09-17 22:15:07 +02:00
|
|
|
MERCATOR,
|
2019-09-19 18:36:19 +02:00
|
|
|
BALL,
|
2019-09-03 18:54:44 +02:00
|
|
|
NB_PROJECTIONS,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum InterpMethod {
|
|
|
|
NEAREST,
|
|
|
|
BILINEAR,
|
|
|
|
BICUBIC,
|
|
|
|
LANCZOS,
|
|
|
|
NB_INTERP_METHODS,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Faces {
|
|
|
|
TOP_LEFT,
|
|
|
|
TOP_MIDDLE,
|
|
|
|
TOP_RIGHT,
|
|
|
|
BOTTOM_LEFT,
|
|
|
|
BOTTOM_MIDDLE,
|
|
|
|
BOTTOM_RIGHT,
|
|
|
|
NB_FACES,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Direction {
|
|
|
|
RIGHT, ///< Axis +X
|
|
|
|
LEFT, ///< Axis -X
|
|
|
|
UP, ///< Axis +Y
|
|
|
|
DOWN, ///< Axis -Y
|
|
|
|
FRONT, ///< Axis -Z
|
|
|
|
BACK, ///< Axis +Z
|
|
|
|
NB_DIRECTIONS,
|
|
|
|
};
|
|
|
|
|
|
|
|
enum Rotation {
|
|
|
|
ROT_0,
|
|
|
|
ROT_90,
|
|
|
|
ROT_180,
|
|
|
|
ROT_270,
|
|
|
|
NB_ROTATIONS,
|
|
|
|
};
|
|
|
|
|
2019-09-06 13:14:29 +02:00
|
|
|
enum RotationOrder {
|
|
|
|
YAW,
|
|
|
|
PITCH,
|
|
|
|
ROLL,
|
|
|
|
NB_RORDERS,
|
|
|
|
};
|
|
|
|
|
2019-09-16 18:16:57 +02:00
|
|
|
typedef struct XYRemap {
|
|
|
|
uint16_t u[4][4];
|
|
|
|
uint16_t v[4][4];
|
|
|
|
float ker[4][4];
|
|
|
|
} XYRemap;
|
|
|
|
|
2019-09-03 18:54:44 +02:00
|
|
|
typedef struct V360Context {
|
|
|
|
const AVClass *class;
|
|
|
|
int in, out;
|
|
|
|
int interp;
|
|
|
|
int width, height;
|
2019-09-06 13:14:29 +02:00
|
|
|
char *in_forder;
|
|
|
|
char *out_forder;
|
|
|
|
char *in_frot;
|
|
|
|
char *out_frot;
|
|
|
|
char *rorder;
|
2019-09-03 18:54:44 +02:00
|
|
|
|
|
|
|
int in_cubemap_face_order[6];
|
|
|
|
int out_cubemap_direction_order[6];
|
|
|
|
int in_cubemap_face_rotation[6];
|
|
|
|
int out_cubemap_face_rotation[6];
|
2019-09-06 13:14:29 +02:00
|
|
|
int rotation_order[3];
|
2019-09-03 18:54:44 +02:00
|
|
|
|
2019-09-14 18:16:02 +02:00
|
|
|
int in_stereo, out_stereo;
|
|
|
|
|
2019-09-03 18:54:44 +02:00
|
|
|
float in_pad, out_pad;
|
|
|
|
|
|
|
|
float yaw, pitch, roll;
|
|
|
|
|
2019-09-07 19:54:00 +02:00
|
|
|
int ih_flip, iv_flip;
|
2019-09-03 18:54:44 +02:00
|
|
|
int h_flip, v_flip, d_flip;
|
2019-09-07 16:32:16 +02:00
|
|
|
int in_transpose, out_transpose;
|
2019-09-03 18:54:44 +02:00
|
|
|
|
2019-09-14 10:47:01 +02:00
|
|
|
float h_fov, v_fov, d_fov;
|
2019-09-03 18:54:44 +02:00
|
|
|
float flat_range[3];
|
|
|
|
|
2019-09-16 17:53:58 +02:00
|
|
|
float rot_mat[3][3];
|
|
|
|
|
2019-09-07 19:54:00 +02:00
|
|
|
float input_mirror_modifier[2];
|
2019-09-16 17:53:58 +02:00
|
|
|
float output_mirror_modifier[3];
|
2019-09-07 19:54:00 +02:00
|
|
|
|
2019-09-14 18:16:02 +02:00
|
|
|
int pr_width[4], pr_height[4];
|
|
|
|
|
|
|
|
int in_offset_w[4], in_offset_h[4];
|
|
|
|
int out_offset_w[4], out_offset_h[4];
|
|
|
|
|
2019-09-03 18:54:44 +02:00
|
|
|
int planewidth[4], planeheight[4];
|
|
|
|
int inplanewidth[4], inplaneheight[4];
|
2019-09-09 18:36:56 +02:00
|
|
|
int uv_linesize[4];
|
2019-09-03 18:54:44 +02:00
|
|
|
int nb_planes;
|
2019-09-06 11:46:11 +02:00
|
|
|
int nb_allocated;
|
2019-09-16 18:16:57 +02:00
|
|
|
int elements;
|
2019-09-03 18:54:44 +02:00
|
|
|
|
|
|
|
uint16_t *u[4], *v[4];
|
|
|
|
int16_t *ker[4];
|
2019-09-06 11:46:11 +02:00
|
|
|
unsigned map[4];
|
2019-09-03 18:54:44 +02:00
|
|
|
|
2019-09-16 18:16:57 +02:00
|
|
|
void (*in_transform)(const struct V360Context *s,
|
|
|
|
const float *vec, int width, int height,
|
|
|
|
uint16_t us[4][4], uint16_t vs[4][4], float *du, float *dv);
|
|
|
|
|
|
|
|
void (*out_transform)(const struct V360Context *s,
|
|
|
|
int i, int j, int width, int height,
|
|
|
|
float *vec);
|
|
|
|
|
|
|
|
void (*calculate_kernel)(float du, float dv, const XYRemap *rmap,
|
|
|
|
uint16_t *u, uint16_t *v, int16_t *ker);
|
|
|
|
|
2019-09-03 18:54:44 +02:00
|
|
|
int (*remap_slice)(AVFilterContext *ctx, void *arg, int jobnr, int nb_jobs);
|
|
|
|
|
|
|
|
void (*remap_line)(uint8_t *dst, int width, const uint8_t *src, ptrdiff_t in_linesize,
|
|
|
|
const uint16_t *u, const uint16_t *v, const int16_t *ker);
|
|
|
|
} V360Context;
|
|
|
|
|
|
|
|
void ff_v360_init(V360Context *s, int depth);
|
|
|
|
void ff_v360_init_x86(V360Context *s, int depth);
|
|
|
|
|
|
|
|
#endif /* AVFILTER_V360_H */
|