Re: [FFmpeg-devel] [PATCH] avfilter/vf_w3fdif: add >8 but <16 bit support

2016-12-01 Thread Paul B Mahol
On 9/11/16, Paul B Mahol  wrote:
> Signed-off-by: Paul B Mahol 
> ---
>  libavfilter/vf_w3fdif.c  | 134
> ---
>  libavfilter/w3fdif.h |   5 +-
>  libavfilter/x86/vf_w3fdif_init.c |   9 +--
>  3 files changed, 133 insertions(+), 15 deletions(-)
>

ping
___
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel


[FFmpeg-devel] [PATCH] avfilter/vf_w3fdif: add >8 but <16 bit support

2016-09-11 Thread Paul B Mahol
Signed-off-by: Paul B Mahol 
---
 libavfilter/vf_w3fdif.c  | 134 ---
 libavfilter/w3fdif.h |   5 +-
 libavfilter/x86/vf_w3fdif_init.c |   9 +--
 3 files changed, 133 insertions(+), 15 deletions(-)

diff --git a/libavfilter/vf_w3fdif.c b/libavfilter/vf_w3fdif.c
index cde17d2..8b8a2f4 100644
--- a/libavfilter/vf_w3fdif.c
+++ b/libavfilter/vf_w3fdif.c
@@ -43,6 +43,7 @@ typedef struct W3FDIFContext {
 AVFrame *prev, *cur, *next;  ///< previous, current, next frames
 int32_t **work_line;  ///< lines we are calculating
 int nb_threads;
+int max;
 
 W3FDIFDSPContext dsp;
 } W3FDIFContext;
@@ -75,6 +76,11 @@ static int query_formats(AVFilterContext *ctx)
 AV_PIX_FMT_YUVA420P, AV_PIX_FMT_YUVA422P, AV_PIX_FMT_YUVA444P,
 AV_PIX_FMT_GBRP, AV_PIX_FMT_GBRAP,
 AV_PIX_FMT_GRAY8,
+AV_PIX_FMT_YUV420P9, AV_PIX_FMT_YUV422P9, AV_PIX_FMT_YUV444P9,
+AV_PIX_FMT_YUV420P10, AV_PIX_FMT_YUV422P10, AV_PIX_FMT_YUV444P10,
+AV_PIX_FMT_YUV420P12, AV_PIX_FMT_YUV422P12, AV_PIX_FMT_YUV444P12,
+AV_PIX_FMT_YUV420P14, AV_PIX_FMT_YUV422P14, AV_PIX_FMT_YUV444P14,
+AV_PIX_FMT_GBRP9, AV_PIX_FMT_GBRP10, AV_PIX_FMT_GBRP12, 
AV_PIX_FMT_GBRP14,
 AV_PIX_FMT_NONE
 };
 
@@ -148,7 +154,7 @@ static void filter_complex_high(int32_t *work_line,
 }
 }
 
-static void filter_scale(uint8_t *out_pixel, const int32_t *work_pixel, int 
linesize)
+static void filter_scale(uint8_t *out_pixel, const int32_t *work_pixel, int 
linesize, int max)
 {
 int j;
 
@@ -156,12 +162,111 @@ static void filter_scale(uint8_t *out_pixel, const 
int32_t *work_pixel, int line
 *out_pixel = av_clip(*work_pixel, 0, 255 * 256 * 128) >> 15;
 }
 
+static void filter16_simple_low(int32_t *work_line,
+uint8_t *in_lines_cur8[2],
+const int16_t *coef, int linesize)
+{
+uint16_t *in_lines_cur[2] = { (uint16_t *)in_lines_cur8[0], (uint16_t 
*)in_lines_cur8[1] };
+int i;
+
+linesize /= 2;
+for (i = 0; i < linesize; i++) {
+*work_line= *in_lines_cur[0]++ * coef[0];
+*work_line++ += *in_lines_cur[1]++ * coef[1];
+}
+}
+
+static void filter16_complex_low(int32_t *work_line,
+ uint8_t *in_lines_cur8[4],
+ const int16_t *coef, int linesize)
+{
+uint16_t *in_lines_cur[4] = { (uint16_t *)in_lines_cur8[0],
+  (uint16_t *)in_lines_cur8[1],
+  (uint16_t *)in_lines_cur8[2],
+  (uint16_t *)in_lines_cur8[3] };
+int i;
+
+linesize /= 2;
+for (i = 0; i < linesize; i++) {
+*work_line= *in_lines_cur[0]++ * coef[0];
+*work_line   += *in_lines_cur[1]++ * coef[1];
+*work_line   += *in_lines_cur[2]++ * coef[2];
+*work_line++ += *in_lines_cur[3]++ * coef[3];
+}
+}
+
+static void filter16_simple_high(int32_t *work_line,
+ uint8_t *in_lines_cur8[3],
+ uint8_t *in_lines_adj8[3],
+ const int16_t *coef, int linesize)
+{
+uint16_t *in_lines_cur[3] = { (uint16_t *)in_lines_cur8[0],
+  (uint16_t *)in_lines_cur8[1],
+  (uint16_t *)in_lines_cur8[2] };
+uint16_t *in_lines_adj[3] = { (uint16_t *)in_lines_adj8[0],
+  (uint16_t *)in_lines_adj8[1],
+  (uint16_t *)in_lines_adj8[2] };
+int i;
+
+linesize /= 2;
+for (i = 0; i < linesize; i++) {
+*work_line   += *in_lines_cur[0]++ * coef[0];
+*work_line   += *in_lines_adj[0]++ * coef[0];
+*work_line   += *in_lines_cur[1]++ * coef[1];
+*work_line   += *in_lines_adj[1]++ * coef[1];
+*work_line   += *in_lines_cur[2]++ * coef[2];
+*work_line++ += *in_lines_adj[2]++ * coef[2];
+}
+}
+
+static void filter16_complex_high(int32_t *work_line,
+  uint8_t *in_lines_cur8[5],
+  uint8_t *in_lines_adj8[5],
+  const int16_t *coef, int linesize)
+{
+uint16_t *in_lines_cur[5] = { (uint16_t *)in_lines_cur8[0],
+  (uint16_t *)in_lines_cur8[1],
+  (uint16_t *)in_lines_cur8[2],
+  (uint16_t *)in_lines_cur8[3],
+  (uint16_t *)in_lines_cur8[4] };
+uint16_t *in_lines_adj[5] = { (uint16_t *)in_lines_adj8[0],
+  (uint16_t *)in_lines_adj8[1],
+  (uint16_t *)in_lines_adj8[2],
+  (uint16_t *)in_lines_adj8[3],
+  (uint16_t *)in_lines_adj8[4] };
+int i;
+
+linesize /=