diff options
author | Michael Niedermayer <michaelni@gmx.at> | 2014-05-19 19:12:30 +0200 |
---|---|---|
committer | Michael Niedermayer <michaelni@gmx.at> | 2014-05-19 19:12:30 +0200 |
commit | ef1d4ee2f8b621a009d482d5b183a905bcb1cd74 (patch) | |
tree | 88d5e961383f04d5c1e521242dc2e0ceb7eedd1b /libavutil/display.c | |
parent | af72f62d7b2ab00d6f69c0838f662beb566862d8 (diff) | |
parent | bddd8cbf68551f6405b2bf77cc3e212af9fbe834 (diff) | |
download | ffmpeg-ef1d4ee2f8b621a009d482d5b183a905bcb1cd74.tar.gz |
Merge commit 'bddd8cbf68551f6405b2bf77cc3e212af9fbe834'
* commit 'bddd8cbf68551f6405b2bf77cc3e212af9fbe834':
Add transformation matrix API.
Conflicts:
libavcodec/avcodec.h
libavcodec/utils.c
libavutil/version.h
Merged-by: Michael Niedermayer <michaelni@gmx.at>
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..ff3aa18deb --- /dev/null +++ b/libavutil/display.c @@ -0,0 +1,64 @@ +/* + * Copyright (c) 2014 Vittorio Giovara <vittorio.giovara@gmail.com> + * + * 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 + */ + +#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; +} |