2 * Copyright (c) 2015-2016 Kieran Kunhya <kieran@kunhya.com>
4 * This file is part of FFmpeg.
6 * FFmpeg is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * FFmpeg is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with FFmpeg; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
21 #include "libavutil/attributes.h"
22 #include "libavutil/common.h"
26 static av_always_inline
void filter(int16_t *output
, ptrdiff_t out_stride
,
27 const int16_t *low
, ptrdiff_t low_stride
,
28 const int16_t *high
, ptrdiff_t high_stride
,
34 tmp
= (11*low
[0*low_stride
] - 4*low
[1*low_stride
] + low
[2*low_stride
] + 4) >> 3;
35 output
[(2*0+0)*out_stride
] = (tmp
+ high
[0*high_stride
]) >> 1;
37 output
[(2*0+0)*out_stride
] = av_clip_uintp2_c(output
[(2*0+0)*out_stride
], clip
);
39 tmp
= ( 5*low
[0*low_stride
] + 4*low
[1*low_stride
] - low
[2*low_stride
] + 4) >> 3;
40 output
[(2*0+1)*out_stride
] = (tmp
- high
[0*high_stride
]) >> 1;
42 output
[(2*0+1)*out_stride
] = av_clip_uintp2_c(output
[(2*0+1)*out_stride
], clip
);
44 for (i
= 1; i
< len
- 1; i
++) {
45 tmp
= (low
[(i
-1)*low_stride
] - low
[(i
+1)*low_stride
] + 4) >> 3;
46 output
[(2*i
+0)*out_stride
] = (tmp
+ low
[i
*low_stride
] + high
[i
*high_stride
]) >> 1;
48 output
[(2*i
+0)*out_stride
] = av_clip_uintp2_c(output
[(2*i
+0)*out_stride
], clip
);
50 tmp
= (low
[(i
+1)*low_stride
] - low
[(i
-1)*low_stride
] + 4) >> 3;
51 output
[(2*i
+1)*out_stride
] = (tmp
+ low
[i
*low_stride
] - high
[i
*high_stride
]) >> 1;
53 output
[(2*i
+1)*out_stride
] = av_clip_uintp2_c(output
[(2*i
+1)*out_stride
], clip
);
56 tmp
= ( 5*low
[i
*low_stride
] + 4*low
[(i
-1)*low_stride
] - low
[(i
-2)*low_stride
] + 4) >> 3;
57 output
[(2*i
+0)*out_stride
] = (tmp
+ high
[i
*high_stride
]) >> 1;
59 output
[(2*i
+0)*out_stride
] = av_clip_uintp2_c(output
[(2*i
+0)*out_stride
], clip
);
61 tmp
= (11*low
[i
*low_stride
] - 4*low
[(i
-1)*low_stride
] + low
[(i
-2)*low_stride
] + 4) >> 3;
62 output
[(2*i
+1)*out_stride
] = (tmp
- high
[i
*high_stride
]) >> 1;
64 output
[(2*i
+1)*out_stride
] = av_clip_uintp2_c(output
[(2*i
+1)*out_stride
], clip
);
67 static void vert_filter(int16_t *output
, ptrdiff_t out_stride
,
68 const int16_t *low
, ptrdiff_t low_stride
,
69 const int16_t *high
, ptrdiff_t high_stride
,
70 int width
, int height
)
72 for (int i
= 0; i
< width
; i
++) {
73 filter(output
, out_stride
, low
, low_stride
, high
, high_stride
, height
, 0);
80 static void horiz_filter(int16_t *output
, ptrdiff_t ostride
,
81 const int16_t *low
, ptrdiff_t lstride
,
82 const int16_t *high
, ptrdiff_t hstride
,
83 int width
, int height
)
85 for (int i
= 0; i
< height
; i
++) {
86 filter(output
, 1, low
, 1, high
, 1, width
, 0);
89 output
+= ostride
* 2;
93 static void horiz_filter_clip(int16_t *output
, const int16_t *low
, const int16_t *high
,
96 filter(output
, 1, low
, 1, high
, 1, width
, clip
);
99 static void horiz_filter_clip_bayer(int16_t *output
, const int16_t *low
, const int16_t *high
,
102 filter(output
, 2, low
, 1, high
, 1, width
, clip
);
105 av_cold
void ff_cfhddsp_init(CFHDDSPContext
*c
, int depth
, int bayer
)
107 c
->horiz_filter
= horiz_filter
;
108 c
->vert_filter
= vert_filter
;
111 c
->horiz_filter_clip
= horiz_filter_clip_bayer
;
113 c
->horiz_filter_clip
= horiz_filter_clip
;
116 ff_cfhddsp_init_x86(c
, depth
, bayer
);