blob: 74a34473bba7407632a58a35e64fa571ea36fe6d
1 | /* |
2 | * Copyright (c) 2003 Michael Niedermayer <michaelni@gmx.at> |
3 | * Copyright (C) 2005 Nikolaj Poroshin <porosh3@psu.ru> |
4 | * Copyright (c) 2014 Arwa Arif <arwaarif1994@gmail.com> |
5 | * |
6 | * This file is part of FFmpeg. |
7 | * |
8 | * FFmpeg is free software; you can redistribute it and/or modify |
9 | * it under the terms of the GNU General Public License as published by |
10 | * the Free Software Foundation; either version 2 of the License, or |
11 | * (at your option) any later version. |
12 | * |
13 | * FFmpeg is distributed in the hope that it will be useful, |
14 | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
16 | * GNU General Public License for more details. |
17 | * |
18 | * You should have received a copy of the GNU General Public License along |
19 | * with FFmpeg; if not, write to the Free Software Foundation, Inc., |
20 | * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. |
21 | */ |
22 | |
23 | #ifndef AVFILTER_FSPP_H |
24 | #define AVFILTER_FSPP_H |
25 | |
26 | #include "avfilter.h" |
27 | |
28 | #define BLOCKSZ 12 |
29 | #define MAX_LEVEL 5 |
30 | |
31 | #define DCTSIZE 8 |
32 | #define DCTSIZE_S "8" |
33 | |
34 | #define FIX(x,s) ((int) ((x) * (1 << s) + 0.5) & 0xffff) |
35 | #define C64(x) ((uint64_t)((x) | (x) << 16)) <<32 | (uint64_t)(x) | (uint64_t)(x) << 16 |
36 | #define FIX64(x,s) C64(FIX(x,s)) |
37 | |
38 | #define MULTIPLY16H(x,k) (((x) * (k)) >> 16) |
39 | #define THRESHOLD(r,x,t) \ |
40 | if(((unsigned)((x) + t)) > t * 2) r = (x); \ |
41 | else r = 0; |
42 | #define DESCALE(x,n) (((x) + (1 << ((n) - 1))) >> n) |
43 | |
44 | typedef int32_t int_simd16_t; |
45 | static const int16_t FIX_0_382683433 = FIX(0.382683433, 14); |
46 | static const int16_t FIX_0_541196100 = FIX(0.541196100, 14); |
47 | static const int16_t FIX_0_707106781 = FIX(M_SQRT1_2 , 14); |
48 | static const int16_t FIX_1_306562965 = FIX(1.306562965, 14); |
49 | static const int16_t FIX_1_414213562_A = FIX(M_SQRT2 , 14); |
50 | static const int16_t FIX_1_847759065 = FIX(1.847759065, 13); |
51 | static const int16_t FIX_2_613125930 = FIX(-2.613125930, 13); |
52 | static const int16_t FIX_1_414213562 = FIX(M_SQRT2 , 13); |
53 | static const int16_t FIX_1_082392200 = FIX(1.082392200, 13); |
54 | |
55 | typedef struct FSPPContext { |
56 | AVClass *class; |
57 | uint64_t threshold_mtx_noq[8 * 2]; |
58 | uint64_t threshold_mtx[8 * 2]; //used in both C & MMX (& later SSE2) versions |
59 | |
60 | int log2_count; |
61 | int strength; |
62 | int hsub; |
63 | int vsub; |
64 | int temp_stride; |
65 | int qp; |
66 | int qscale_type; |
67 | int prev_q; |
68 | uint8_t *src; |
69 | int16_t *temp; |
70 | uint8_t *non_b_qp_table; |
71 | int non_b_qp_alloc_size; |
72 | int use_bframe_qp; |
73 | |
74 | void (*store_slice)(uint8_t *dst, int16_t *src, |
75 | ptrdiff_t dst_stride, ptrdiff_t src_stride, |
76 | ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale); |
77 | |
78 | void (*store_slice2)(uint8_t *dst, int16_t *src, |
79 | ptrdiff_t dst_stride, ptrdiff_t src_stride, |
80 | ptrdiff_t width, ptrdiff_t height, ptrdiff_t log2_scale); |
81 | |
82 | void (*mul_thrmat)(int16_t *thr_adr_noq, int16_t *thr_adr, int q); |
83 | |
84 | void (*column_fidct)(int16_t *thr_adr, int16_t *data, |
85 | int16_t *output, int cnt); |
86 | |
87 | void (*row_idct)(int16_t *workspace, int16_t *output_adr, |
88 | ptrdiff_t output_stride, int cnt); |
89 | |
90 | void (*row_fdct)(int16_t *data, const uint8_t *pixels, |
91 | ptrdiff_t line_size, int cnt); |
92 | |
93 | } FSPPContext; |
94 | |
95 | void ff_fspp_init_x86(FSPPContext *fspp); |
96 | |
97 | #endif /* AVFILTER_FSPP_H */ |
98 |