diff options
author | Vittorio Giovara <vittorio.giovara@gmail.com> | 2014-05-15 22:06:49 -0400 |
---|---|---|
committer | Anton Khirnov <anton@khirnov.net> | 2014-05-19 13:13:10 +0200 |
commit | bddd8cbf68551f6405b2bf77cc3e212af9fbe834 (patch) | |
tree | e4055879d665ee6dfd982d6ca2a3b203d92a5c9c /libavutil/display.c | |
parent | 9929b3564c0dca42ed7baa6798ef15b6f0013c83 (diff) | |
download | ffmpeg-bddd8cbf68551f6405b2bf77cc3e212af9fbe834.tar.gz |
Add transformation matrix API.
Add AV_PKT_DATA_DISPLAYMATRIX and AV_FRAME_DATA_DISPLAYMATRIX as stream and
frame side data (respectively) to describe a display transformation matrix
for linear transformation operations on the decoded video.
Add functions to easily extract a rotation angle from a matrix and
conversely to setup a matrix for a given rotation angle.
Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavutil/display.c')
-rw-r--r-- | libavutil/display.c | 64 |
1 files changed, 64 insertions, 0 deletions
diff --git a/libavutil/display.c b/libavutil/display.c new file mode 100644 index 0000000000..ae6c1c2474 --- /dev/null +++ b/libavutil/display.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2014 Vittorio Giovara <vittorio.giovara@gmail.com> + * + * This file is part of Libav. + * + * Libav 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. + * + * Libav 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 Libav; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + */ + +#include <stdint.h> +#include <string.h> +#include <math.h> + +#include "display.h" + +// fixed point to double +#define CONV_FP(x) ((double) (x)) / (1 << 16) + +// double to fixed point +#define CONV_DB(x) (int32_t) ((x) * (1 << 16)) + +double av_display_rotation_get(const int32_t matrix[9]) +{ + double rotation, scale[2]; + + scale[0] = sqrt(CONV_FP(matrix[0]) * CONV_FP(matrix[0]) + + CONV_FP(matrix[3]) * CONV_FP(matrix[3])); + scale[1] = sqrt(CONV_FP(matrix[1]) * CONV_FP(matrix[1]) + + CONV_FP(matrix[4]) * CONV_FP(matrix[4])); + + if (scale[0] == 0.0 || scale[1] == 0.0) + return NAN; + + rotation = atan2(CONV_FP(matrix[1]) / scale[1], + CONV_FP(matrix[0]) / scale[0]) * 180 / M_PI; + + return rotation; +} + +void av_display_rotation_set(int32_t matrix[9], double angle) +{ + double radians = angle * M_PI / 180.0f; + double c = cos(radians); + double s = sin(radians); + + memset(matrix, 0, 9 * sizeof(int32_t)); + + matrix[0] = CONV_DB(c); + matrix[1] = CONV_DB(-s); + matrix[3] = CONV_DB(s); + matrix[4] = CONV_DB(c); + matrix[8] = 1 << 30; +} |