Unified · Split
| @@ -3922,7 +3922,7 @@ static inline void rotate(const float rot_quaternion[2][4], · 3921 unmodified lines | |||
| 3922 | { | 3922 | { |
| 3923 | float qv[4], temp[4], rqv[4]; | 3923 | float qv[4], temp[4], rqv[4]; |
| 3924 | 3924 | ||
| 3925 | qv[0] = 0; | 3925 | qv[0] = 0.f; |
| 3926 | qv[1] = vec[0]; | 3926 | qv[1] = vec[0]; |
| 3927 | qv[2] = vec[1]; | 3927 | qv[2] = vec[1]; |
| 3928 | qv[3] = vec[2]; | 3928 | qv[3] = vec[2]; |
| @@ -4670,13 +4670,8 @@ static int config_output(AVFilterLink *outlink) · 741 unmodified lines | |||
| 4670 | return err; | 4670 | return err; |
| 4671 | } | 4671 | } |
| 4672 | 4672 | ||
| 4673 | s->rot_quaternion[0][0] = 1.f; | 4673 | calculate_rotation(s->yaw, s->pitch, s->roll, |
| 4674 | s->rot_quaternion[0][1] = s->rot_quaternion[0][2] = s->rot_quaternion[0][3] = 0.f; | 4674 | s->rot_quaternion, s->rotation_order); |
| 4675 | |||
| 4676 | for (int i = 0; i < 4; i++) { | ||
| 4677 | calculate_rotation(s->yaw * 0.25f, s->pitch * 0.25f, s->roll * 0.25f, | ||
| 4678 | s->rot_quaternion, s->rotation_order); | ||
| 4679 | } | ||
| 4680 | 4675 | ||
| 4681 | set_mirror_modifier(s->h_flip, s->v_flip, s->d_flip, s->output_mirror_modifier); | 4676 | set_mirror_modifier(s->h_flip, s->v_flip, s->d_flip, s->output_mirror_modifier); |
| 4682 | 4677 | ||
| @@ -4712,8 +4707,11 @@ static int filter_frame(AVFilterLink *inlink, AVFrame *in) · 29 unmodified lines | |||
| 4712 | static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, | 4707 | static int process_command(AVFilterContext *ctx, const char *cmd, const char *args, |
| 4713 | char *res, int res_len, int flags) | 4708 | char *res, int res_len, int flags) |
| 4714 | { | 4709 | { |
| 4710 | V360Context *s = ctx->priv; | ||
| 4715 | int ret; | 4711 | int ret; |
| 4716 | 4712 | ||
| 4713 | s->yaw = s->pitch = s->roll = 0.f; | ||
| 4714 | |||
| 4717 | ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags); | 4715 | ret = ff_filter_process_command(ctx, cmd, args, res, res_len, flags); |
| 4718 | if (ret < 0) | 4716 | if (ret < 0) |
| 4719 | return ret; | 4717 | return ret; |
| @@ -4721,6 +4719,16 @@ static int process_command(AVFilterContext *ctx, const char *cmd, const char *ar · 1 unmodified line | |||
| 4721 | return config_output(ctx->outputs[0]); | 4719 | return config_output(ctx->outputs[0]); |
| 4722 | } | 4720 | } |
| 4723 | 4721 | ||
| 4722 | static av_cold int init(AVFilterContext *ctx) | ||
| 4723 | { | ||
| 4724 | V360Context *s = ctx->priv; | ||
| 4725 | |||
| 4726 | s->rot_quaternion[0][0] = 1.f; | ||
| 4727 | s->rot_quaternion[0][1] = s->rot_quaternion[0][2] = s->rot_quaternion[0][3] = 0.f; | ||
| 4728 | |||
| 4729 | return 0; | ||
| 4730 | } | ||
| 4731 | |||
| 4724 | static av_cold void uninit(AVFilterContext *ctx) | 4732 | static av_cold void uninit(AVFilterContext *ctx) |
| 4725 | { | 4733 | { |
| 4726 | V360Context *s = ctx->priv; | 4734 | V360Context *s = ctx->priv; |
| @@ -4762,6 +4770,7 @@ AVFilter ff_vf_v360 = { · 35 unmodified lines | |||
| 4762 | .name = "v360", | 4770 | .name = "v360", |
| 4763 | .description = NULL_IF_CONFIG_SMALL("Convert 360 projection of video."), | 4771 | .description = NULL_IF_CONFIG_SMALL("Convert 360 projection of video."), |
| 4764 | .priv_size = sizeof(V360Context), | 4772 | .priv_size = sizeof(V360Context), |
| 4773 | .init = init, | ||
| 4765 | .uninit = uninit, | 4774 | .uninit = uninit, |
| 4766 | .query_formats = query_formats, | 4775 | .query_formats = query_formats, |
| 4767 | .inputs = inputs, | 4776 | .inputs = inputs, |